From 06fedbffe3d0e978ab49a12b11e3be4b41c4962b Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Sun, 19 Nov 2023 22:44:28 +0100 Subject: [PATCH] test/librbd: make ListSnapsWholeObject actually test stuff Despite being added in commit 66dd53d9c4d9 ("librbd: optionally return full object extent for any snapshot deltas") ostensibly to test the new LIST_SNAPS_FLAG_WHOLE_OBJECT code, it surely doesn't do that because the flag isn't even passed to MockObjectListSnapsRequest::create(). I can only guess, but it looks like snap ID 3 was intended to be a starting point. Otherwise, with 0 and CEPH_NOSNAP passed as snap IDs, the overlap that is set up for the clone wouldn't affect the computation in any way. Use snap ID 3 as a starting point and run both with and without LIST_SNAPS_FLAG_WHOLE_OBJECT on the same snapset to pinpoint the difference. Signed-off-by: Ilya Dryomov (cherry picked from commit bd52297a71100dd35874fa3aeda81fca1d828b38) --- src/test/librbd/io/test_mock_ObjectRequest.cc | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/src/test/librbd/io/test_mock_ObjectRequest.cc b/src/test/librbd/io/test_mock_ObjectRequest.cc index c9fa33c43e1cf..5b68f9f051e71 100644 --- a/src/test/librbd/io/test_mock_ObjectRequest.cc +++ b/src/test/librbd/io/test_mock_ObjectRequest.cc @@ -1919,7 +1919,7 @@ TEST_F(TestMockIoObjectRequest, ListSnapsWholeObject) { ASSERT_EQ(0, open_image(m_image_name, &ictx)); MockTestImageCtx mock_image_ctx(*ictx); - mock_image_ctx.parent = &mock_image_ctx; + mock_image_ctx.snaps = {3}; InSequence seq; @@ -1930,30 +1930,51 @@ TEST_F(TestMockIoObjectRequest, ListSnapsWholeObject) { clone_info.cloneid = 3; clone_info.snaps = {3}; clone_info.overlap = std::vector>{{0, 1}}; - clone_info.size = 4194304; + clone_info.size = mock_image_ctx.layout.object_size; snap_set.clones.push_back(clone_info); clone_info.cloneid = CEPH_NOSNAP; clone_info.snaps = {}; clone_info.overlap = {}; - clone_info.size = 4194304; + clone_info.size = mock_image_ctx.layout.object_size; snap_set.clones.push_back(clone_info); expect_list_snaps(mock_image_ctx, snap_set, 0); - SnapshotDelta snapshot_delta; - C_SaferCond ctx; - auto req = MockObjectListSnapsRequest::create( - &mock_image_ctx, 0, {{0, mock_image_ctx.layout.object_size - 1}}, - {0, CEPH_NOSNAP}, 0, {}, &snapshot_delta, &ctx); - req->send(); - ASSERT_EQ(0, ctx.wait()); + { + SnapshotDelta snapshot_delta; + C_SaferCond ctx; + auto req = MockObjectListSnapsRequest::create( + &mock_image_ctx, 0, {{0, mock_image_ctx.layout.object_size - 1}}, + {3, CEPH_NOSNAP}, 0, {}, &snapshot_delta, &ctx); + req->send(); + ASSERT_EQ(0, ctx.wait()); - SnapshotDelta expected_snapshot_delta; - expected_snapshot_delta[{CEPH_NOSNAP,CEPH_NOSNAP}].insert( - 0, mock_image_ctx.layout.object_size - 1, - {SPARSE_EXTENT_STATE_DATA, mock_image_ctx.layout.object_size - 1}); - ASSERT_EQ(expected_snapshot_delta, snapshot_delta); + SnapshotDelta expected_snapshot_delta; + expected_snapshot_delta[{CEPH_NOSNAP,CEPH_NOSNAP}].insert( + 1, mock_image_ctx.layout.object_size - 2, + {SPARSE_EXTENT_STATE_DATA, mock_image_ctx.layout.object_size - 2}); + EXPECT_EQ(expected_snapshot_delta, snapshot_delta); + } + + expect_list_snaps(mock_image_ctx, snap_set, 0); + + { + SnapshotDelta snapshot_delta; + C_SaferCond ctx; + auto req = MockObjectListSnapsRequest::create( + &mock_image_ctx, 0, {{0, mock_image_ctx.layout.object_size - 1}}, + {3, CEPH_NOSNAP}, LIST_SNAPS_FLAG_WHOLE_OBJECT, {}, &snapshot_delta, + &ctx); + req->send(); + ASSERT_EQ(0, ctx.wait()); + + SnapshotDelta expected_snapshot_delta; + expected_snapshot_delta[{CEPH_NOSNAP,CEPH_NOSNAP}].insert( + 0, mock_image_ctx.layout.object_size - 1, + {SPARSE_EXTENT_STATE_DATA, mock_image_ctx.layout.object_size - 1}); + EXPECT_EQ(expected_snapshot_delta, snapshot_delta); + } } } // namespace io -- 2.39.5