blob: 1d8d3d75de4b8834d1327050ede46d4f48599151 [file] [log] [blame]
Yifan Hongdad0af82020-02-19 17:19:49 -08001//
2// Copyright (C) 2020 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef UPDATE_ENGINE_CLEANUP_PREVIOUS_UPDATE_ACTION_H_
18#define UPDATE_ENGINE_CLEANUP_PREVIOUS_UPDATE_ACTION_H_
19
Yifan Hongd976cc52020-02-25 14:51:42 -080020#include <chrono> // NOLINT(build/c++11) -- for merge times
21#include <memory>
Yifan Hongdad0af82020-02-19 17:19:49 -080022#include <string>
23
24#include <brillo/message_loops/message_loop.h>
25#include <libsnapshot/snapshot.h>
Yifan Hongd976cc52020-02-25 14:51:42 -080026#include <libsnapshot/snapshot_stats.h>
Yifan Hongdad0af82020-02-19 17:19:49 -080027
28#include "update_engine/common/action.h"
29#include "update_engine/common/boot_control_interface.h"
30#include "update_engine/common/cleanup_previous_update_action_delegate.h"
31#include "update_engine/common/error_code.h"
32#include "update_engine/common/prefs_interface.h"
33
34namespace chromeos_update_engine {
35
36class CleanupPreviousUpdateAction;
37
38template <>
39class ActionTraits<CleanupPreviousUpdateAction> {
40 public:
41 typedef NoneType InputObjectType;
42 typedef NoneType OutputObjectType;
43};
44
45// On Android Virtual A/B devices, clean up snapshots from previous update
46// attempt. See DynamicPartitionControlAndroid::CleanupSuccessfulUpdate.
47class CleanupPreviousUpdateAction : public Action<CleanupPreviousUpdateAction> {
48 public:
49 CleanupPreviousUpdateAction(
50 PrefsInterface* prefs,
51 BootControlInterface* boot_control,
Yifan Hongf9cb4492020-04-15 13:00:20 -070052 android::snapshot::ISnapshotManager* snapshot,
Yifan Hongdad0af82020-02-19 17:19:49 -080053 CleanupPreviousUpdateActionDelegateInterface* delegate);
54
55 void PerformAction() override;
56 void SuspendAction() override;
57 void ResumeAction() override;
58 void TerminateProcessing() override;
59 void ActionCompleted(ErrorCode error_code) override;
60 std::string Type() const override;
61 static std::string StaticType();
62 typedef ActionTraits<CleanupPreviousUpdateAction>::InputObjectType
63 InputObjectType;
64 typedef ActionTraits<CleanupPreviousUpdateAction>::OutputObjectType
65 OutputObjectType;
66
67 private:
68 PrefsInterface* prefs_;
69 BootControlInterface* boot_control_;
Yifan Hongf9cb4492020-04-15 13:00:20 -070070 android::snapshot::ISnapshotManager* snapshot_;
Yifan Hongdad0af82020-02-19 17:19:49 -080071 CleanupPreviousUpdateActionDelegateInterface* delegate_;
Yifan Hong5cd63fa2020-03-16 12:31:16 -070072 std::unique_ptr<android::snapshot::AutoDevice> metadata_device_;
Yifan Hongdad0af82020-02-19 17:19:49 -080073 bool running_{false};
74 bool cancel_failed_{false};
75 unsigned int last_percentage_{0};
Yifan Hongf9cb4492020-04-15 13:00:20 -070076 android::snapshot::ISnapshotMergeStats* merge_stats_;
Yifan Hongdad0af82020-02-19 17:19:49 -080077
Yifan Hongd506dee2020-09-25 15:08:19 -070078 void StopActionInternal();
Yifan Hongdad0af82020-02-19 17:19:49 -080079 void StartActionInternal();
80 void ScheduleWaitBootCompleted();
81 void WaitBootCompletedOrSchedule();
82 void ScheduleWaitMarkBootSuccessful();
83 void CheckSlotMarkedSuccessfulOrSchedule();
84 void ScheduleWaitForMerge();
85 void WaitForMergeOrSchedule();
86 void InitiateMergeAndWait();
Yifan Hongd976cc52020-02-25 14:51:42 -080087 void ReportMergeStats();
Yifan Hongdad0af82020-02-19 17:19:49 -080088
89 // Callbacks to ProcessUpdateState.
90 bool OnMergePercentageUpdate();
91 bool BeforeCancel();
92};
93
94} // namespace chromeos_update_engine
95
96#endif // UPDATE_ENGINE_CLEANUP_PREVIOUS_UPDATE_ACTION_H_