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

Commit 27a825f1 authored by Akilesh Kailash's avatar Akilesh Kailash
Browse files

libsnapuserd: Pause/Resume Snapshot merge



Add API to support pause and resume of snapshot merge

Bug: 386142969
Test: Reboot device when snapshot merge is in progress
Change-Id: I6d1e36895a6b1b14a4e915d16afbd844a14f6175
Signed-off-by: default avatarAkilesh Kailash <akailash@google.com>
parent 71ee8d0b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -108,6 +108,9 @@ class SnapuserdClient {

    // Notify init that snapuserd daemon is ready post selinux transition
    void NotifyTransitionDaemonIsReady();

    // Pause Merge threads
    bool PauseMerge();
};

}  // namespace snapshot
+9 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ bool EnsureSnapuserdStarted() {
            return false;
        }
    }

    if (!android::base::WaitForProperty("snapuserd.ready", "true", 10s)) {
        LOG(ERROR) << "Timed out waiting for snapuserd to be ready.";
        return false;
@@ -389,5 +390,13 @@ void SnapuserdClient::NotifyTransitionDaemonIsReady() {
    }
}

bool SnapuserdClient::PauseMerge() {
    if (!Sendmsg("pause_merge")) {
        LOG(ERROR) << "Failed to pause snapshot merge.";
        return false;
    }
    return true;
}

}  // namespace snapshot
}  // namespace android
+20 −0
Original line number Diff line number Diff line
@@ -383,5 +383,25 @@ auto SnapshotHandlerManager::FindHandler(std::lock_guard<std::mutex>* proof_of_l
    return dm_users_.end();
}

void SnapshotHandlerManager::PauseMerge() {
    std::lock_guard<std::mutex> guard(lock_);

    for (auto iter = dm_users_.begin(); iter != dm_users_.end(); iter++) {
        if (!(*iter)->ThreadTerminated()) {
            (*iter)->snapuserd()->PauseMergeThreads();
        }
    }
}

void SnapshotHandlerManager::ResumeMerge() {
    std::lock_guard<std::mutex> guard(lock_);

    for (auto iter = dm_users_.begin(); iter != dm_users_.end(); iter++) {
        if (!(*iter)->ThreadTerminated()) {
            (*iter)->snapuserd()->ResumeMergeThreads();
        }
    }
}

}  // namespace snapshot
}  // namespace android
+8 −0
Original line number Diff line number Diff line
@@ -86,6 +86,12 @@ class ISnapshotHandlerManager {

    // Disable partition verification
    virtual void DisableVerification() = 0;

    // Pause Merge threads
    virtual void PauseMerge() = 0;

    // Resume Merge threads
    virtual void ResumeMerge() = 0;
};

class SnapshotHandlerManager final : public ISnapshotHandlerManager {
@@ -107,6 +113,8 @@ class SnapshotHandlerManager final : public ISnapshotHandlerManager {
    double GetMergePercentage() override;
    bool GetVerificationStatus() override;
    void DisableVerification() override { perform_verification_ = false; }
    void PauseMerge() override;
    void ResumeMerge() override;

  private:
    bool StartHandler(const std::shared_ptr<HandlerThread>& handler);
+3 −0
Original line number Diff line number Diff line
@@ -191,6 +191,9 @@ bool MergeWorker::MergeReplaceZeroOps() {
                               "down merge";
            return false;
        }

        // Safe to check if there is a pause request.
        snapuserd_->PauseMergeIfRequired();
    }

    // Any left over ops not flushed yet.
Loading