From 57c881ebf0b7e09ecf2a6b5eb37d588f789dab1c Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 14 Apr 2021 19:39:50 -0700 Subject: [PATCH] libsnapshot: Add a merge failure code to SnapshotMergeReport. Bug: 185290850 Test: builds Change-Id: I56e9e4c8943e420163b2c663c0136d37a45455e4 --- fs_mgr/libsnapshot/android/snapshot/snapshot.proto | 5 ++++- .../libsnapshot/include/libsnapshot/mock_snapshot.h | 1 + .../include/libsnapshot/mock_snapshot_merge_stats.h | 2 ++ fs_mgr/libsnapshot/include/libsnapshot/snapshot.h | 5 +++++ .../libsnapshot/include/libsnapshot/snapshot_stats.h | 4 ++++ .../libsnapshot/include/libsnapshot/snapshot_stub.h | 1 + fs_mgr/libsnapshot/snapshot.cpp | 11 +++++++++++ fs_mgr/libsnapshot/snapshot_stats.cpp | 8 ++++++++ fs_mgr/libsnapshot/snapshot_stub.cpp | 7 +++++++ 9 files changed, 43 insertions(+), 1 deletion(-) diff --git a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto index 012f2aee7..92aa55c07 100644 --- a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto +++ b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto @@ -186,7 +186,7 @@ message SnapshotUpdateStatus { MergeFailureCode merge_failure_code = 7; } -// Next: 9 +// Next: 10 message SnapshotMergeReport { // Status of the update after the merge attempts. UpdateState state = 1; @@ -212,4 +212,7 @@ message SnapshotMergeReport { // Time from sys.boot_completed to merge start, in milliseconds. uint32 boot_complete_to_merge_start_time_ms = 8; + + // Merge failure code, filled if state == MergeFailed. + MergeFailureCode merge_failure_code = 9; } diff --git a/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h index 1cb966bd4..94d5055c1 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h @@ -27,6 +27,7 @@ class MockSnapshotManager : public ISnapshotManager { MOCK_METHOD(bool, CancelUpdate, (), (override)); MOCK_METHOD(bool, FinishedSnapshotWrites, (bool wipe), (override)); MOCK_METHOD(void, UpdateCowStats, (ISnapshotMergeStats * stats), (override)); + MOCK_METHOD(MergeFailureCode, ReadMergeFailureCode, (), (override)); MOCK_METHOD(bool, InitiateMerge, (), (override)); MOCK_METHOD(UpdateState, ProcessUpdateState, diff --git a/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot_merge_stats.h b/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot_merge_stats.h index ac2c7873c..067f99c5c 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot_merge_stats.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot_merge_stats.h @@ -34,11 +34,13 @@ class MockSnapshotMergeStats final : public ISnapshotMergeStats { MOCK_METHOD(void, set_estimated_cow_size_bytes, (uint64_t), (override)); 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(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(MergeFailureCode, merge_failure_code, (), (override)); MOCK_METHOD(std::unique_ptr, Finish, (), (override)); using ISnapshotMergeStats::Result; diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 81cb64058..195b6f2ba 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -167,6 +167,10 @@ class ISnapshotManager { virtual UpdateState ProcessUpdateState(const std::function& callback = {}, const std::function& before_cancel = {}) = 0; + // If ProcessUpdateState() returned MergeFailed, this returns the appropriate + // code. Otherwise, MergeFailureCode::Ok is returned. + virtual MergeFailureCode ReadMergeFailureCode() = 0; + // Find the status of the current update, if any. // // |progress| depends on the returned status: @@ -332,6 +336,7 @@ class SnapshotManager final : public ISnapshotManager { bool CancelUpdate() override; bool FinishedSnapshotWrites(bool wipe) override; void UpdateCowStats(ISnapshotMergeStats* stats) override; + MergeFailureCode ReadMergeFailureCode() override; bool InitiateMerge() override; UpdateState ProcessUpdateState(const std::function& callback = {}, const std::function& before_cancel = {}) override; diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h index e617d7a18..4ce50778d 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h @@ -34,11 +34,13 @@ class ISnapshotMergeStats { virtual void set_estimated_cow_size_bytes(uint64_t bytes) = 0; 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 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; // Called when merge ends. Properly clean up permanent storage. class Result { @@ -70,6 +72,8 @@ class SnapshotMergeStats : public ISnapshotMergeStats { uint32_t boot_complete_time_ms() override; void set_boot_complete_to_merge_start_time_ms(uint32_t ms) override; uint32_t boot_complete_to_merge_start_time_ms() override; + void set_merge_failure_code(MergeFailureCode code) override; + MergeFailureCode merge_failure_code() override; std::unique_ptr Finish() override; private: diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h index cc75db840..a7cd939b5 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h @@ -29,6 +29,7 @@ class SnapshotManagerStub : public ISnapshotManager { bool CancelUpdate() override; bool FinishedSnapshotWrites(bool wipe) override; void UpdateCowStats(ISnapshotMergeStats* stats) override; + MergeFailureCode ReadMergeFailureCode() override; bool InitiateMerge() override; UpdateState ProcessUpdateState(const std::function& callback = {}, const std::function& before_cancel = {}) override; diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 64a434c4e..567eb26b3 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -3690,5 +3690,16 @@ bool SnapshotManager::DeleteDeviceIfExists(const std::string& name, return false; } +MergeFailureCode SnapshotManager::ReadMergeFailureCode() { + auto lock = LockExclusive(); + if (!lock) return MergeFailureCode::AcquireLock; + + SnapshotUpdateStatus status = ReadSnapshotUpdateStatus(lock.get()); + if (status.state() != UpdateState::MergeFailed) { + return MergeFailureCode::Ok; + } + return status.merge_failure_code(); +} + } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/snapshot_stats.cpp b/fs_mgr/libsnapshot/snapshot_stats.cpp index 7fcfcea02..4a93d655e 100644 --- a/fs_mgr/libsnapshot/snapshot_stats.cpp +++ b/fs_mgr/libsnapshot/snapshot_stats.cpp @@ -130,6 +130,14 @@ uint32_t SnapshotMergeStats::boot_complete_to_merge_start_time_ms() { return report_.boot_complete_to_merge_start_time_ms(); } +void SnapshotMergeStats::set_merge_failure_code(MergeFailureCode code) { + report_.set_merge_failure_code(code); +} + +MergeFailureCode SnapshotMergeStats::merge_failure_code() { + return report_.merge_failure_code(); +} + class SnapshotMergeStatsResultImpl : public SnapshotMergeStats::Result { public: SnapshotMergeStatsResultImpl(const SnapshotMergeReport& report, diff --git a/fs_mgr/libsnapshot/snapshot_stub.cpp b/fs_mgr/libsnapshot/snapshot_stub.cpp index 43825ccc9..1a9eda5e6 100644 --- a/fs_mgr/libsnapshot/snapshot_stub.cpp +++ b/fs_mgr/libsnapshot/snapshot_stub.cpp @@ -135,6 +135,8 @@ class SnapshotMergeStatsStub : public ISnapshotMergeStats { uint32_t boot_complete_time_ms() override { return 0; } void set_boot_complete_to_merge_start_time_ms(uint32_t) override {} uint32_t boot_complete_to_merge_start_time_ms() override { return 0; } + void set_merge_failure_code(MergeFailureCode) override {} + MergeFailureCode merge_failure_code() { return MergeFailureCode::Ok; } }; ISnapshotMergeStats* SnapshotManagerStub::GetSnapshotMergeStatsInstance() { @@ -163,4 +165,9 @@ void SnapshotManagerStub::UpdateCowStats(ISnapshotMergeStats*) { LOG(ERROR) << __FUNCTION__ << " should never be called."; } +auto SnapshotManagerStub::ReadMergeFailureCode() -> MergeFailureCode { + LOG(ERROR) << __FUNCTION__ << " should never be called."; + return MergeFailureCode::Ok; +} + } // namespace android::snapshot