summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOli Lan <olilan@google.com>2021-07-16 09:03:51 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-07-16 09:03:51 +0000
commitd87ad4f7818a51b400860b0ddf8a71c3283b41d8 (patch)
treebd3cf3bca0fdbf23e84394a8909514e5a70e785e
parent318e7220d8880cf416c9b054dd79115a32f2c7bc (diff)
parent128f7ec72f362359e69d4a7a9824912dc7cad84d (diff)
downloadapex-d87ad4f7818a51b400860b0ddf8a71c3283b41d8.tar.gz
Merge "Only restore apex backups on non-checkpointing devices." into sc-dev am: 128f7ec72f
Original change: https://googleplex-android-review.googlesource.com/c/platform/system/apex/+/15298577 Change-Id: I586e0d6e20932c0e655f20fa0cc7d31e86de0f8e
-rw-r--r--apexd/apexd.cpp8
-rw-r--r--apexd/apexservice_test.cpp37
2 files changed, 38 insertions, 7 deletions
diff --git a/apexd/apexd.cpp b/apexd/apexd.cpp
index dc9bfb4b..3d5dac39 100644
--- a/apexd/apexd.cpp
+++ b/apexd/apexd.cpp
@@ -1760,7 +1760,7 @@ void SnapshotOrRestoreDeIfNeeded(const std::string& base_dir,
}
} else if (session.IsRollback()) {
for (const auto& apex_name : session.GetApexNames()) {
- if (!gInFsCheckpointMode) {
+ if (!gSupportsFsCheckpoints) {
// Snapshot before restore so this rollback can be reverted.
SnapshotDataDirectory(base_dir, session.GetRollbackId(), apex_name,
true /* pre_restore */);
@@ -2249,7 +2249,7 @@ Result<void> RevertActiveSessions(const std::string& crashing_native_process,
}
}
- if (!gInFsCheckpointMode) {
+ if (!gSupportsFsCheckpoints) {
auto restore_status = RestoreActivePackages();
if (!restore_status.ok()) {
for (auto& session : active_sessions) {
@@ -2267,7 +2267,7 @@ Result<void> RevertActiveSessions(const std::string& crashing_native_process,
}
for (auto& session : active_sessions) {
- if (!gInFsCheckpointMode && session.IsRollback()) {
+ if (!gSupportsFsCheckpoints && session.IsRollback()) {
// If snapshots have already been restored, undo that by restoring the
// pre-restore snapshot.
RestoreDePreRestoreSnapshotsIfPresent(session);
@@ -2956,7 +2956,7 @@ Result<void> MarkStagedSessionSuccessful(const int session_id) {
return Error() << "Failed to mark session " << *session
<< " as successful : " << cleanup_status.error();
}
- if (session->IsRollback() && !gInFsCheckpointMode) {
+ if (session->IsRollback() && !gSupportsFsCheckpoints) {
DeleteDePreRestoreSnapshots(*session);
}
return session->UpdateStateAndCommit(SessionState::SUCCESS);
diff --git a/apexd/apexservice_test.cpp b/apexd/apexservice_test.cpp
index d0d4633e..c1237966 100644
--- a/apexd/apexservice_test.cpp
+++ b/apexd/apexservice_test.cpp
@@ -2268,7 +2268,7 @@ class ApexServiceRevertTest : public ApexServiceTest {
}
}
- void CheckRevertWasPerformed(const std::vector<std::string>& expected_pkgs) {
+ void CheckActiveApexContents(const std::vector<std::string>& expected_pkgs) {
// First check that /data/apex/active exists and has correct permissions.
struct stat sd;
ASSERT_EQ(0, stat(kActiveApexPackagesDataDir, &sd));
@@ -2306,7 +2306,38 @@ TEST_F(ApexServiceRevertTest, RevertActiveSessionsSuccessful) {
auto pkg = StringPrintf("%s/com.android.apex.test_package@1.apex",
kActiveApexPackagesDataDir);
SCOPED_TRACE("");
- CheckRevertWasPerformed({pkg});
+ CheckActiveApexContents({pkg});
+}
+
+// Calling revertActiveSessions should not restore backup on checkpointing
+// devices
+TEST_F(ApexServiceRevertTest,
+ RevertActiveSessionsDoesNotRestoreBackupIfCheckpointingSupported) {
+ if (!supports_fs_checkpointing_) {
+ GTEST_SKIP() << "Can't run if filesystem checkpointing is not supported";
+ }
+
+ PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test_v2.apex"));
+ if (!installer.Prepare()) {
+ return;
+ }
+
+ auto session = ApexSession::CreateSession(1543);
+ ASSERT_TRUE(IsOk(session));
+ ASSERT_TRUE(IsOk(session->UpdateStateAndCommit(SessionState::ACTIVATED)));
+
+ // Make sure /data/apex/active is non-empty.
+ ASSERT_TRUE(IsOk(service_->stagePackages({installer.test_file})));
+
+ PrepareBackup({GetTestFile("apex.apexd_test.apex")});
+
+ ASSERT_TRUE(IsOk(service_->revertActiveSessions()));
+
+ // Check that active apexes were not reverted.
+ auto pkg = StringPrintf("%s/com.android.apex.test_package@2.apex",
+ kActiveApexPackagesDataDir);
+ SCOPED_TRACE("");
+ CheckActiveApexContents({pkg});
}
// Should fail to revert active sessions when there are none
@@ -2377,7 +2408,7 @@ TEST_F(ApexServiceRevertTest, ResumesRevert) {
auto pkg2 = StringPrintf("%s/com.android.apex.test_package_2@1.apex",
kActiveApexPackagesDataDir);
SCOPED_TRACE("");
- CheckRevertWasPerformed({pkg1, pkg2});
+ CheckActiveApexContents({pkg1, pkg2});
std::vector<ApexSessionInfo> sessions;
ASSERT_TRUE(IsOk(service_->getSessions(&sessions)));