From bda4473dc83b77f19aa0947d167c9f94a4eeec87 Mon Sep 17 00:00:00 2001 From: Chanyoung Park Date: Mon, 21 Jul 2025 06:37:17 +0000 Subject: [PATCH] crimson/.../omap_btree_node_impl: fix inner node iterate Signed-off-by: Chanyoung Park --- .../btree/omap_btree_node_impl.cc | 6 ++- .../crimson/seastore/test_omap_manager.cc | 41 +++++++++++++------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc b/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc index 3b26c75b413c5..e1d27aa0fd057 100644 --- a/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc +++ b/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc @@ -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(std::move(ret)); } diff --git a/src/test/crimson/seastore/test_omap_manager.cc b/src/test/crimson/seastore/test_omap_manager.cc index bdd09bbb148cd..1df4de93aecbf 100644 --- a/src/test/crimson/seastore/test_omap_manager.cc +++ b/src/test/crimson/seastore/test_omap_manager.cc @@ -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 callback = [this, &start_from](std::string_view key, std::string_view val) { return this->check_iterate(key, val, start_from); -- 2.39.5