Fix merge in sideload
For UpdateAttempterAndroid:
- In sideload, ApplyPayload is immediately called after
UpdateAttempterAndroid::Init(), and errors out because
ScheduleCleanupPreviousUpdate starts the ActionProcessor. Do not
call it in sideload since ApplyPayload schedules a
CleanupPreviousUpdateAction too.
- Also fixes TerminateUpdateAndNotify in sideload if it errors at
CleanupPreviousUpdateAction.
For CleanupPreviousUpdateAction:
- Don't wait for boot_completed and slot verification in sideload.
- Ensure metadata is mounted.
Fixes: 151640692
Test: sideload
Change-Id: Ib91b208d3f8d79285b9a87a44410a575bd2da42e
Merged-In: Ib91b208d3f8d79285b9a87a44410a575bd2da42e
diff --git a/cleanup_previous_update_action.cc b/cleanup_previous_update_action.cc
index 6c5cd1c..91373d4 100644
--- a/cleanup_previous_update_action.cc
+++ b/cleanup_previous_update_action.cc
@@ -43,6 +43,12 @@
// Interval to call SnapshotManager::ProcessUpdateState
constexpr auto kWaitForMergeInterval = base::TimeDelta::FromSeconds(2);
+#ifdef __ANDROID_RECOVERY__
+static constexpr bool kIsRecovery = true;
+#else
+static constexpr bool kIsRecovery = false;
+#endif
+
namespace chromeos_update_engine {
CleanupPreviousUpdateAction::CleanupPreviousUpdateAction(
@@ -84,6 +90,7 @@
void CleanupPreviousUpdateAction::ActionCompleted(ErrorCode error_code) {
running_ = false;
ReportMergeStats();
+ metadata_device_ = nullptr;
}
std::string CleanupPreviousUpdateAction::Type() const {
@@ -118,7 +125,8 @@
void CleanupPreviousUpdateAction::WaitBootCompletedOrSchedule() {
TEST_AND_RETURN(running_);
- if (!android::base::GetBoolProperty(kBootCompletedProp, false)) {
+ if (!kIsRecovery &&
+ !android::base::GetBoolProperty(kBootCompletedProp, false)) {
// repeat
ScheduleWaitBootCompleted();
return;
@@ -140,9 +148,21 @@
void CleanupPreviousUpdateAction::CheckSlotMarkedSuccessfulOrSchedule() {
TEST_AND_RETURN(running_);
- if (!boot_control_->IsSlotMarkedSuccessful(boot_control_->GetCurrentSlot())) {
+ if (!kIsRecovery &&
+ !boot_control_->IsSlotMarkedSuccessful(boot_control_->GetCurrentSlot())) {
ScheduleWaitMarkBootSuccessful();
}
+
+ if (metadata_device_ == nullptr) {
+ metadata_device_ = snapshot_->EnsureMetadataMounted();
+ }
+
+ if (metadata_device_ == nullptr) {
+ LOG(ERROR) << "Failed to mount /metadata.";
+ processor_->ActionComplete(this, ErrorCode::kError);
+ return;
+ }
+
if (!merge_stats_->Start()) {
// Not an error because CleanupPreviousUpdateAction may be paused and
// resumed while kernel continues merging snapshots in the background.