From 386bc0a55fd70d9a67ce3aa3091804f77307544b Mon Sep 17 00:00:00 2001 From: Christopher Hoffman Date: Mon, 7 Mar 2022 18:35:56 +0000 Subject: [PATCH] test/librbd: add test to verify diff_iterate size Add test case to verify diff size values of image and multiple snapshots. Fixes: https://tracker.ceph.com/issues/54440 Signed-off-by: Christopher Hoffman (cherry picked from commit d4e44df1be2bafa1c0ceabc73bb7243104fc7ad4) --- src/test/librbd/test_librbd.cc | 55 ++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index 245e192676295..d4fd81f05f43b 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -4232,6 +4232,61 @@ interval_set round_diff_interval(const interval_set& diff, return rounded_diff; } +TEST_F(TestLibRBD, SnapDiff) +{ + REQUIRE_FEATURE(RBD_FEATURE_FAST_DIFF); + + rados_ioctx_t ioctx; + rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx); + + rbd_image_t image; + int order = 0; + std::string image_name = get_temp_image_name(); + uint64_t size = 100 << 20; + ASSERT_EQ(0, create_image(ioctx, image_name.c_str(), size, &order)); + ASSERT_EQ(0, rbd_open(ioctx, image_name.c_str(), &image, nullptr)); + + char test_data[TEST_IO_SIZE + 1]; + for (size_t i = 0; i < TEST_IO_SIZE; ++i) { + test_data[i] = (char) (rand() % (126 - 33) + 33); + } + test_data[TEST_IO_SIZE] = '\0'; + + ASSERT_PASSED(write_test_data, image, test_data, 0, + TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_NOCACHE); + + interval_set diff; + ASSERT_EQ(0, rbd_diff_iterate2(image, nullptr, 0, size, true, true, + iterate_cb, &diff)); + EXPECT_EQ(1 << order, diff.size()); + + ASSERT_EQ(0, rbd_snap_create(image, "snap1")); + ASSERT_EQ(0, rbd_snap_create(image, "snap2")); + + diff.clear(); + ASSERT_EQ(0, rbd_diff_iterate2(image, nullptr, 0, size, true, true, + iterate_cb, &diff)); + EXPECT_EQ(1 << order, diff.size()); + + diff.clear(); + ASSERT_EQ(0, rbd_diff_iterate2(image, "snap1", 0, size, true, true, + iterate_cb, &diff)); + EXPECT_EQ(0, diff.size()); + + diff.clear(); + ASSERT_EQ(0, rbd_diff_iterate2(image, "snap2", 0, size, true, true, + iterate_cb, &diff)); + EXPECT_EQ(0, diff.size()); + + ASSERT_EQ(0, rbd_snap_remove(image, "snap1")); + ASSERT_EQ(0, rbd_snap_remove(image, "snap2")); + + ASSERT_EQ(0, rbd_close(image)); + ASSERT_EQ(0, rbd_remove(ioctx, image_name.c_str())); + + rados_ioctx_destroy(ioctx); +} + template class DiffIterateTest : public TestLibRBD { public: -- 2.39.5