]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls/rbd: update last read in group::snap_list
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Wed, 19 Oct 2022 07:54:40 +0000 (13:24 +0530)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 2 Dec 2022 14:12:29 +0000 (15:12 +0100)
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 <prasanna.kalever@redhat.com>
(cherry picked from commit 94029c4e4a922fd83f3c42c3f4b6bae6271903b7)

src/cls/rbd/cls_rbd.cc
src/test/cls_rbd/test_cls_rbd.cc

index 870383d3d185f1d4efd67a54791e249d45100111..ebf7994c4fd6cee3a919fabd93f222a98cd87137 100644 (file)
@@ -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;
index 1d60c8b2f6f8927c7dbd064776662e5182e74dec..66105947e439986f113d63065104432bde3fe383 100644 (file)
@@ -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<cls::rbd::GroupSnapshot> 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;