]> git-server-git.apps.pok.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)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Wed, 9 Nov 2022 05:49:35 +0000 (11:19 +0530)
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>
src/cls/rbd/cls_rbd.cc
src/test/cls_rbd/test_cls_rbd.cc

index 9f38c043a2577823e793cfe124a31dc28a9ff1f4..b4efc23ceb60b966164cc9ac300ef52a14c7c27f 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 8d44808da2ab02548dd5a4aff136b76e7fc857de..4d6f9bd89b0080da417ec8d7fa2fe48503714100 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;