update_engine: Store fingerprint value from Omaha response.
Store the unique fp value from response into prefs. Value is later sent
to Omaha to determine if there is a subsequent update available
while the system is waiting to be rebooted.
BUG=b:161259884
TEST=cros_workon_make --board=hatch --test update_engine
Change-Id: Ie37aa5da3cd8a0820e633f5ef426fb50e8a02838
Reviewed-on: https://chromium-review.googlesource.com/c/aosp/platform/system/update_engine/+/2491618
Tested-by: Vyshu Khota <vyshu@google.com>
Commit-Queue: Vyshu Khota <vyshu@google.com>
Reviewed-by: Amin Hassani <ahassani@chromium.org>
diff --git a/cros/update_attempter.cc b/cros/update_attempter.cc
index e417457..5c21d04 100644
--- a/cros/update_attempter.cc
+++ b/cros/update_attempter.cc
@@ -158,10 +158,12 @@
// In case of update_engine restart without a reboot we need to restore the
// reboot needed state.
- if (GetBootTimeAtUpdate(nullptr))
+ if (GetBootTimeAtUpdate(nullptr)) {
status_ = UpdateStatus::UPDATED_NEED_REBOOT;
- else
+ } else {
status_ = UpdateStatus::IDLE;
+ prefs_->Delete(kPrefsLastFp, {kDlcPrefsSubDir});
+ }
}
bool UpdateAttempter::ScheduleUpdates() {
@@ -646,6 +648,20 @@
return failures.size() == 0;
}
+void UpdateAttempter::SetPref(const string& pref_key,
+ const string& pref_value,
+ const string& payload_id) {
+ string dlc_id;
+ if (!omaha_request_params_->GetDlcId(payload_id, &dlc_id)) {
+ // Not a DLC ID, set fingerprint in perf for platform ID.
+ prefs_->SetString(pref_key, pref_value);
+ } else {
+ // Set fingerprint in pref for DLC ID.
+ auto key = prefs_->CreateSubKey({kDlcPrefsSubDir, dlc_id, pref_key});
+ prefs_->SetString(key, pref_value);
+ }
+}
+
bool UpdateAttempter::SetDlcActiveValue(bool is_active, const string& dlc_id) {
if (dlc_id.empty()) {
LOG(ERROR) << "Empty DLC ID passed.";
@@ -1198,6 +1214,9 @@
for (const auto& payload : install_plan_->payloads) {
target_version_uid += brillo::data_encoding::Base64Encode(payload.hash) +
":" + payload.metadata_signature + ":";
+ // Set fingerprint value for updates only.
+ if (!is_install_)
+ SetPref(kPrefsLastFp, payload.fp, payload.app_id);
}
// If we just downloaded a rollback image, we should preserve this fact
@@ -1419,6 +1438,7 @@
// UpdateStatus::UPDATED_NEED_REBOOT state.
ret_value = prefs_->Delete(kPrefsUpdateCompletedOnBootId) && ret_value;
ret_value = prefs_->Delete(kPrefsUpdateCompletedBootTime) && ret_value;
+ ret_value = prefs_->Delete(kPrefsLastFp, {kDlcPrefsSubDir}) && ret_value;
// Update the boot flags so the current slot has higher priority.
BootControlInterface* boot_control = system_state_->boot_control();