From 8d9a27f5ea9d860f2c407346b8b7ef7b99afcbce Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 10 Jun 2019 17:25:45 -0500 Subject: [PATCH] ceph_test_rados_api_snapshots_pp: (partial) test to reproduce stray clones The test creates a snap, removes it, waits for it to (hopefully) purge, and then uses that snapid in a snapc to generate a clone. This isn't a complete test because (1) it doesn't wait for the purge to happen (e.g., by watching the osdmaps go by), and (2) it doesn't trigger an osd scrub_purged_snaps afterwards. Signed-off-by: Sage Weil --- src/test/librados/snapshots_cxx.cc | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/test/librados/snapshots_cxx.cc b/src/test/librados/snapshots_cxx.cc index be3087f91400e..032e96a255636 100644 --- a/src/test/librados/snapshots_cxx.cc +++ b/src/test/librados/snapshots_cxx.cc @@ -454,6 +454,50 @@ TEST_F(LibRadosSnapshotsSelfManagedPP, OrderSnap) { comp4->release(); } +TEST_F(LibRadosSnapshotsSelfManagedPP, ReusePurgedSnap) { + std::vector my_snaps; + my_snaps.push_back(-2); + ASSERT_FALSE(cluster.get_pool_is_selfmanaged_snaps_mode(pool_name)); + ASSERT_EQ(0, ioctx.selfmanaged_snap_create(&my_snaps.back())); + ASSERT_TRUE(cluster.get_pool_is_selfmanaged_snaps_mode(pool_name)); + ::std::reverse(my_snaps.begin(), my_snaps.end()); + ASSERT_EQ(0, ioctx.selfmanaged_snap_set_write_ctx(my_snaps[0], my_snaps)); + ::std::reverse(my_snaps.begin(), my_snaps.end()); + char buf[bufsize]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl1; + bl1.append(buf, sizeof(buf)); + ASSERT_EQ(0, ioctx.write("foo", bl1, sizeof(buf), 0)); + + my_snaps.push_back(-2); + librados::AioCompletion *completion = cluster.aio_create_completion(); + ioctx.aio_selfmanaged_snap_create(&my_snaps.back(), completion); + ASSERT_EQ(0, completion->wait_for_complete()); + completion->release(); + + std::cout << "deleting snap " << my_snaps.back() << " in pool " + << ioctx.get_pool_name() << std::endl; + completion = cluster.aio_create_completion(); + ioctx.aio_selfmanaged_snap_remove(my_snaps.back(), completion); + ASSERT_EQ(0, completion->wait_for_complete()); + completion->release(); + + std::cout << "waiting for snaps to purge" << std::endl; + sleep(15); + + ::std::reverse(my_snaps.begin(), my_snaps.end()); + ASSERT_EQ(0, ioctx.selfmanaged_snap_set_write_ctx(my_snaps[0], my_snaps)); + ::std::reverse(my_snaps.begin(), my_snaps.end()); + char buf2[sizeof(buf)]; + memset(buf2, 0xdd, sizeof(buf2)); + bufferlist bl2; + bl2.append(buf2, sizeof(buf2)); + ASSERT_EQ(0, ioctx.write("foo", bl2, sizeof(buf2), 0)); + + // scrub it out? + //sleep(600); +} + // EC testing TEST_F(LibRadosSnapshotsECPP, SnapListPP) { char buf[bufsize]; -- 2.39.5