From 3662bc7b3dc3d335cd3a76a6248e6d5d26f3fe34 Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Mon, 22 Jul 2024 11:11:17 +0530 Subject: [PATCH] cls/rbd: save max group snap order Save the last used group snap order value to speed up snapshot creation. Signed-off-by: N Balachandran --- src/cls/rbd/cls_rbd.cc | 40 +++++++++++--------------------- src/test/cls_rbd/test_cls_rbd.cc | 19 ++++++++++----- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 7330db8c6d3a6..affb986aeffc4 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -6899,6 +6899,7 @@ int dir_remove(cls_method_context_t hctx, static const string RBD_GROUP_SNAP_KEY_PREFIX = "snapshot_"; static const string RBD_GROUP_SNAP_ORDER_KEY_PREFIX = "snap_order_"; +static const string RBD_GROUP_SNAP_MAX_ORDER_KEY = "snap_max_order"; std::string snap_key(const std::string &snap_id) { ostringstream oss; @@ -7482,37 +7483,22 @@ int group_snap_set(cls_method_context_t hctx, return -EEXIST; } - std::string last_read = group::snap_order_key(""); - bool more; uint64_t max_order = 0; - std::map vals; - do { - int r = cls_cxx_map_get_vals(hctx, last_read, - group::RBD_GROUP_SNAP_ORDER_KEY_PREFIX, - RBD_MAX_KEYS_READ, &vals, &more); - if (r < 0) { - return r; - } - for (auto &[key, bl] : vals) { - auto iter = bl.cbegin(); - uint64_t order; - try { - decode(order, iter); - } catch (const ceph::buffer::error &err) { - CLS_ERR("error decoding snapshot order: %s", key.c_str()); - return -EIO; - } - max_order = std::max(max_order, order); - } - if (!vals.empty()) { - last_read = vals.rbegin()->first; - } else { - ceph_assert(!more); - } - } while (more); + + r = read_key(hctx, group::RBD_GROUP_SNAP_MAX_ORDER_KEY, &max_order); + if (r < 0 && r != -ENOENT) { + return r; + } bufferlist bl; encode(++max_order, bl); + r = cls_cxx_map_set_val(hctx, group::RBD_GROUP_SNAP_MAX_ORDER_KEY, &bl); + if (r < 0) { + CLS_ERR("error setting key: %s : %s", + group::RBD_GROUP_SNAP_MAX_ORDER_KEY.c_str(), + cpp_strerror(r).c_str()); + return r; + } r = cls_cxx_map_set_val(hctx, order_key, &bl); if (r < 0) { CLS_ERR("error setting key: %s : %s", order_key.c_str(), diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index 05d811715da3a..3e46997750f70 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -2676,10 +2676,10 @@ TEST_F(TestClsRbd, group_snap_set) { set keys; ASSERT_EQ(0, ioctx.omap_get_keys(group_id, "", 10, &keys)); + ASSERT_EQ(3U, keys.size()); auto it = keys.begin(); - ASSERT_EQ(2U, keys.size()); - + ASSERT_EQ("snap_max_order", *it++); ASSERT_EQ("snap_order_" + snap.id, *it++); ASSERT_EQ("snapshot_" + snap.id, *it); } @@ -2785,10 +2785,10 @@ TEST_F(TestClsRbd, group_snap_remove) { set keys; ASSERT_EQ(0, ioctx.omap_get_keys(group_id, "", 10, &keys)); + ASSERT_EQ(3U, keys.size()); auto it = keys.begin(); - ASSERT_EQ(2U, keys.size()); - + ASSERT_EQ("snap_max_order", *it++); ASSERT_EQ("snap_order_" + snap.id, *it++); ASSERT_EQ("snapshot_" + snap.id, *it); @@ -2798,7 +2798,8 @@ TEST_F(TestClsRbd, group_snap_remove) { ASSERT_EQ(0, ioctx.omap_get_keys(group_id, "", 10, &keys)); - ASSERT_EQ(0U, keys.size()); + ASSERT_EQ(1U, keys.size()); + ASSERT_EQ("snap_max_order", *keys.begin()); } TEST_F(TestClsRbd, group_snap_remove_without_order) { @@ -2818,13 +2819,19 @@ TEST_F(TestClsRbd, group_snap_remove_without_order) { ASSERT_EQ(0, ioctx.omap_rm_keys(group_id, keys)); ASSERT_EQ(0, ioctx.omap_get_keys(group_id, "", 10, &keys)); - ASSERT_EQ(1U, keys.size()); + ASSERT_EQ(2U, keys.size()); auto it = keys.begin(); + ASSERT_EQ("snap_max_order", *it++); ASSERT_EQ("snapshot_" + snap.id, *it); // Remove the snapshot ASSERT_EQ(0, group_snap_remove(&ioctx, group_id, snap_id)); + + ASSERT_EQ(0, ioctx.omap_get_keys(group_id, "", 10, &keys)); + ASSERT_EQ(1U, keys.size()); + + ASSERT_EQ("snap_max_order", *keys.begin()); } TEST_F(TestClsRbd, group_snap_get_by_id) { -- 2.39.5