summaryrefslogtreecommitdiff
path: root/common/dynamic_partition_control_interface.h
diff options
context:
space:
mode:
authorYifan Hong <elsk@google.com>2020-02-19 15:22:47 -0800
committerYifan Hong <elsk@google.com>2020-03-05 16:41:12 +0000
commit9096550b0c9469caac0b5c204b1f223ffebded0d (patch)
tree558fe4709f758756fba1a633ced3e1791465c610 /common/dynamic_partition_control_interface.h
parentdad0af8905bea862e963a5d5f8eda9b98eecc637 (diff)
UpdateAttempterAndroid::Init initiates merge
On update_engine starts, schedule CleanupPreviousUpdateAction that calls CleanupSuccessfulUpdate to do necessary cleanup as soon as possible. In the good case, update_engine initiates merge when sys.boot_completed, and clean up snapshots. If the update is rolled back or partitions are flashed, the following happens (on a Virtual A/B device): - UpdateAttempterAndroid::CleanupSuccessfulUpdate is called - DynamicPartitionControlAndroid::CleanupSuccessfulUpdate is called - SnapshotManager::InitiateMergeAndWait is called - SnapshotManager::RemoveAllUpdateState(before_cancel) is called - before_cancel is called, DeltaPerformer::ResetUpdateProgress is called - All update states in update_engine is reset. - SnapshotManager proceeds to delete snapshots - All update states in SnapshotManager is reset. Hence, on an VAB device, when an update is rolled back or partitions are flashed, the whole update needs to be re-applied (while in A/B, it skips writing and directly start verifying hashes of the target partitions because the update markers are still there). Bug: 147696014 Test: apply OTA then reboot, inspect logs and do `snapshotctl dump` Change-Id: I0fc5e7768dfb53e4fd474f2d8d85d2a1b615a88b
Diffstat (limited to 'common/dynamic_partition_control_interface.h')
-rw-r--r--common/dynamic_partition_control_interface.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/common/dynamic_partition_control_interface.h b/common/dynamic_partition_control_interface.h
index 48cd9be1..8de9d76a 100644
--- a/common/dynamic_partition_control_interface.h
+++ b/common/dynamic_partition_control_interface.h
@@ -22,6 +22,8 @@
#include <memory>
#include <string>
+#include "update_engine/common/action.h"
+#include "update_engine/common/cleanup_previous_update_action_delegate.h"
#include "update_engine/common/error_code.h"
#include "update_engine/update_metadata.pb.h"
@@ -38,6 +40,9 @@ struct FeatureFlag {
Value value_;
};
+class BootControlInterface;
+class PrefsInterface;
+
class DynamicPartitionControlInterface {
public:
virtual ~DynamicPartitionControlInterface() = default;
@@ -79,6 +84,7 @@ class DynamicPartitionControlInterface {
// this function to indicate writes to new partitions are done.
virtual bool FinishUpdate() = 0;
+ // Deprecated. Use GetCleanupPreviousUpdateAction instead.
// Before applying the next update, call this function to clean up previous
// update files. This function blocks until delta files are merged into
// current OS partitions and finished cleaning up.
@@ -86,6 +92,20 @@ class DynamicPartitionControlInterface {
// - If any error, but caller should retry after reboot, return kError.
// - If any irrecoverable failures, return kDeviceCorrupted.
virtual ErrorCode CleanupSuccessfulUpdate() = 0;
+
+ // Get an action to clean up previous update.
+ // Return NoOpAction on non-Virtual A/B devices.
+ // Before applying the next update, run this action to clean up previous
+ // update files. This function blocks until delta files are merged into
+ // current OS partitions and finished cleaning up.
+ // - If successful, action completes with kSuccess.
+ // - If any error, but caller should retry after reboot, action completes with
+ // kError.
+ // - If any irrecoverable failures, action completes with kDeviceCorrupted.
+ virtual std::unique_ptr<AbstractAction> GetCleanupPreviousUpdateAction(
+ BootControlInterface* boot_control,
+ PrefsInterface* prefs,
+ CleanupPreviousUpdateActionDelegateInterface* delegate) = 0;
};
} // namespace chromeos_update_engine