diff options
Diffstat (limited to 'services/incremental')
-rw-r--r-- | services/incremental/IncrementalService.cpp | 27 | ||||
-rw-r--r-- | services/incremental/ServiceWrappers.cpp | 6 | ||||
-rw-r--r-- | services/incremental/ServiceWrappers.h | 3 | ||||
-rw-r--r-- | services/incremental/test/IncrementalServiceTest.cpp | 15 |
4 files changed, 42 insertions, 9 deletions
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index f3e7d672ec95..de8c8bc94568 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -411,6 +411,8 @@ void IncrementalService::onDump(int fd) { } else { dprintf(fd, " mountId: %d\n", mnt.mountId); dprintf(fd, " root: %s\n", mnt.root.c_str()); + const auto metricsInstanceName = path::basename(ifs->root); + dprintf(fd, " metrics instance name: %s\n", path::c_str(metricsInstanceName).get()); dprintf(fd, " nextStorageDirNo: %d\n", mnt.nextStorageDirNo.load()); dprintf(fd, " flags: %d\n", int(mnt.flags)); if (mnt.startLoadingTs.time_since_epoch() == Clock::duration::zero()) { @@ -440,6 +442,26 @@ void IncrementalService::onDump(int fd) { dprintf(fd, " kind: %s\n", toString(bind.kind)); } dprintf(fd, " }\n"); + + dprintf(fd, " incfsMetrics: {\n"); + const auto incfsMetrics = mIncFs->getMetrics(metricsInstanceName); + if (incfsMetrics) { + dprintf(fd, " readsDelayedMin: %d\n", incfsMetrics.value().readsDelayedMin); + dprintf(fd, " readsDelayedMinUs: %lld\n", + (long long)incfsMetrics.value().readsDelayedMinUs); + dprintf(fd, " readsDelayedPending: %d\n", + incfsMetrics.value().readsDelayedPending); + dprintf(fd, " readsDelayedPendingUs: %lld\n", + (long long)incfsMetrics.value().readsDelayedPendingUs); + dprintf(fd, " readsFailedHashVerification: %d\n", + incfsMetrics.value().readsFailedHashVerification); + dprintf(fd, " readsFailedOther: %d\n", incfsMetrics.value().readsFailedOther); + dprintf(fd, " readsFailedTimedOut: %d\n", + incfsMetrics.value().readsFailedTimedOut); + } else { + dprintf(fd, " Metrics not available. Errno: %d\n", errno); + } + dprintf(fd, " }\n"); } dprintf(fd, " }\n"); } @@ -578,7 +600,7 @@ StorageId IncrementalService::createStorage(std::string_view mountPoint, if (!mkdirOrLog(path::join(backing, ".incomplete"), 0777)) { return kInvalidStorageId; } - auto status = mVold->mountIncFs(backing, mountTarget, 0, &controlParcel); + auto status = mVold->mountIncFs(backing, mountTarget, 0, mountKey, &controlParcel); if (!status.isOk()) { LOG(ERROR) << "Vold::mountIncFs() failed: " << status.toString8(); return kInvalidStorageId; @@ -1586,9 +1608,10 @@ void IncrementalService::mountExistingImages( bool IncrementalService::mountExistingImage(std::string_view root) { auto mountTarget = path::join(root, constants().mount); const auto backing = path::join(root, constants().backing); + std::string mountKey(path::basename(path::dirname(mountTarget))); IncrementalFileSystemControlParcel controlParcel; - auto status = mVold->mountIncFs(backing, mountTarget, 0, &controlParcel); + auto status = mVold->mountIncFs(backing, mountTarget, 0, mountKey, &controlParcel); if (!status.isOk()) { LOG(ERROR) << "Vold::mountIncFs() failed: " << status.toString8(); return false; diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp index 0755a22ab2ea..c8e516926531 100644 --- a/services/incremental/ServiceWrappers.cpp +++ b/services/incremental/ServiceWrappers.cpp @@ -43,8 +43,9 @@ public: ~RealVoldService() = default; binder::Status mountIncFs( const std::string& backingPath, const std::string& targetDir, int32_t flags, + const std::string& sysfsName, os::incremental::IncrementalFileSystemControlParcel* _aidl_return) const final { - return mInterface->mountIncFs(backingPath, targetDir, flags, _aidl_return); + return mInterface->mountIncFs(backingPath, targetDir, flags, sysfsName, _aidl_return); } binder::Status unmountIncFs(const std::string& dir) const final { return mInterface->unmountIncFs(dir); @@ -261,6 +262,9 @@ public: return cb(control, id); }); } + std::optional<Metrics> getMetrics(std::string_view sysfsName) const final { + return incfs::getMetrics(sysfsName); + } }; static JNIEnv* getOrAttachJniEnv(JavaVM* jvm); diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h index 78e9589e63ff..3c969e514566 100644 --- a/services/incremental/ServiceWrappers.h +++ b/services/incremental/ServiceWrappers.h @@ -51,6 +51,7 @@ public: virtual ~VoldServiceWrapper() = default; virtual binder::Status mountIncFs( const std::string& backingPath, const std::string& targetDir, int32_t flags, + const std::string& sysfsName, os::incremental::IncrementalFileSystemControlParcel* result) const = 0; virtual binder::Status unmountIncFs(const std::string& dir) const = 0; virtual binder::Status bindMount(const std::string& sourceDir, @@ -79,6 +80,7 @@ public: using UniqueFd = incfs::UniqueFd; using WaitResult = incfs::WaitResult; using Features = incfs::Features; + using Metrics = incfs::Metrics; using ExistingMountCallback = android::base::function_ref< void(std::string_view root, std::string_view backingDir, @@ -124,6 +126,7 @@ public: const = 0; 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; }; class AppOpsManagerWrapper { diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp index 68586a89ff07..766f713a7d19 100644 --- a/services/incremental/test/IncrementalServiceTest.cpp +++ b/services/incremental/test/IncrementalServiceTest.cpp @@ -49,9 +49,9 @@ namespace android::os::incremental { class MockVoldService : public VoldServiceWrapper { public: - MOCK_CONST_METHOD4(mountIncFs, + MOCK_CONST_METHOD5(mountIncFs, binder::Status(const std::string& backingPath, const std::string& targetDir, - int32_t flags, + int32_t flags, const std::string& sysfsName, IncrementalFileSystemControlParcel* _aidl_return)); MOCK_CONST_METHOD1(unmountIncFs, binder::Status(const std::string& dir)); MOCK_CONST_METHOD2(bindMount, @@ -62,16 +62,16 @@ public: bool, bool)); void mountIncFsFails() { - ON_CALL(*this, mountIncFs(_, _, _, _)) + ON_CALL(*this, mountIncFs(_, _, _, _, _)) .WillByDefault( Return(binder::Status::fromExceptionCode(1, String8("failed to mount")))); } void mountIncFsInvalidControlParcel() { - ON_CALL(*this, mountIncFs(_, _, _, _)) + ON_CALL(*this, mountIncFs(_, _, _, _, _)) .WillByDefault(Invoke(this, &MockVoldService::getInvalidControlParcel)); } void mountIncFsSuccess() { - ON_CALL(*this, mountIncFs(_, _, _, _)) + ON_CALL(*this, mountIncFs(_, _, _, _, _)) .WillByDefault(Invoke(this, &MockVoldService::incFsSuccess)); } void bindMountFails() { @@ -93,12 +93,14 @@ public: } binder::Status getInvalidControlParcel(const std::string& imagePath, const std::string& targetDir, int32_t flags, + const std::string& sysfsName, IncrementalFileSystemControlParcel* _aidl_return) { _aidl_return = {}; return binder::Status::ok(); } binder::Status incFsSuccess(const std::string& imagePath, const std::string& targetDir, - int32_t flags, IncrementalFileSystemControlParcel* _aidl_return) { + int32_t flags, const std::string& sysfsName, + IncrementalFileSystemControlParcel* _aidl_return) { _aidl_return->pendingReads.reset(base::unique_fd(dup(STDIN_FILENO))); _aidl_return->cmd.reset(base::unique_fd(dup(STDIN_FILENO))); _aidl_return->log.reset(base::unique_fd(dup(STDIN_FILENO))); @@ -414,6 +416,7 @@ public: const std::vector<PerUidReadTimeouts>& perUidReadTimeouts)); 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)); MockIncFs() { ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return()); |