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

Commit b94353ca authored by Akilesh Kailash's avatar Akilesh Kailash
Browse files

snapuserd: API to query snapshot and merge status



Add new API to query the snapshot and merge status.
This will be used by libsnapshot.

Bug: 193863443
Test: Full OTA on CF
Signed-off-by: default avatarAkilesh Kailash <akailash@google.com>
Change-Id: I86cffff6a979e2e2bf1d8d1a1770e209eeb4a47d
parent ff590a80
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -85,6 +85,9 @@ class SnapuserdClient {

    // Returns Merge completion percentage
    double GetMergePercent();

    // Return the status of the snapshot
    std::string QuerySnapshotStatus(const std::string& misc_name);
};

}  // namespace snapshot
+9 −0
Original line number Diff line number Diff line
@@ -252,5 +252,14 @@ double SnapuserdClient::GetMergePercent() {
    return std::stod(response);
}

std::string SnapuserdClient::QuerySnapshotStatus(const std::string& misc_name) {
    std::string msg = "getstatus," + misc_name;
    if (!Sendmsg(msg)) {
        LOG(ERROR) << "Failed to send message " << msg << " to snapuserd";
        return "snapshot-merge-failed";
    }
    return Receivemsg();
}

}  // namespace snapshot
}  // namespace android
+2 −0
Original line number Diff line number Diff line
@@ -268,6 +268,8 @@ class SnapshotHandler : public std::enable_shared_from_this<SnapshotHandler> {

    bool ShouldReconstructDataFromCow() { return populate_data_from_cow_; }
    void FinishReconstructDataFromCow() { populate_data_from_cow_ = false; }
    // Return the snapshot status
    std::string GetMergeStatus();

    // RA related functions
    uint64_t GetBufferMetadataOffset();
+24 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ DaemonOps SnapuserServer::Resolveop(std::string& input) {
    if (input == "supports") return DaemonOps::SUPPORTS;
    if (input == "initiate_merge") return DaemonOps::INITIATE;
    if (input == "merge_percent") return DaemonOps::PERCENTAGE;
    if (input == "getstatus") return DaemonOps::GETSTATUS;

    return DaemonOps::INVALID;
}
@@ -262,6 +263,25 @@ bool SnapuserServer::Receivemsg(android::base::borrowed_fd fd, const std::string

            return Sendmsg(fd, std::to_string(percentage));
        }
        case DaemonOps::GETSTATUS: {
            // Message format:
            // getstatus,<misc_name>
            if (out.size() != 2) {
                LOG(ERROR) << "Malformed delete message, " << out.size() << " parts";
                return Sendmsg(fd, "snapshot-merge-failed");
            }
            {
                std::lock_guard<std::mutex> lock(lock_);
                auto iter = FindHandler(&lock, out[1]);
                if (iter == dm_users_.end()) {
                    LOG(ERROR) << "Could not find handler: " << out[1];
                    return Sendmsg(fd, "snapshot-merge-failed");
                }

                std::string merge_status = GetMergeStatus(*iter);
                return Sendmsg(fd, merge_status);
            }
        }
        default: {
            LOG(ERROR) << "Received unknown message type from client";
            Sendmsg(fd, "fail");
@@ -513,6 +533,10 @@ void SnapuserServer::TerminateMergeThreads(std::lock_guard<std::mutex>* proof_of
    }
}

std::string SnapuserServer::GetMergeStatus(const std::shared_ptr<DmUserHandler>& handler) {
    return handler->snapuserd()->GetMergeStatus();
}

double SnapuserServer::GetMergePercentage(std::lock_guard<std::mutex>* proof_of_lock) {
    CHECK(proof_of_lock);
    double percentage = 0.0;
+2 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ enum class DaemonOps {
    SUPPORTS,
    INITIATE,
    PERCENTAGE,
    GETSTATUS,
    INVALID,
};

@@ -131,6 +132,7 @@ class SnapuserServer {
                                              const std::string& base_path_merge);
    bool StartHandler(const std::shared_ptr<DmUserHandler>& handler);
    bool StartMerge(const std::shared_ptr<DmUserHandler>& handler);
    std::string GetMergeStatus(const std::shared_ptr<DmUserHandler>& handler);

    void SetTerminating() { terminating_ = true; }
    void ReceivedSocketSignal() { received_socket_signal_ = true; }
Loading