Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f949c37e authored by Songchun Fan's avatar Songchun Fan
Browse files

[IncrementalService] use sysfs_name in mount options and dumpsys

BUG: 184844615
Test: adb shell dumpsys incremental
Change-Id: Ib6bbbede6d4fbed0bcef8d37f377e706b9d1af28
parent a2bbcf95
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -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;
+5 −1
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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 {
+9 −6
Original line number Diff line number Diff line
@@ -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());