]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
for test wip-liucm-omap-fix-crimson-only
authorChunmei Liu <chunmei.liu@ibm.com>
Wed, 3 Dec 2025 00:42:28 +0000 (00:42 +0000)
committerChunmei Liu <chunmei.liu@ibm.com>
Sat, 6 Dec 2025 06:52:13 +0000 (06:52 +0000)
Signed-off-by: Chunmei Liu <chunmei.liu@ibm.com>
src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc
src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc

index ecf35d6a000a50a72ce03f8b0ebe07d6f832acf8..b9eb79d85ee0f22627415ae01ed5e4d456bacf2e 100644 (file)
@@ -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<seastar::stop_iteration> {
+        }).si_then([&key_range, &t, FNAME, this]() -> omap_rm_key_range_iertr::future<seastar::stop_iteration> {
+          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>(
               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<std::string>(first),
+        std::make_optional<std::string>(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
index 2cafdc8171db4bdc0426966eedce78c9fa075b6d..81116aaffd3dad2b4dc30096c6149846d884d329 100644 (file)
@@ -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<OMapLeafNode>();
     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(