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));
}
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);