]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / crimson / os / seastore / omap_manager / btree / btree_omap_manager.cc
index e666879b1e111a27e5c7ae3176bfb6468e59ec45..1782d7ee66ef9f83a6ecec9db62a40b07ec780c4 100644 (file)
@@ -9,11 +9,7 @@
 #include "crimson/os/seastore/omap_manager/btree/btree_omap_manager.h"
 #include "crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.h"
 
-namespace {
-  seastar::logger& logger() {
-    return crimson::get_logger(ceph_subsys_seastore_omap);
-  }
-}
+SET_SUBSYS(seastore_omap);
 
 namespace crimson::os::seastore::omap_manager {
 
@@ -24,15 +20,17 @@ BtreeOMapManager::BtreeOMapManager(
 BtreeOMapManager::initialize_omap_ret
 BtreeOMapManager::initialize_omap(Transaction &t, laddr_t hint)
 {
-
-  logger().debug("{}", __func__);
-  return tm.alloc_extent<OMapLeafNode>(t, hint, OMAP_BLOCK_SIZE)
-    .si_then([hint](auto&& root_extent) {
+  LOG_PREFIX(BtreeOMapManager::initialize_omap);
+  DEBUGT("hint: {}", t, hint);
+  return tm.alloc_extent<OMapLeafNode>(t, hint, OMAP_LEAF_BLOCK_SIZE)
+    .si_then([hint, &t](auto&& root_extent) {
       root_extent->set_size(0);
       omap_node_meta_t meta{1};
       root_extent->set_meta(meta);
       omap_root_t omap_root;
       omap_root.update(root_extent->get_laddr(), 1, hint);
+      t.get_omap_tree_stats().depth = 1u;
+      t.get_omap_tree_stats().extents_num_delta++;
       return initialize_omap_iertr::make_ready_future<omap_root_t>(omap_root);
   });
 }
@@ -51,8 +49,11 @@ BtreeOMapManager::handle_root_split(
   omap_root_t &omap_root,
   const OMapNode::mutation_result_t& mresult)
 {
-  return oc.tm.alloc_extent<OMapInnerNode>(oc.t, omap_root.hint, OMAP_BLOCK_SIZE)
-    .si_then([&omap_root, mresult](auto&& nroot) -> handle_root_split_ret {
+  LOG_PREFIX(BtreeOMapManager::handle_root_split);
+  DEBUGT("{}", oc.t, omap_root);
+  return oc.tm.alloc_extent<OMapInnerNode>(oc.t, omap_root.hint,
+                                           OMAP_INNER_BLOCK_SIZE)
+    .si_then([&omap_root, mresult, oc](auto&& nroot) -> handle_root_split_ret {
     auto [left, right, pivot] = *(mresult.split_tuple);
     omap_node_meta_t meta{omap_root.depth + 1};
     nroot->set_meta(meta);
@@ -61,6 +62,8 @@ BtreeOMapManager::handle_root_split(
     nroot->journal_inner_insert(nroot->iter_begin() + 1, right->get_laddr(),
                                 pivot, nroot->maybe_get_delta_buffer());
     omap_root.update(nroot->get_laddr(), omap_root.get_depth() + 1, omap_root.hint);
+    oc.t.get_omap_tree_stats().depth = omap_root.depth;
+    ++(oc.t.get_omap_tree_stats().extents_num_delta);
     return seastar::now();
   });
 }
@@ -71,12 +74,16 @@ BtreeOMapManager::handle_root_merge(
   omap_root_t &omap_root, 
   OMapNode::mutation_result_t mresult)
 {
+  LOG_PREFIX(BtreeOMapManager::handle_root_merge);
+  DEBUGT("{}", oc.t, omap_root);
   auto root = *(mresult.need_merge);
   auto iter = root->cast<OMapInnerNode>()->iter_begin();
   omap_root.update(
     iter->get_val(),
     omap_root.depth -= 1,
     omap_root.hint);
+  oc.t.get_omap_tree_stats().depth = omap_root.depth;
+  oc.t.get_omap_tree_stats().extents_num_delta--;
   return oc.tm.dec_ref(oc.t, root->get_laddr()
   ).si_then([](auto &&ret) -> handle_root_merge_ret {
     return seastar::now();
@@ -94,7 +101,8 @@ BtreeOMapManager::omap_get_value(
   Transaction &t,
   const std::string &key)
 {
-  logger().debug("{}: {}", __func__, key);
+  LOG_PREFIX(BtreeOMapManager::omap_get_value);
+  DEBUGT("key={}", t, key);
   return get_omap_root(
     get_omap_context(t, omap_root.hint),
     omap_root
@@ -130,7 +138,8 @@ BtreeOMapManager::omap_set_key(
   const std::string &key,
   const ceph::bufferlist &value)
 {
-  logger().debug("{}: {} -> {}", __func__, key, value);
+  LOG_PREFIX(BtreeOMapManager::omap_set_key);
+  DEBUGT("{} -> {}", t, key, value);
   return get_omap_root(
     get_omap_context(t, omap_root.hint),
     omap_root
@@ -152,7 +161,8 @@ BtreeOMapManager::omap_rm_key(
   Transaction &t,
   const std::string &key)
 {
-  logger().debug("{}: {}", __func__, key);
+  LOG_PREFIX(BtreeOMapManager::omap_rm_key);
+  DEBUGT("{}", t, key);
   return get_omap_root(
     get_omap_context(t, omap_root.hint),
     omap_root
@@ -177,21 +187,76 @@ BtreeOMapManager::omap_rm_key(
 
 }
 
+BtreeOMapManager::omap_rm_key_range_ret
+BtreeOMapManager::omap_rm_key_range(
+  omap_root_t &omap_root,
+  Transaction &t,
+  const std::string &first,
+  const std::string &last,
+  omap_list_config_t config)
+{
+  LOG_PREFIX(BtreeOMapManager::omap_rm_key_range);
+  DEBUGT("{} ~ {}", t, first, last);
+  assert(first <= last);
+  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([this, &omap_root, &t](auto results) {
+    LOG_PREFIX(BtreeOMapManager::omap_rm_key_range);
+    auto &[complete, kvs] = results;
+    std::vector<std::string> keys;
+    for (const auto& [k, _] : kvs) {
+      keys.push_back(k);
+    }
+    DEBUGT("total {} keys to remove", t, keys.size());
+    return seastar::do_with(
+      std::move(keys),
+      [this, &omap_root, &t](auto& keys) {
+      return trans_intr::do_for_each(
+       keys.begin(),
+       keys.end(),
+       [this, &omap_root, &t](auto& key) {
+       return omap_rm_key(omap_root, t, key);
+      });
+    });
+  });
+}
+
 BtreeOMapManager::omap_list_ret
 BtreeOMapManager::omap_list(
   const omap_root_t &omap_root,
   Transaction &t,
-  const std::optional<std::string> &start,
+  const std::optional<std::string> &first,
+  const std::optional<std::string> &last,
   omap_list_config_t config)
 {
-  logger().debug("{}", __func__);
+  LOG_PREFIX(BtreeOMapManager::omap_list);
+  if (first && last) {
+    DEBUGT("{}, first: {}, last: {}", t, omap_root, *first, *last);
+    assert(last >= first);
+  } else if (first) {
+    DEBUGT("{}, first: {}", t, omap_root, *first);
+  } else if (last) {
+    DEBUGT("{}, last: {}", t, omap_root, *last);
+  } else {
+    DEBUGT("{}", t, omap_root);
+  }
+
   return get_omap_root(
     get_omap_context(t, omap_root.hint),
     omap_root
-  ).si_then([this, config, &t, &start, &omap_root](auto extent) {
+  ).si_then([this, config, &t, &first, &last, &omap_root](auto extent) {
     return extent->list(
       get_omap_context(t, omap_root.hint),
-      start,
+      first,
+      last,
       config);
   });
 }
@@ -201,7 +266,8 @@ BtreeOMapManager::omap_clear(
   omap_root_t &omap_root,
   Transaction &t)
 {
-  logger().debug("{}", __func__);
+  LOG_PREFIX(BtreeOMapManager::omap_clear);
+  DEBUGT("{}", t, omap_root);
   return get_omap_root(
     get_omap_context(t, omap_root.hint),
     omap_root