summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
author Songchun Fan <schfan@google.com> 2021-05-04 04:56:04 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-05-04 04:56:04 +0000
commit30253adb74b1e9e37f4a1286a7762e84d0245bca (patch)
treeab17a48f10944f4d31134dd3a9811282c2e05a42 /services
parentd8f57c7cf37298beb7792629acc88d608dd0b838 (diff)
parentd48a25ee649b9aa2e6dde6e0e9844bb7da8bfe5c (diff)
Merge "[IncrementalService] add last read error in dumpsys" into sc-dev
Diffstat (limited to 'services')
-rw-r--r--services/incremental/IncrementalService.cpp28
-rw-r--r--services/incremental/ServiceWrappers.cpp3
-rw-r--r--services/incremental/ServiceWrappers.h2
-rw-r--r--services/incremental/test/IncrementalServiceTest.cpp1
4 files changed, 34 insertions, 0 deletions
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 9d47a4e462d2..36c0a677f43a 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -398,6 +398,15 @@ static long elapsedMcs(Duration start, Duration end) {
return std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
}
+static uint64_t elapsedUsSinceMonoTs(uint64_t monoTsUs) {
+ timespec now;
+ if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) {
+ return 0;
+ }
+ uint64_t nowUs = now.tv_sec * 1000000LL + now.tv_nsec / 1000;
+ return nowUs - monoTsUs;
+}
+
void IncrementalService::onDump(int fd) {
dprintf(fd, "Incremental is %s\n", incfs::enabled() ? "ENABLED" : "DISABLED");
dprintf(fd, "IncFs features: 0x%x\n", int(mIncFs->features()));
@@ -466,6 +475,25 @@ void IncrementalService::onDump(int fd) {
dprintf(fd, " Metrics not available. Errno: %d\n", errno);
}
dprintf(fd, " }\n");
+
+ const auto lastReadError = mIncFs->getLastReadError(ifs->control);
+ const auto errorNo = errno;
+ dprintf(fd, " lastReadError: {\n");
+ if (lastReadError) {
+ if (lastReadError->timestampUs == 0) {
+ dprintf(fd, " No read errors.\n");
+ } else {
+ dprintf(fd, " fileId: %s\n",
+ IncFsWrapper::toString(lastReadError->id).c_str());
+ dprintf(fd, " time: %llu microseconds ago\n",
+ (unsigned long long)elapsedUsSinceMonoTs(lastReadError->timestampUs));
+ dprintf(fd, " blockIndex: %d\n", lastReadError->block);
+ dprintf(fd, " errno: %d\n", lastReadError->errorNo);
+ }
+ } else {
+ dprintf(fd, " Info not available. Errno: %d\n", errorNo);
+ }
+ dprintf(fd, " }\n");
}
dprintf(fd, " }\n");
}
diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp
index c8e516926531..68a28b25b2a4 100644
--- a/services/incremental/ServiceWrappers.cpp
+++ b/services/incremental/ServiceWrappers.cpp
@@ -265,6 +265,9 @@ public:
std::optional<Metrics> getMetrics(std::string_view sysfsName) const final {
return incfs::getMetrics(sysfsName);
}
+ std::optional<LastReadError> getLastReadError(const Control& control) const final {
+ return incfs::getLastReadError(control);
+ }
};
static JNIEnv* getOrAttachJniEnv(JavaVM* jvm);
diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h
index 3c969e514566..c0ef7ba5c85b 100644
--- a/services/incremental/ServiceWrappers.h
+++ b/services/incremental/ServiceWrappers.h
@@ -81,6 +81,7 @@ public:
using WaitResult = incfs::WaitResult;
using Features = incfs::Features;
using Metrics = incfs::Metrics;
+ using LastReadError = incfs::LastReadError;
using ExistingMountCallback = android::base::function_ref<
void(std::string_view root, std::string_view backingDir,
@@ -127,6 +128,7 @@ public:
virtual ErrorCode forEachFile(const Control& control, FileCallback cb) const = 0;
virtual ErrorCode forEachIncompleteFile(const Control& control, FileCallback cb) const = 0;
virtual std::optional<Metrics> getMetrics(std::string_view sysfsName) const = 0;
+ virtual std::optional<LastReadError> getLastReadError(const Control& control) const = 0;
};
class AppOpsManagerWrapper {
diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp
index 766f713a7d19..da7f0db5efc1 100644
--- a/services/incremental/test/IncrementalServiceTest.cpp
+++ b/services/incremental/test/IncrementalServiceTest.cpp
@@ -417,6 +417,7 @@ public:
MOCK_CONST_METHOD2(forEachFile, ErrorCode(const Control& control, FileCallback cb));
MOCK_CONST_METHOD2(forEachIncompleteFile, ErrorCode(const Control& control, FileCallback cb));
MOCK_CONST_METHOD1(getMetrics, std::optional<Metrics>(std::string_view path));
+ MOCK_CONST_METHOD1(getLastReadError, std::optional<LastReadError>(const Control& control));
MockIncFs() {
ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return());