]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../omap_btree_node_impl: fix inner node iterate 64593/head
authorChanyoung Park <chaney.p@kakaoenterprise.com>
Mon, 21 Jul 2025 06:37:17 +0000 (06:37 +0000)
committerChanyoung Park <chaney.p@kakaoenterprise.com>
Mon, 21 Jul 2025 06:37:17 +0000 (06:37 +0000)
Signed-off-by: Chanyoung Park <chaney.p@kakaoenterprise.com>
src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc
src/test/crimson/seastore/test_omap_manager.cc

index 3b26c75b413c5e7d73c07bef10058fe10743436b..e1d27aa0fd057da8b465c15acb924402da48a00a 100644 (file)
@@ -817,10 +817,12 @@ OMapLeafNode::iterate(
       break;
     }
   }
-  if (!key.empty()) {
+  if (iter == iter_end()) {
+    start_from.seek_position = get_end();
+  } else {
     start_from.seek_position = key;
   }
-  start_from.seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND;
+  start_from.seek_type = ObjectStore::omap_iter_seek_t::LOWER_BOUND;
 
   return iterate_iertr::make_ready_future<ObjectStore::omap_iter_ret_t>(std::move(ret));
 }
index bdd09bbb148cd90cdd25616aa23ab72bf097c4a4..1df4de93aecbf5382fdc43f27adc24eb53e10b15 100644 (file)
@@ -726,20 +726,37 @@ TEST_P(omap_manager_test_t, omap_iterate)
     std::string upper_key;
     ObjectStore::omap_iter_seek_t start_from;
 
-    for (unsigned i = 0; i < 40; i++) {
-      auto t = create_mutate_transaction();
-      logger().debug("opened transaction");
-      for (unsigned j = 0; j < 10; ++j) {
-        auto key = set_random_key(omap_root, *t);
-        if (i == 3) {
-          lower_key = key;
-        }
-        if (i == 5) {
-          upper_key = key;
-        }
+    auto insert_batches = [&](unsigned num_batches) {
+      for (unsigned i = 0; i < num_batches; ++i) {
+        auto t = create_mutate_transaction();
+        logger().debug("opened transaction");
+        for (unsigned j = 0; j < 64; ++j) {
+         // Use large value size to accelerate tree growth.
+          auto key = rand_name(STR_LEN);
+          set_key(omap_root, *t, key, rand_buffer(512));
+          if (i == 3) {
+            lower_key = key;
+          }
+         if (i == 5) {
+           upper_key = key;
+         }
+       }
+        submit_transaction(std::move(t));
       }
-      submit_transaction(std::move(t));
+    };
+
+    while (omap_root.get_depth() < 3) {
+      insert_batches(10);
+    }
+    // Insert the same number of random key-value pairs again
+    // to ensure that depth 2 contains more than two inner nodes.
+    // This is necessary to evaluate iteration that spans across
+    // multiple inner nodes.
+    auto target_size = test_omap_mappings.size() * 2;
+    while (test_omap_mappings.size() < target_size) {
+      insert_batches(10);
     }
+
     std::function<ObjectStore::omap_iter_ret_t(std::string_view, std::string_view)> callback =
       [this, &start_from](std::string_view key, std::string_view val) {
         return this->check_iterate(key, val, start_from);