Loading services/incremental/IncrementalService.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -415,6 +415,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()) { Loading Loading @@ -444,6 +446,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"); } Loading Loading @@ -582,7 +604,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; Loading Loading @@ -1590,9 +1612,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; Loading services/incremental/ServiceWrappers.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading services/incremental/ServiceWrappers.h +3 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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 { Loading services/incremental/test/IncrementalServiceTest.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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() { Loading @@ -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))); Loading Loading @@ -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()); Loading Loading
services/incremental/IncrementalService.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -415,6 +415,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()) { Loading Loading @@ -444,6 +446,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"); } Loading Loading @@ -582,7 +604,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; Loading Loading @@ -1590,9 +1612,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; Loading
services/incremental/ServiceWrappers.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading
services/incremental/ServiceWrappers.h +3 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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 { Loading
services/incremental/test/IncrementalServiceTest.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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() { Loading @@ -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))); Loading Loading @@ -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()); Loading