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

Commit e00a5670 authored by David Anderson's avatar David Anderson
Browse files

libsnapshot: Add a source build fingerprint to the update state.

Bug: 188909957
Test: manual test
Change-Id: I9aa155eee25dd49f48baede4f0a2e4ab2ab76980
Merged-In: I9aa155eee25dd49f48baede4f0a2e4ab2ab76980
parent bfa4e30b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -191,6 +191,9 @@ message SnapshotUpdateStatus {

    // Merge failure code, filled if state == MergeFailed.
    MergeFailureCode merge_failure_code = 7;

    // Source build fingerprint.
    string source_build_fingerprint = 8;
}

// Next: 10
@@ -222,4 +225,7 @@ message SnapshotMergeReport {

    // Merge failure code, filled if state == MergeFailed.
    MergeFailureCode merge_failure_code = 9;

    // The source fingerprint at the time the OTA was downloaded.
    string source_build_fingerprint = 10;
}
+1 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ class MockSnapshotManager : public ISnapshotManager {
    MOCK_METHOD(bool, Dump, (std::ostream & os), (override));
    MOCK_METHOD(std::unique_ptr<AutoDevice>, EnsureMetadataMounted, (), (override));
    MOCK_METHOD(ISnapshotMergeStats*, GetSnapshotMergeStatsInstance, (), (override));
    MOCK_METHOD(std::string, ReadSourceBuildFingerprint, (), (override));
};

}  // namespace android::snapshot
+3 −0
Original line number Diff line number Diff line
@@ -35,13 +35,16 @@ class MockSnapshotMergeStats final : public ISnapshotMergeStats {
    MOCK_METHOD(void, set_boot_complete_time_ms, (uint32_t), (override));
    MOCK_METHOD(void, set_boot_complete_to_merge_start_time_ms, (uint32_t), (override));
    MOCK_METHOD(void, set_merge_failure_code, (MergeFailureCode), (override));
    MOCK_METHOD(void, set_source_build_fingerprint, (const std::string&), (override));
    MOCK_METHOD(uint64_t, cow_file_size, (), (override));
    MOCK_METHOD(uint64_t, total_cow_size_bytes, (), (override));
    MOCK_METHOD(uint64_t, estimated_cow_size_bytes, (), (override));
    MOCK_METHOD(uint32_t, boot_complete_time_ms, (), (override));
    MOCK_METHOD(uint32_t, boot_complete_to_merge_start_time_ms, (), (override));
    MOCK_METHOD(std::string, source_build_fingerprint, (), (override));
    MOCK_METHOD(MergeFailureCode, merge_failure_code, (), (override));
    MOCK_METHOD(std::unique_ptr<Result>, Finish, (), (override));
    MOCK_METHOD(bool, WriteState, (), (override));

    using ISnapshotMergeStats::Result;
    // Return nullptr if any failure.
+4 −0
Original line number Diff line number Diff line
@@ -177,6 +177,9 @@ class ISnapshotManager {
    // code. Otherwise, MergeFailureCode::Ok is returned.
    virtual MergeFailureCode ReadMergeFailureCode() = 0;

    // If an update is in progress, return the source build fingerprint.
    virtual std::string ReadSourceBuildFingerprint() = 0;

    // Find the status of the current update, if any.
    //
    // |progress| depends on the returned status:
@@ -369,6 +372,7 @@ class SnapshotManager final : public ISnapshotManager {
    ISnapshotMergeStats* GetSnapshotMergeStatsInstance() override;
    bool MapAllSnapshots(const std::chrono::milliseconds& timeout_ms = {}) override;
    bool UnmapAllSnapshots() override;
    std::string ReadSourceBuildFingerprint() override;

    // We can't use WaitForFile during first-stage init, because ueventd is not
    // running and therefore will not automatically create symlinks. Instead,
+9 −1
Original line number Diff line number Diff line
@@ -35,12 +35,14 @@ class ISnapshotMergeStats {
    virtual void set_boot_complete_time_ms(uint32_t ms) = 0;
    virtual void set_boot_complete_to_merge_start_time_ms(uint32_t ms) = 0;
    virtual void set_merge_failure_code(MergeFailureCode code) = 0;
    virtual void set_source_build_fingerprint(const std::string& fingerprint) = 0;
    virtual uint64_t cow_file_size() = 0;
    virtual uint64_t total_cow_size_bytes() = 0;
    virtual uint64_t estimated_cow_size_bytes() = 0;
    virtual uint32_t boot_complete_time_ms() = 0;
    virtual uint32_t boot_complete_to_merge_start_time_ms() = 0;
    virtual MergeFailureCode merge_failure_code() = 0;
    virtual std::string source_build_fingerprint() = 0;

    // Called when merge ends. Properly clean up permanent storage.
    class Result {
@@ -52,6 +54,10 @@ class ISnapshotMergeStats {
    };
    // Return nullptr if any failure.
    virtual std::unique_ptr<Result> Finish() = 0;

    // Write out the current state. This should be called when data might be lost that
    // cannot be recovered (eg the COW sizes).
    virtual bool WriteState() = 0;
};

class SnapshotMergeStats : public ISnapshotMergeStats {
@@ -74,11 +80,13 @@ class SnapshotMergeStats : public ISnapshotMergeStats {
    uint32_t boot_complete_to_merge_start_time_ms() override;
    void set_merge_failure_code(MergeFailureCode code) override;
    MergeFailureCode merge_failure_code() override;
    void set_source_build_fingerprint(const std::string& fingerprint) override;
    std::string source_build_fingerprint() override;
    std::unique_ptr<Result> Finish() override;
    bool WriteState() override;

  private:
    bool ReadState();
    bool WriteState();
    bool DeleteState();
    SnapshotMergeStats(const std::string& path);

Loading