update_engine: Reflect ActionProcessor and UpdateBootFlags changes in AOSP
We changed the ActionProcessor interface and how we update boot flags in
CL:1065113 and CL:1011244. This patch reflects those changes in
update_attempter_android.*
BUG=chromium:807976
TEST=unittests
TEST=build and run in android
Change-Id: Ib06b6c1560e58771e66288208a525130a5811360
Reviewed-on: https://chromium-review.googlesource.com/1150737
Commit-Ready: Amin Hassani <ahassani@chromium.org>
Tested-by: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Sen Jiang <senj@chromium.org>
diff --git a/Android.mk b/Android.mk
index 1f0397b..2fc6f46 100644
--- a/Android.mk
+++ b/Android.mk
@@ -421,6 +421,7 @@
network_selector_android.cc \
proxy_resolver.cc \
update_attempter_android.cc \
+ update_boot_flags_action.cc \
update_status_utils.cc \
utils_android.cc
include $(BUILD_STATIC_LIBRARY)
@@ -497,6 +498,7 @@
proxy_resolver.cc \
sideload_main.cc \
update_attempter_android.cc \
+ update_boot_flags_action.cc \
update_status_utils.cc \
utils_android.cc
LOCAL_STATIC_LIBRARIES := \
diff --git a/common/action_processor_unittest.cc b/common/action_processor_unittest.cc
index b67eca9..eb646ef 100644
--- a/common/action_processor_unittest.cc
+++ b/common/action_processor_unittest.cc
@@ -166,7 +166,7 @@
action_processor_.EnqueueAction(std::move(action1));
action_processor_.EnqueueAction(std::move(action2));
- EXPECT_EQ(action_processor_.actions_.size(), 3);
+ EXPECT_EQ(action_processor_.actions_.size(), 3u);
EXPECT_EQ(action_processor_.actions_[0].get(), action0_ptr);
EXPECT_EQ(action_processor_.actions_[1].get(), action1_ptr);
EXPECT_EQ(action_processor_.actions_[2].get(), action2_ptr);
diff --git a/update_attempter_android.cc b/update_attempter_android.cc
index 2f842ac..9b0b42a 100644
--- a/update_attempter_android.cc
+++ b/update_attempter_android.cc
@@ -46,6 +46,7 @@
#include "update_engine/payload_consumer/payload_constants.h"
#include "update_engine/payload_consumer/payload_metadata.h"
#include "update_engine/payload_consumer/postinstall_runner_action.h"
+#include "update_engine/update_boot_flags_action.h"
#include "update_engine/update_status_utils.h"
#ifndef _UE_SIDELOAD
@@ -245,24 +246,35 @@
LOG(INFO) << "Using this install plan:";
install_plan_.Dump();
- BuildUpdateActions(payload_url);
+ HttpFetcher* fetcher = nullptr;
+ if (FileFetcher::SupportedUrl(payload_url)) {
+ DLOG(INFO) << "Using FileFetcher for file URL.";
+ fetcher = new FileFetcher();
+ } else {
+#ifdef _UE_SIDELOAD
+ LOG(FATAL) << "Unsupported sideload URI: " << payload_url;
+#else
+ LibcurlHttpFetcher* libcurl_fetcher =
+ new LibcurlHttpFetcher(&proxy_resolver_, hardware_);
+ libcurl_fetcher->set_server_to_check(ServerToCheck::kDownload);
+ fetcher = libcurl_fetcher;
+#endif // _UE_SIDELOAD
+ }
// Setup extra headers.
- HttpFetcher* fetcher = download_action_->http_fetcher();
if (!headers[kPayloadPropertyAuthorization].empty())
fetcher->SetHeader("Authorization", headers[kPayloadPropertyAuthorization]);
if (!headers[kPayloadPropertyUserAgent].empty())
fetcher->SetHeader("User-Agent", headers[kPayloadPropertyUserAgent]);
+ BuildUpdateActions(fetcher);
+
SetStatusAndNotify(UpdateStatus::UPDATE_AVAILABLE);
ongoing_update_ = true;
- // Just in case we didn't update boot flags yet, make sure they're updated
- // before any update processing starts. This will start the update process.
- UpdateBootFlags();
-
UpdatePrefsOnUpdateStart(install_plan_.is_resume);
// TODO(xunchang) report the metrics for unresumable updates
+ ScheduleProcessingStart();
return true;
}
@@ -527,27 +539,6 @@
}
}
-void UpdateAttempterAndroid::UpdateBootFlags() {
- if (updated_boot_flags_) {
- LOG(INFO) << "Already updated boot flags. Skipping.";
- CompleteUpdateBootFlags(true);
- return;
- }
- // This is purely best effort.
- LOG(INFO) << "Marking booted slot as good.";
- if (!boot_control_->MarkBootSuccessfulAsync(
- Bind(&UpdateAttempterAndroid::CompleteUpdateBootFlags,
- base::Unretained(this)))) {
- LOG(ERROR) << "Failed to mark current boot as successful.";
- CompleteUpdateBootFlags(false);
- }
-}
-
-void UpdateAttempterAndroid::CompleteUpdateBootFlags(bool successful) {
- updated_boot_flags_ = true;
- ScheduleProcessingStart();
-}
-
void UpdateAttempterAndroid::ScheduleProcessingStart() {
LOG(INFO) << "Scheduling an action processor start.";
brillo::MessageLoop::current()->PostTask(
@@ -563,7 +554,6 @@
}
download_progress_ = 0;
- actions_.clear();
UpdateStatus new_status =
(error_code == ErrorCode::kSuccess ? UpdateStatus::UPDATED_NEED_REBOOT
: UpdateStatus::IDLE);
@@ -602,51 +592,29 @@
last_notify_time_ = TimeTicks::Now();
}
-void UpdateAttempterAndroid::BuildUpdateActions(const string& url) {
+void UpdateAttempterAndroid::BuildUpdateActions(HttpFetcher* fetcher) {
CHECK(!processor_->IsRunning());
processor_->set_delegate(this);
// Actions:
- shared_ptr<InstallPlanAction> install_plan_action(
- new InstallPlanAction(install_plan_));
-
- HttpFetcher* download_fetcher = nullptr;
- if (FileFetcher::SupportedUrl(url)) {
- DLOG(INFO) << "Using FileFetcher for file URL.";
- download_fetcher = new FileFetcher();
- } else {
-#ifdef _UE_SIDELOAD
- LOG(FATAL) << "Unsupported sideload URI: " << url;
-#else
- LibcurlHttpFetcher* libcurl_fetcher =
- new LibcurlHttpFetcher(&proxy_resolver_, hardware_);
- libcurl_fetcher->set_server_to_check(ServerToCheck::kDownload);
- download_fetcher = libcurl_fetcher;
-#endif // _UE_SIDELOAD
- }
- shared_ptr<DownloadAction> download_action(
- new DownloadAction(prefs_,
- boot_control_,
- hardware_,
- nullptr, // system_state, not used.
- download_fetcher, // passes ownership
- true /* interactive */));
- shared_ptr<FilesystemVerifierAction> filesystem_verifier_action(
- new FilesystemVerifierAction());
-
- shared_ptr<PostinstallRunnerAction> postinstall_runner_action(
- new PostinstallRunnerAction(boot_control_, hardware_));
-
+ auto update_boot_flags_action =
+ std::make_unique<UpdateBootFlagsAction>(boot_control_);
+ auto install_plan_action = std::make_unique<InstallPlanAction>(install_plan_);
+ auto download_action =
+ std::make_unique<DownloadAction>(prefs_,
+ boot_control_,
+ hardware_,
+ nullptr, // system_state, not used.
+ fetcher, // passes ownership
+ true /* interactive */);
download_action->set_delegate(this);
download_action->set_base_offset(base_offset_);
- download_action_ = download_action;
+ auto filesystem_verifier_action =
+ std::make_unique<FilesystemVerifierAction>();
+ auto postinstall_runner_action =
+ std::make_unique<PostinstallRunnerAction>(boot_control_, hardware_);
postinstall_runner_action->set_delegate(this);
- actions_.push_back(shared_ptr<AbstractAction>(install_plan_action));
- actions_.push_back(shared_ptr<AbstractAction>(download_action));
- actions_.push_back(shared_ptr<AbstractAction>(filesystem_verifier_action));
- actions_.push_back(shared_ptr<AbstractAction>(postinstall_runner_action));
-
// Bond them together. We have to use the leaf-types when calling
// BondActions().
BondActions(install_plan_action.get(), download_action.get());
@@ -654,9 +622,11 @@
BondActions(filesystem_verifier_action.get(),
postinstall_runner_action.get());
- // Enqueue the actions.
- for (const shared_ptr<AbstractAction>& action : actions_)
- processor_->EnqueueAction(action.get());
+ processor_->EnqueueAction(std::move(update_boot_flags_action));
+ processor_->EnqueueAction(std::move(install_plan_action));
+ processor_->EnqueueAction(std::move(download_action));
+ processor_->EnqueueAction(std::move(filesystem_verifier_action));
+ processor_->EnqueueAction(std::move(postinstall_runner_action));
}
bool UpdateAttempterAndroid::WriteUpdateCompletedMarker() {
diff --git a/update_attempter_android.h b/update_attempter_android.h
index f00692e..cad89dc 100644
--- a/update_attempter_android.h
+++ b/update_attempter_android.h
@@ -114,8 +114,9 @@
void SetStatusAndNotify(UpdateStatus status);
// Helper method to construct the sequence of actions to be performed for
- // applying an update from the given |url|.
- void BuildUpdateActions(const std::string& url);
+ // applying an update using a given HttpFetcher. The ownership of |fetcher| is
+ // passed to this function.
+ void BuildUpdateActions(HttpFetcher* fetcher);
// Writes to the processing completed marker. Does nothing if
// |update_completed_marker_| is empty.
@@ -171,14 +172,9 @@
// set back in the middle of an update.
base::TimeTicks last_notify_time_;
- // The list of actions and action processor that runs them asynchronously.
- // Only used when |ongoing_update_| is true.
- std::vector<std::shared_ptr<AbstractAction>> actions_;
+ // The processor for running Actions.
std::unique_ptr<ActionProcessor> processor_;
- // Pointer to the DownloadAction in the actions_ vector.
- std::shared_ptr<DownloadAction> download_action_;
-
// Whether there is an ongoing update. This implies that an update was started
// but not finished yet. This value will be true even if the update was
// suspended.
@@ -200,10 +196,6 @@
// Helper class to select the network to use during the update.
std::unique_ptr<NetworkSelectorInterface> network_selector_;
- // Whether we have marked the current slot as good. This step is required
- // before applying an update to the other slot.
- bool updated_boot_flags_ = false;
-
std::unique_ptr<ClockInterface> clock_;
std::unique_ptr<MetricsReporterInterface> metrics_reporter_;