From 4c17a070532503993488bd4f6ab2ad871cc7d20f Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 6 Mar 2023 22:56:49 +0000 Subject: [PATCH] libsnapshot: Fix test failures on certain configurations. Due to how CF is built and tested, VABC is enabled even when not supported by the kernel. To work around this add some logic in libsnapshot and the test harness to recognize this situation and silently flip off the VABC flag. This also fixes the -force_mode option to vts_libsnapshot_test, so that it will skip tests that aren't supported by the device. Bug: 264279496 Test: vts_libsnapshot_test on 11-5.4 with vabc enabled Change-Id: I4c1e88fac54732c21c88169a7e0dd664e3858b89 --- fs_mgr/libsnapshot/snapshot.cpp | 2 ++ fs_mgr/libsnapshot/snapshot_test.cpp | 35 +++++++++++++++++++++++++++- fs_mgr/libsnapshot/utility.cpp | 11 ++++++++- fs_mgr/libsnapshot/utility.h | 2 ++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 15f025c9c..f655522c6 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -3216,6 +3216,8 @@ Return SnapshotManager::CreateUpdateSnapshots(const DeltaArchiveManifest& manife vabc_disable_reason = "recovery"; } else if (!cow_format_support) { vabc_disable_reason = "cow format not supported"; + } else if (!KernelSupportsCompressedSnapshots()) { + vabc_disable_reason = "kernel missing userspace block device support"; } if (!vabc_disable_reason.empty()) { diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index 13314daab..460d49db2 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -124,6 +124,10 @@ class SnapshotTest : public ::testing::Test { SKIP_IF_NON_VIRTUAL_AB(); SetupProperties(); + if (!DeviceSupportsMode()) { + GTEST_SKIP() << "Mode not supported on this device"; + } + InitializeState(); CleanupTestArtifacts(); FormatFakeSuper(); @@ -159,7 +163,13 @@ class SnapshotTest : public ::testing::Test { IPropertyFetcher::OverrideForTesting(std::move(fetcher)); if (GetLegacyCompressionEnabledProperty() || CanUseUserspaceSnapshots()) { - snapuserd_required_ = true; + // If we're asked to test the device's actual configuration, then it + // may be misconfigured, so check for kernel support as libsnapshot does. + if (FLAGS_force_mode.empty()) { + snapuserd_required_ = KernelSupportsCompressedSnapshots(); + } else { + snapuserd_required_ = true; + } } } @@ -176,6 +186,16 @@ class SnapshotTest : public ::testing::Test { LOG(INFO) << "Teardown complete for test: " << test_name_; } + bool DeviceSupportsMode() { + if (FLAGS_force_mode.empty()) { + return true; + } + if (snapuserd_required_ && !KernelSupportsCompressedSnapshots()) { + return false; + } + return true; + } + void InitializeState() { ASSERT_TRUE(sm->EnsureImageManager()); image_manager_ = sm->image_manager(); @@ -193,6 +213,11 @@ class SnapshotTest : public ::testing::Test { // get an accurate list to remove. lock_ = nullptr; + // If there is no image manager, the test was skipped. + if (!image_manager_) { + return; + } + std::vector snapshots = {"test-snapshot", "test_partition_a", "test_partition_b"}; for (const auto& snapshot : snapshots) { @@ -946,6 +971,11 @@ class SnapshotUpdateTest : public SnapshotTest { SKIP_IF_NON_VIRTUAL_AB(); SnapshotTest::SetUp(); + if (!image_manager_) { + // Test was skipped. + return; + } + Cleanup(); // Cleanup() changes slot suffix, so initialize it again. @@ -2680,6 +2710,9 @@ class ImageManagerTest : public SnapshotTest { CleanUp(); } void CleanUp() { + if (!image_manager_) { + return; + } EXPECT_TRUE(!image_manager_->BackingImageExists(kImageName) || image_manager_->DeleteBackingImage(kImageName)); } diff --git a/fs_mgr/libsnapshot/utility.cpp b/fs_mgr/libsnapshot/utility.cpp index a98bf0e5c..1ffa89cba 100644 --- a/fs_mgr/libsnapshot/utility.cpp +++ b/fs_mgr/libsnapshot/utility.cpp @@ -29,6 +29,7 @@ #include #include +using android::dm::DeviceMapper; using android::dm::kSectorSize; using android::fiemap::FiemapStatus; using android::fs_mgr::EnsurePathMounted; @@ -251,7 +252,10 @@ bool CanUseUserspaceSnapshots() { LOG(INFO) << "Userspace snapshots disabled for testing"; return false; } - + if (!KernelSupportsCompressedSnapshots()) { + LOG(ERROR) << "Userspace snapshots requested, but no kernel support is available."; + return false; + } return true; } @@ -278,5 +282,10 @@ bool IsDmSnapshotTestingEnabled() { return fetcher->GetBoolProperty("snapuserd.test.dm.snapshots", false); } +bool KernelSupportsCompressedSnapshots() { + auto& dm = DeviceMapper::Instance(); + return dm.GetTargetByName("user", nullptr); +} + } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/utility.h b/fs_mgr/libsnapshot/utility.h index 8c4c7c664..370f3c4fc 100644 --- a/fs_mgr/libsnapshot/utility.h +++ b/fs_mgr/libsnapshot/utility.h @@ -127,6 +127,8 @@ std::ostream& operator<<(std::ostream& os, const Now&); void AppendExtent(google::protobuf::RepeatedPtrField* extents, uint64_t start_block, uint64_t num_blocks); +bool KernelSupportsCompressedSnapshots(); + bool GetLegacyCompressionEnabledProperty(); bool GetUserspaceSnapshotsEnabledProperty(); bool GetIouringEnabledProperty();