From 05e7564ffe5265e81989eca720f2ac09aa1b32f2 Mon Sep 17 00:00:00 2001 From: Chunmei Liu Date: Wed, 3 Dec 2025 00:42:28 +0000 Subject: [PATCH] for test Signed-off-by: Chunmei Liu --- .../omap_manager/btree/btree_omap_manager.cc | 41 ++++++++++++--- .../btree/omap_btree_node_impl.cc | 51 ++++++++++++++----- 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc b/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc index ecf35d6a000..b9eb79d85ee 100644 --- a/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc +++ b/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc @@ -238,21 +238,28 @@ BtreeOMapManager::omap_rm_key_range( assert(last != ""); return seastar::do_with( key_range_t{first, last, 0, false, false}, - [this, &omap_root, &t, &first, &last](auto &key_range) { + [this, &omap_root, &t, &first, &last, FNAME](auto &key_range) { return trans_intr::repeat( - [this, &omap_root, &t, &key_range, &first, &last, first_enter = true]() mutable + [this, &omap_root, &t, &key_range, &first, &last, first_enter = true, FNAME]() mutable { if (first_enter) { key_range = key_range_t{first, last, 0, false, false}; first_enter = false; + DEBUGT("first enter key range remove first={}, last={}, complete={}, get_next={}", t, + key_range.first, key_range.last, key_range.total_complete, key_range.get_next); } + DEBUGT("start key range remove first={}, last={}, complete={}, get_next={}", t, + key_range.first, key_range.last, key_range.total_complete, key_range.get_next); return get_omap_root( get_omap_context(t, omap_root), omap_root - ).si_then([this, &omap_root, &t, &key_range](auto root) { - key_range.root_depth = omap_root.depth; + ).si_then([this, &omap_root, &t, &key_range, FNAME](auto root) { + DEBUGT("got omap root extent {}, depth = {}", t, *root, omap_root.get_depth()); + key_range.root_depth = omap_root.get_depth(); return root->rm_key_range(get_omap_context(t, omap_root), key_range); - }).si_then([this, &omap_root, &t](auto mresult) ->omap_rm_key_range_ret { + }).si_then([this, &omap_root, &t, FNAME, &key_range](auto mresult) ->omap_rm_key_range_ret { + DEBUGT("after key range remove first={}, last={}, complete={}, get_next={}, depth ={}", t, + key_range.first, key_range.last, key_range.total_complete, key_range.get_next, key_range.root_depth); if (mresult.status == mutation_status_t::SUCCESS) { return seastar::now(); } else if (mresult.status == mutation_status_t::WAS_SPLIT) { @@ -269,7 +276,8 @@ BtreeOMapManager::omap_rm_key_range( } else { return seastar::now(); } - }).si_then([&key_range]() -> omap_rm_key_range_iertr::future { + }).si_then([&key_range, &t, FNAME, this]() -> omap_rm_key_range_iertr::future { + DEBUGT("repeat check complete={}, get_next={}", t, key_range.total_complete, key_range.get_next); if (key_range.total_complete) { return omap_rm_key_range_iertr::make_ready_future( seastar::stop_iteration::yes); @@ -278,8 +286,29 @@ BtreeOMapManager::omap_rm_key_range( seastar::stop_iteration::no); } }); + }).si_then([this, &omap_root, &t, &first, &last, &key_range, FNAME](){ + DEBUGT("check key range remove first={}, last={}, complete={}, get_next={}, depht={}", t, + key_range.first, key_range.last, key_range.total_complete, key_range.get_next, key_range.root_depth); + auto config = OMapManager::omap_list_config_t() + .with_inclusive(true, false) + .without_max(); + return seastar::do_with( + std::make_optional(first), + std::make_optional(last), + [this, &omap_root, &t, config](auto &first, auto &last) { + return omap_list( + omap_root, + t, + first, + last, + config).si_then([](auto results){ + auto &[complete, kvs] = results; + assert(kvs.empty()); + return seastar::now(); + }); }); }); + }); } BtreeOMapManager::omap_iterate_ret 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 2cafdc8171d..81116aaffd3 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 @@ -233,19 +233,25 @@ OMapInnerNode::rm_key_range(omap_context_t oc, key_range_t &key_range) [this, oc, &key_range, child_pt] (auto extent) { ceph_assert(!extent->is_btree_root()); return extent->rm_key_range(oc, key_range) - .si_then([this, oc, child_pt, extent = std::move(extent), &key_range] (auto mresult) { + .si_then([this, oc, child_pt, extent = std::move(extent), &key_range, FNAME] (auto mresult) { if (!key_range.total_complete && key_range.get_next) { auto next_iter = child_pt + 1; if (next_iter != iter_cend()) { + DEBUGT("move to next child for key range remove, this: {}", oc.t, *this); key_range.first = (next_iter).get_key(); key_range.get_next = false; } else { - key_range.get_next = true; - } - if (get_meta().depth == key_range.root_depth && next_iter == iter_cend()) { - key_range.total_complete = true; + if (get_meta().depth == key_range.root_depth) { + DEBUGT("key range remove complete at root level, this: {}", oc.t, *this); + key_range.total_complete = true; + } else { + DEBUGT("move to up level for key range remove, this: {}", oc.t, *this); + key_range.get_next = true; + } } } + DEBUGT("key range remove first={}, last={}, complete={}, get_next={}, this: {}", oc.t, + key_range.first, key_range.last, key_range.total_complete, key_range.get_next, *this); switch (mresult.status) { case mutation_status_t::SUCCESS: case mutation_status_t::FAIL: @@ -848,7 +854,8 @@ OMapLeafNode::rm_key_range(omap_context_t oc, key_range_t &key_range) { LOG_PREFIX(OMapLeafNode::rm_key_range); - DEBUGT("remove kyes: {}--{}, this: {}", oc.t, key_range.first, key_range.last, *this); + DEBUGT("remove kyes: {}--{}, {}-{} this: {}", oc.t, key_range.first, key_range.last, + key_range.total_complete, key_range.get_next, *this); auto fiter = key_range.first.empty() ? iter_begin() : string_lower_bound(key_range.first); //include the first key auto liter = key_range.last.empty() ? iter_end() : string_lower_bound(key_range.last); //not include the last key @@ -861,6 +868,7 @@ OMapLeafNode::rm_key_range(omap_context_t oc, *this); if (fiter == iter_end() || fiter == liter) { //out of range or needn't remove anything key_range.total_complete = true; + DEBUGT("no keys to remove, set complete = {}, this: {}", oc.t, key_range.total_complete, *this); return rm_key_range_ret( interruptible::ready_future_marker{}, mutation_result_t(mutation_status_t::FAIL, std::nullopt, std::nullopt)); @@ -869,17 +877,32 @@ OMapLeafNode::rm_key_range(omap_context_t oc, auto mut = oc.tm.get_mutable_extent(oc.t, this)->cast(); return mut->rm_key_range(oc, key_range); } - auto dist = liter - fiter; - - (oc.t.get_omap_tree_stats().num_erases) += dist; - journal_leaf_remove_range(fiter, liter, maybe_get_delta_buffer()); - if ((!key_range.last.empty() && liter != iter_end()) || - (get_meta().depth == key_range.root_depth && liter == iter_end())){ + key_range.total_complete = false; + key_range.get_next = false; + if (liter == iter_end()) { + if (get_meta().depth == key_range.root_depth) { + DEBUGT("removed to the end, depth={}, root_depth={}", oc.t, get_meta().depth, + key_range.root_depth); + key_range.total_complete = true; + } else { + DEBUGT("removed to the end, depth={}, root_depth={}, set get_next=true", oc.t, + get_meta().depth, key_range.root_depth); + key_range.get_next = true; + key_range.first = ""; + } + } else { + // liter != iter_end() + DEBUGT("removed up to key {}, set complete = false, this: {}", oc.t, + liter->get_key(), *this); key_range.total_complete = true; - } else if (liter == iter_end()) { - key_range.get_next = true; } + DEBUGT("key range remove complete={}, get_next={}, this: {}", oc.t, + key_range.total_complete, key_range.get_next, *this); + + auto dist = liter - fiter; + (oc.t.get_omap_tree_stats().num_erases) += dist; + journal_leaf_remove_range(fiter, liter, maybe_get_delta_buffer()); if (extent_is_below_min()) { return rm_key_range_ret( -- 2.47.3