From ecba492fa56e971f4ecec46bbb8cd25994170d33 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Wed, 19 Oct 2022 13:24:40 +0530 Subject: [PATCH] cls/rbd: update last read in group::snap_list Problem: `rbd group snap ls` shows 1025 records after creating 65 snaps with `rbd group snap create` $ for i in {1..65}; do rbd group snap create test_group@group_snap$i; done $ rbd group snap ls test_group | wc -l 1025 Solution: update last_read after getting RBD_MAX_KEYS_READ with cls_cxx_map_get_vals. Fixes: https://tracker.ceph.com/issues/57066 Signed-off-by: Prasanna Kumar Kalever (cherry picked from commit 94029c4e4a922fd83f3c42c3f4b6bae6271903b7) --- src/cls/rbd/cls_rbd.cc | 3 +++ src/test/cls_rbd/test_cls_rbd.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 870383d3d185f..ebf7994c4fd6c 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -6957,6 +6957,9 @@ int snap_list(cls_method_context_t hctx, cls::rbd::GroupSnapshot start_after, group_snaps->push_back(snap); } + if (!vals.empty()) { + last_read = vals.rbegin()->first; + } } while (more && (group_snaps->size() < max_return)); return 0; diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index 1d60c8b2f6f89..66105947e4399 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -2747,6 +2747,32 @@ TEST_F(TestClsRbd, group_snap_list_max_return) { } } +TEST_F(TestClsRbd, group_snap_list_max_read) { + librados::IoCtx ioctx; + ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx)); + + string group_id = "group_id_snap_list_max_read"; + ASSERT_EQ(0, ioctx.create(group_id, true)); + + // 2 * RBD_MAX_KEYS_READ + a few + for (int i = 0; i < 150; ++i) { + string snap_id = "snap_id" + hexify(i); + cls::rbd::GroupSnapshot snap = {snap_id, + "test_snapshot" + hexify(i), + cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE}; + ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap)); + } + + std::vector snapshots; + ASSERT_EQ(0, group_snap_list(&ioctx, group_id, cls::rbd::GroupSnapshot(), 500, &snapshots)); + ASSERT_EQ(150U, snapshots.size()); + + for (int i = 0; i < 150; ++i) { + string snap_id = "snap_id" + hexify(i); + ASSERT_EQ(snap_id, snapshots[i].id); + } +} + TEST_F(TestClsRbd, group_snap_remove) { librados::IoCtx ioctx; -- 2.39.5