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.