Skip to content

Commit d308a5a

Browse files
dvandercorpAndroid (Google) Code Review
authored and
Android (Google) Code Review
committed
Merge "libsnapshot: Add a source build fingerprint to the update state." into sc-dev
2 parents cc25244 + e00a567 commit d308a5a

File tree

9 files changed

+68
-10
lines changed

9 files changed

+68
-10
lines changed

fs_mgr/libsnapshot/android/snapshot/snapshot.proto

+6
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ message SnapshotUpdateStatus {
191191

192192
// Merge failure code, filled if state == MergeFailed.
193193
MergeFailureCode merge_failure_code = 7;
194+
195+
// Source build fingerprint.
196+
string source_build_fingerprint = 8;
194197
}
195198

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

223226
// Merge failure code, filled if state == MergeFailed.
224227
MergeFailureCode merge_failure_code = 9;
228+
229+
// The source fingerprint at the time the OTA was downloaded.
230+
string source_build_fingerprint = 10;
225231
}

fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class MockSnapshotManager : public ISnapshotManager {
6060
MOCK_METHOD(bool, Dump, (std::ostream & os), (override));
6161
MOCK_METHOD(std::unique_ptr<AutoDevice>, EnsureMetadataMounted, (), (override));
6262
MOCK_METHOD(ISnapshotMergeStats*, GetSnapshotMergeStatsInstance, (), (override));
63+
MOCK_METHOD(std::string, ReadSourceBuildFingerprint, (), (override));
6364
};
6465

6566
} // namespace android::snapshot

fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot_merge_stats.h

+3
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,16 @@ class MockSnapshotMergeStats final : public ISnapshotMergeStats {
3535
MOCK_METHOD(void, set_boot_complete_time_ms, (uint32_t), (override));
3636
MOCK_METHOD(void, set_boot_complete_to_merge_start_time_ms, (uint32_t), (override));
3737
MOCK_METHOD(void, set_merge_failure_code, (MergeFailureCode), (override));
38+
MOCK_METHOD(void, set_source_build_fingerprint, (const std::string&), (override));
3839
MOCK_METHOD(uint64_t, cow_file_size, (), (override));
3940
MOCK_METHOD(uint64_t, total_cow_size_bytes, (), (override));
4041
MOCK_METHOD(uint64_t, estimated_cow_size_bytes, (), (override));
4142
MOCK_METHOD(uint32_t, boot_complete_time_ms, (), (override));
4243
MOCK_METHOD(uint32_t, boot_complete_to_merge_start_time_ms, (), (override));
44+
MOCK_METHOD(std::string, source_build_fingerprint, (), (override));
4345
MOCK_METHOD(MergeFailureCode, merge_failure_code, (), (override));
4446
MOCK_METHOD(std::unique_ptr<Result>, Finish, (), (override));
47+
MOCK_METHOD(bool, WriteState, (), (override));
4548

4649
using ISnapshotMergeStats::Result;
4750
// Return nullptr if any failure.

fs_mgr/libsnapshot/include/libsnapshot/snapshot.h

+4
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ class ISnapshotManager {
177177
// code. Otherwise, MergeFailureCode::Ok is returned.
178178
virtual MergeFailureCode ReadMergeFailureCode() = 0;
179179

180+
// If an update is in progress, return the source build fingerprint.
181+
virtual std::string ReadSourceBuildFingerprint() = 0;
182+
180183
// Find the status of the current update, if any.
181184
//
182185
// |progress| depends on the returned status:
@@ -369,6 +372,7 @@ class SnapshotManager final : public ISnapshotManager {
369372
ISnapshotMergeStats* GetSnapshotMergeStatsInstance() override;
370373
bool MapAllSnapshots(const std::chrono::milliseconds& timeout_ms = {}) override;
371374
bool UnmapAllSnapshots() override;
375+
std::string ReadSourceBuildFingerprint() override;
372376

373377
// We can't use WaitForFile during first-stage init, because ueventd is not
374378
// running and therefore will not automatically create symlinks. Instead,

fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ class ISnapshotMergeStats {
3535
virtual void set_boot_complete_time_ms(uint32_t ms) = 0;
3636
virtual void set_boot_complete_to_merge_start_time_ms(uint32_t ms) = 0;
3737
virtual void set_merge_failure_code(MergeFailureCode code) = 0;
38+
virtual void set_source_build_fingerprint(const std::string& fingerprint) = 0;
3839
virtual uint64_t cow_file_size() = 0;
3940
virtual uint64_t total_cow_size_bytes() = 0;
4041
virtual uint64_t estimated_cow_size_bytes() = 0;
4142
virtual uint32_t boot_complete_time_ms() = 0;
4243
virtual uint32_t boot_complete_to_merge_start_time_ms() = 0;
4344
virtual MergeFailureCode merge_failure_code() = 0;
45+
virtual std::string source_build_fingerprint() = 0;
4446

4547
// Called when merge ends. Properly clean up permanent storage.
4648
class Result {
@@ -52,6 +54,10 @@ class ISnapshotMergeStats {
5254
};
5355
// Return nullptr if any failure.
5456
virtual std::unique_ptr<Result> Finish() = 0;
57+
58+
// Write out the current state. This should be called when data might be lost that
59+
// cannot be recovered (eg the COW sizes).
60+
virtual bool WriteState() = 0;
5561
};
5662

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

7988
private:
8089
bool ReadState();
81-
bool WriteState();
8290
bool DeleteState();
8391
SnapshotMergeStats(const std::string& path);
8492

fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class SnapshotManagerStub : public ISnapshotManager {
5757
ISnapshotMergeStats* GetSnapshotMergeStatsInstance() override;
5858
bool MapAllSnapshots(const std::chrono::milliseconds& timeout_ms) override;
5959
bool UnmapAllSnapshots() override;
60+
std::string ReadSourceBuildFingerprint() override;
6061
};
6162

6263
} // namespace android::snapshot

fs_mgr/libsnapshot/snapshot.cpp

+27-7
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ bool SnapshotManager::InitiateMerge() {
716716
}
717717
}
718718

719-
SnapshotUpdateStatus initial_status;
719+
SnapshotUpdateStatus initial_status = ReadSnapshotUpdateStatus(lock.get());
720720
initial_status.set_state(UpdateState::Merging);
721721
initial_status.set_sectors_allocated(initial_target_values.sectors_allocated);
722722
initial_status.set_total_sectors(initial_target_values.total_sectors);
@@ -2515,15 +2515,25 @@ bool SnapshotManager::WriteUpdateState(LockedFile* lock, UpdateState state,
25152515
SnapshotUpdateStatus status;
25162516
status.set_state(state);
25172517

2518-
if (state == UpdateState::MergeFailed) {
2519-
status.set_merge_failure_code(failure_code);
2518+
switch (state) {
2519+
case UpdateState::MergeFailed:
2520+
status.set_merge_failure_code(failure_code);
2521+
break;
2522+
case UpdateState::Initiated:
2523+
status.set_source_build_fingerprint(
2524+
android::base::GetProperty("ro.build.fingerprint", ""));
2525+
break;
2526+
default:
2527+
break;
25202528
}
25212529

25222530
// If we're transitioning between two valid states (eg, we're not beginning
2523-
// or ending an OTA), then make sure to propagate the compression bit.
2531+
// or ending an OTA), then make sure to propagate the compression bit and
2532+
// build fingerprint.
25242533
if (!(state == UpdateState::Initiated || state == UpdateState::None)) {
25252534
SnapshotUpdateStatus old_status = ReadSnapshotUpdateStatus(lock);
25262535
status.set_compression_enabled(old_status.compression_enabled());
2536+
status.set_source_build_fingerprint(old_status.source_build_fingerprint());
25272537
}
25282538
return WriteSnapshotUpdateStatus(lock, status);
25292539
}
@@ -2838,7 +2848,7 @@ Return SnapshotManager::CreateUpdateSnapshots(const DeltaArchiveManifest& manife
28382848
}
28392849
}
28402850

2841-
SnapshotUpdateStatus status = {};
2851+
SnapshotUpdateStatus status = ReadSnapshotUpdateStatus(lock.get());
28422852
status.set_state(update_state);
28432853
status.set_compression_enabled(cow_creator.compression_enabled);
28442854
if (!WriteSnapshotUpdateStatus(lock.get(), status)) {
@@ -3264,9 +3274,10 @@ bool SnapshotManager::Dump(std::ostream& os) {
32643274

32653275
std::stringstream ss;
32663276

3277+
auto update_status = ReadSnapshotUpdateStatus(file.get());
3278+
32673279
ss << "Update state: " << ReadUpdateState(file.get()) << std::endl;
3268-
ss << "Compression: " << ReadSnapshotUpdateStatus(file.get()).compression_enabled()
3269-
<< std::endl;
3280+
ss << "Compression: " << update_status.compression_enabled() << std::endl;
32703281
ss << "Current slot: " << device_->GetSlotSuffix() << std::endl;
32713282
ss << "Boot indicator: booting from " << GetCurrentSlot() << " slot" << std::endl;
32723283
ss << "Rollback indicator: "
@@ -3275,6 +3286,7 @@ bool SnapshotManager::Dump(std::ostream& os) {
32753286
ss << "Forward merge indicator: "
32763287
<< (access(GetForwardMergeIndicatorPath().c_str(), F_OK) == 0 ? "exists" : strerror(errno))
32773288
<< std::endl;
3289+
ss << "Source build fingerprint: " << update_status.source_build_fingerprint() << std::endl;
32783290

32793291
bool ok = true;
32803292
std::vector<std::string> snapshots;
@@ -3792,5 +3804,13 @@ MergeFailureCode SnapshotManager::ReadMergeFailureCode() {
37923804
return status.merge_failure_code();
37933805
}
37943806

3807+
std::string SnapshotManager::ReadSourceBuildFingerprint() {
3808+
auto lock = LockExclusive();
3809+
if (!lock) return {};
3810+
3811+
SnapshotUpdateStatus status = ReadSnapshotUpdateStatus(lock.get());
3812+
return status.source_build_fingerprint();
3813+
}
3814+
37953815
} // namespace snapshot
37963816
} // namespace android

fs_mgr/libsnapshot/snapshot_stats.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ void SnapshotMergeStats::set_state(android::snapshot::UpdateState state, bool us
9191

9292
void SnapshotMergeStats::set_cow_file_size(uint64_t cow_file_size) {
9393
report_.set_cow_file_size(cow_file_size);
94-
WriteState();
9594
}
9695

9796
uint64_t SnapshotMergeStats::cow_file_size() {
@@ -138,6 +137,14 @@ MergeFailureCode SnapshotMergeStats::merge_failure_code() {
138137
return report_.merge_failure_code();
139138
}
140139

140+
void SnapshotMergeStats::set_source_build_fingerprint(const std::string& fingerprint) {
141+
report_.set_source_build_fingerprint(fingerprint);
142+
}
143+
144+
std::string SnapshotMergeStats::source_build_fingerprint() {
145+
return report_.source_build_fingerprint();
146+
}
147+
141148
class SnapshotMergeStatsResultImpl : public SnapshotMergeStats::Result {
142149
public:
143150
SnapshotMergeStatsResultImpl(const SnapshotMergeReport& report,

fs_mgr/libsnapshot/snapshot_stub.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,10 @@ class SnapshotMergeStatsStub : public ISnapshotMergeStats {
136136
void set_boot_complete_to_merge_start_time_ms(uint32_t) override {}
137137
uint32_t boot_complete_to_merge_start_time_ms() override { return 0; }
138138
void set_merge_failure_code(MergeFailureCode) override {}
139-
MergeFailureCode merge_failure_code() { return MergeFailureCode::Ok; }
139+
MergeFailureCode merge_failure_code() override { return MergeFailureCode::Ok; }
140+
void set_source_build_fingerprint(const std::string&) override {}
141+
std::string source_build_fingerprint() override { return {}; }
142+
bool WriteState() override { return false; }
140143
};
141144

142145
ISnapshotMergeStats* SnapshotManagerStub::GetSnapshotMergeStatsInstance() {
@@ -170,4 +173,9 @@ auto SnapshotManagerStub::ReadMergeFailureCode() -> MergeFailureCode {
170173
return MergeFailureCode::Ok;
171174
}
172175

176+
std::string SnapshotManagerStub::ReadSourceBuildFingerprint() {
177+
LOG(ERROR) << __FUNCTION__ << " should never be called.";
178+
return {};
179+
}
180+
173181
} // namespace android::snapshot

0 commit comments

Comments
 (0)