Merge "libsnapshot: Add a merge failure code to SnapshotMergeReport." am: d5349dcf6d
Original change: https://android-review.googlesource.com/c/platform/system/core/+/1676193 Change-Id: Idf9ae2499807ff4ee14947db7c7cdd4bd44fe5ce
This commit is contained in:
commit
94b0b7ac4b
9 changed files with 43 additions and 1 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue