Merge "libsnapshot: Add a merge failure code to SnapshotMergeReport."
This commit is contained in:
commit
d5349dcf6d
9 changed files with 43 additions and 1 deletions
|
|
@ -186,7 +186,7 @@ message SnapshotUpdateStatus {
|
||||||
MergeFailureCode merge_failure_code = 7;
|
MergeFailureCode merge_failure_code = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next: 9
|
// Next: 10
|
||||||
message SnapshotMergeReport {
|
message SnapshotMergeReport {
|
||||||
// Status of the update after the merge attempts.
|
// Status of the update after the merge attempts.
|
||||||
UpdateState state = 1;
|
UpdateState state = 1;
|
||||||
|
|
@ -212,4 +212,7 @@ message SnapshotMergeReport {
|
||||||
|
|
||||||
// Time from sys.boot_completed to merge start, in milliseconds.
|
// Time from sys.boot_completed to merge start, in milliseconds.
|
||||||
uint32 boot_complete_to_merge_start_time_ms = 8;
|
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, CancelUpdate, (), (override));
|
||||||
MOCK_METHOD(bool, FinishedSnapshotWrites, (bool wipe), (override));
|
MOCK_METHOD(bool, FinishedSnapshotWrites, (bool wipe), (override));
|
||||||
MOCK_METHOD(void, UpdateCowStats, (ISnapshotMergeStats * stats), (override));
|
MOCK_METHOD(void, UpdateCowStats, (ISnapshotMergeStats * stats), (override));
|
||||||
|
MOCK_METHOD(MergeFailureCode, ReadMergeFailureCode, (), (override));
|
||||||
MOCK_METHOD(bool, InitiateMerge, (), (override));
|
MOCK_METHOD(bool, InitiateMerge, (), (override));
|
||||||
|
|
||||||
MOCK_METHOD(UpdateState, ProcessUpdateState,
|
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_estimated_cow_size_bytes, (uint64_t), (override));
|
||||||
MOCK_METHOD(void, set_boot_complete_time_ms, (uint32_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_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, cow_file_size, (), (override));
|
||||||
MOCK_METHOD(uint64_t, total_cow_size_bytes, (), (override));
|
MOCK_METHOD(uint64_t, total_cow_size_bytes, (), (override));
|
||||||
MOCK_METHOD(uint64_t, estimated_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_time_ms, (), (override));
|
||||||
MOCK_METHOD(uint32_t, boot_complete_to_merge_start_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));
|
MOCK_METHOD(std::unique_ptr<Result>, Finish, (), (override));
|
||||||
|
|
||||||
using ISnapshotMergeStats::Result;
|
using ISnapshotMergeStats::Result;
|
||||||
|
|
|
||||||
|
|
@ -167,6 +167,10 @@ class ISnapshotManager {
|
||||||
virtual UpdateState ProcessUpdateState(const std::function<bool()>& callback = {},
|
virtual UpdateState ProcessUpdateState(const std::function<bool()>& callback = {},
|
||||||
const std::function<bool()>& before_cancel = {}) = 0;
|
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.
|
// Find the status of the current update, if any.
|
||||||
//
|
//
|
||||||
// |progress| depends on the returned status:
|
// |progress| depends on the returned status:
|
||||||
|
|
@ -332,6 +336,7 @@ class SnapshotManager final : public ISnapshotManager {
|
||||||
bool CancelUpdate() override;
|
bool CancelUpdate() override;
|
||||||
bool FinishedSnapshotWrites(bool wipe) override;
|
bool FinishedSnapshotWrites(bool wipe) override;
|
||||||
void UpdateCowStats(ISnapshotMergeStats* stats) override;
|
void UpdateCowStats(ISnapshotMergeStats* stats) override;
|
||||||
|
MergeFailureCode ReadMergeFailureCode() override;
|
||||||
bool InitiateMerge() override;
|
bool InitiateMerge() override;
|
||||||
UpdateState ProcessUpdateState(const std::function<bool()>& callback = {},
|
UpdateState ProcessUpdateState(const std::function<bool()>& callback = {},
|
||||||
const std::function<bool()>& before_cancel = {}) override;
|
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_estimated_cow_size_bytes(uint64_t bytes) = 0;
|
||||||
virtual void set_boot_complete_time_ms(uint32_t ms) = 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_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 cow_file_size() = 0;
|
||||||
virtual uint64_t total_cow_size_bytes() = 0;
|
virtual uint64_t total_cow_size_bytes() = 0;
|
||||||
virtual uint64_t estimated_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_time_ms() = 0;
|
||||||
virtual uint32_t boot_complete_to_merge_start_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.
|
// Called when merge ends. Properly clean up permanent storage.
|
||||||
class Result {
|
class Result {
|
||||||
|
|
@ -70,6 +72,8 @@ class SnapshotMergeStats : public ISnapshotMergeStats {
|
||||||
uint32_t boot_complete_time_ms() override;
|
uint32_t boot_complete_time_ms() override;
|
||||||
void set_boot_complete_to_merge_start_time_ms(uint32_t 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;
|
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;
|
std::unique_ptr<Result> Finish() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ class SnapshotManagerStub : public ISnapshotManager {
|
||||||
bool CancelUpdate() override;
|
bool CancelUpdate() override;
|
||||||
bool FinishedSnapshotWrites(bool wipe) override;
|
bool FinishedSnapshotWrites(bool wipe) override;
|
||||||
void UpdateCowStats(ISnapshotMergeStats* stats) override;
|
void UpdateCowStats(ISnapshotMergeStats* stats) override;
|
||||||
|
MergeFailureCode ReadMergeFailureCode() override;
|
||||||
bool InitiateMerge() override;
|
bool InitiateMerge() override;
|
||||||
UpdateState ProcessUpdateState(const std::function<bool()>& callback = {},
|
UpdateState ProcessUpdateState(const std::function<bool()>& callback = {},
|
||||||
const std::function<bool()>& before_cancel = {}) override;
|
const std::function<bool()>& before_cancel = {}) override;
|
||||||
|
|
|
||||||
|
|
@ -3690,5 +3690,16 @@ bool SnapshotManager::DeleteDeviceIfExists(const std::string& name,
|
||||||
return false;
|
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 snapshot
|
||||||
} // namespace android
|
} // 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();
|
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 {
|
class SnapshotMergeStatsResultImpl : public SnapshotMergeStats::Result {
|
||||||
public:
|
public:
|
||||||
SnapshotMergeStatsResultImpl(const SnapshotMergeReport& report,
|
SnapshotMergeStatsResultImpl(const SnapshotMergeReport& report,
|
||||||
|
|
|
||||||
|
|
@ -135,6 +135,8 @@ class SnapshotMergeStatsStub : public ISnapshotMergeStats {
|
||||||
uint32_t boot_complete_time_ms() override { return 0; }
|
uint32_t boot_complete_time_ms() override { return 0; }
|
||||||
void set_boot_complete_to_merge_start_time_ms(uint32_t) override {}
|
void set_boot_complete_to_merge_start_time_ms(uint32_t) override {}
|
||||||
uint32_t boot_complete_to_merge_start_time_ms() override { return 0; }
|
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() {
|
ISnapshotMergeStats* SnapshotManagerStub::GetSnapshotMergeStatsInstance() {
|
||||||
|
|
@ -163,4 +165,9 @@ void SnapshotManagerStub::UpdateCowStats(ISnapshotMergeStats*) {
|
||||||
LOG(ERROR) << __FUNCTION__ << " should never be called.";
|
LOG(ERROR) << __FUNCTION__ << " should never be called.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto SnapshotManagerStub::ReadMergeFailureCode() -> MergeFailureCode {
|
||||||
|
LOG(ERROR) << __FUNCTION__ << " should never be called.";
|
||||||
|
return MergeFailureCode::Ok;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace android::snapshot
|
} // namespace android::snapshot
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue