Skip to content

Commit 1fc5167

Browse files
authored
Merge pull request ceph#64593 from chanyoung/fix-omap-iterate
crimson/.../omap_btree_node_impl: fix inner node iterate Reviewed-by: Xuehan Xu <[email protected]>
2 parents e713362 + bda4473 commit 1fc5167

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -817,10 +817,12 @@ OMapLeafNode::iterate(
817817
break;
818818
}
819819
}
820-
if (!key.empty()) {
820+
if (iter == iter_end()) {
821+
start_from.seek_position = get_end();
822+
} else {
821823
start_from.seek_position = key;
822824
}
823-
start_from.seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND;
825+
start_from.seek_type = ObjectStore::omap_iter_seek_t::LOWER_BOUND;
824826

825827
return iterate_iertr::make_ready_future<ObjectStore::omap_iter_ret_t>(std::move(ret));
826828
}

src/test/crimson/seastore/test_omap_manager.cc

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -726,20 +726,37 @@ TEST_P(omap_manager_test_t, omap_iterate)
726726
std::string upper_key;
727727
ObjectStore::omap_iter_seek_t start_from;
728728

729-
for (unsigned i = 0; i < 40; i++) {
730-
auto t = create_mutate_transaction();
731-
logger().debug("opened transaction");
732-
for (unsigned j = 0; j < 10; ++j) {
733-
auto key = set_random_key(omap_root, *t);
734-
if (i == 3) {
735-
lower_key = key;
736-
}
737-
if (i == 5) {
738-
upper_key = key;
739-
}
729+
auto insert_batches = [&](unsigned num_batches) {
730+
for (unsigned i = 0; i < num_batches; ++i) {
731+
auto t = create_mutate_transaction();
732+
logger().debug("opened transaction");
733+
for (unsigned j = 0; j < 64; ++j) {
734+
// Use large value size to accelerate tree growth.
735+
auto key = rand_name(STR_LEN);
736+
set_key(omap_root, *t, key, rand_buffer(512));
737+
if (i == 3) {
738+
lower_key = key;
739+
}
740+
if (i == 5) {
741+
upper_key = key;
742+
}
743+
}
744+
submit_transaction(std::move(t));
740745
}
741-
submit_transaction(std::move(t));
746+
};
747+
748+
while (omap_root.get_depth() < 3) {
749+
insert_batches(10);
750+
}
751+
// Insert the same number of random key-value pairs again
752+
// to ensure that depth 2 contains more than two inner nodes.
753+
// This is necessary to evaluate iteration that spans across
754+
// multiple inner nodes.
755+
auto target_size = test_omap_mappings.size() * 2;
756+
while (test_omap_mappings.size() < target_size) {
757+
insert_batches(10);
742758
}
759+
743760
std::function<ObjectStore::omap_iter_ret_t(std::string_view, std::string_view)> callback =
744761
[this, &start_from](std::string_view key, std::string_view val) {
745762
return this->check_iterate(key, val, start_from);

0 commit comments

Comments
 (0)