Merge "libsnapshot: Add a merge failure code to SnapshotMergeReport."

This commit is contained in:
David Anderson 2021-04-28 19:39:34 +00:00 committed by Gerrit Code Review
commit d5349dcf6d
9 changed files with 43 additions and 1 deletions

View file

@ -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;
}

View file

@ -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,

View file

@ -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<Result>, Finish, (), (override));
using ISnapshotMergeStats::Result;

View file

@ -167,6 +167,10 @@ class ISnapshotManager {
virtual UpdateState ProcessUpdateState(const std::function<bool()>& callback = {},
const std::function<bool()>& 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<bool()>& callback = {},
const std::function<bool()>& before_cancel = {}) override;

View file

@ -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<Result> Finish() override;
private:

View file

@ -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<bool()>& callback = {},
const std::function<bool()>& before_cancel = {}) override;

View file

@ -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

View file

@ -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,

View file

@ -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