diff options
author | Oli Lan <olilan@google.com> | 2021-07-16 09:03:51 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-07-16 09:03:51 +0000 |
commit | d87ad4f7818a51b400860b0ddf8a71c3283b41d8 (patch) | |
tree | bd3cf3bca0fdbf23e84394a8909514e5a70e785e | |
parent | 318e7220d8880cf416c9b054dd79115a32f2c7bc (diff) | |
parent | 128f7ec72f362359e69d4a7a9824912dc7cad84d (diff) | |
download | apex-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.cpp | 8 | ||||
-rw-r--r-- | apexd/apexservice_test.cpp | 37 |
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))); |