]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / crimson / os / seastore / lba_manager / btree / btree_lba_manager.h
index a036b337b819a01138471cacdb2427ced5e3113b..b48abf9456bbe7b9a092453d47da48044fd1aa45 100644 (file)
 #include "common/interval_map.h"
 #include "crimson/osd/exceptions.h"
 
+#include "crimson/os/seastore/btree/fixed_kv_btree.h"
 #include "crimson/os/seastore/seastore_types.h"
 #include "crimson/os/seastore/lba_manager.h"
 #include "crimson/os/seastore/cache.h"
-#include "crimson/os/seastore/segment_manager.h"
 
 #include "crimson/os/seastore/lba_manager/btree/lba_btree_node.h"
-#include "crimson/os/seastore/lba_manager/btree/lba_btree.h"
+#include "crimson/os/seastore/btree/btree_range_pin.h"
 
 namespace crimson::os::seastore::lba_manager::btree {
 
+class BtreeLBAMapping : public BtreeNodeMapping<laddr_t, paddr_t> {
+public:
+  BtreeLBAMapping(op_context_t<laddr_t> ctx)
+    : BtreeNodeMapping(ctx) {}
+  BtreeLBAMapping(
+    op_context_t<laddr_t> c,
+    CachedExtentRef parent,
+    uint16_t pos,
+    lba_map_val_t &val,
+    lba_node_meta_t &&meta)
+    : BtreeNodeMapping(
+       c,
+       parent,
+       pos,
+       val.paddr,
+       val.len,
+       std::forward<lba_node_meta_t>(meta))
+  {}
+};
+
+using LBABtree = FixedKVBtree<
+  laddr_t, lba_map_val_t, LBAInternalNode,
+  LBALeafNode, BtreeLBAMapping, LBA_BLOCK_SIZE, true>;
+
 /**
  * BtreeLBAManager
  *
@@ -44,9 +68,11 @@ namespace crimson::os::seastore::lba_manager::btree {
  */
 class BtreeLBAManager : public LBAManager {
 public:
-  BtreeLBAManager(
-    SegmentManager &segment_manager,
-    Cache &cache);
+  BtreeLBAManager(Cache &cache)
+    : cache(cache)
+  {
+    register_metrics();
+  }
 
   mkfs_ret mkfs(
     Transaction &t) final;
@@ -67,7 +93,8 @@ public:
     Transaction &t,
     laddr_t hint,
     extent_len_t len,
-    paddr_t addr) final;
+    paddr_t addr,
+    LogicalCachedExtent*) final;
 
   ref_ret decref_extent(
     Transaction &t,
@@ -81,124 +108,58 @@ public:
     return update_refcount(t, addr, 1);
   }
 
-  void complete_transaction(
-    Transaction &t) final;
-
+  /**
+   * init_cached_extent
+   *
+   * Checks whether e is live (reachable from lba tree) and drops or initializes
+   * accordingly.
+   *
+   * Returns if e is live.
+   */
   init_cached_extent_ret init_cached_extent(
     Transaction &t,
     CachedExtentRef e) final;
 
+  check_child_trackers_ret check_child_trackers(Transaction &t) final;
+
   scan_mappings_ret scan_mappings(
     Transaction &t,
     laddr_t begin,
     laddr_t end,
     scan_mappings_func_t &&f) final;
 
-  scan_mapped_space_ret scan_mapped_space(
-    Transaction &t,
-    scan_mapped_space_func_t &&f) final;
-
   rewrite_extent_ret rewrite_extent(
     Transaction &t,
     CachedExtentRef extent) final;
 
-  update_le_mapping_ret update_mapping(
+  update_mapping_ret update_mapping(
     Transaction& t,
     laddr_t laddr,
     paddr_t prev_addr,
-    paddr_t paddr) final;
+    paddr_t paddr,
+    LogicalCachedExtent*) final;
 
   get_physical_extent_if_live_ret get_physical_extent_if_live(
     Transaction &t,
     extent_types_t type,
     paddr_t addr,
     laddr_t laddr,
-    segment_off_t len) final;
-
-  void add_pin(LBAPin &pin) final {
-    auto *bpin = reinterpret_cast<BtreeLBAPin*>(&pin);
-    pin_set.add_pin(bpin->pin);
-    bpin->parent = nullptr;
-  }
-
-  ~BtreeLBAManager();
+    extent_len_t len) final;
 private:
-  SegmentManager &segment_manager;
   Cache &cache;
 
-  btree_pin_set_t pin_set;
 
-  op_context_t get_context(Transaction &t) {
-    return op_context_t{cache, t, &pin_set};
-  }
+  struct {
+    uint64_t num_alloc_extents = 0;
+    uint64_t num_alloc_extents_iter_nexts = 0;
+  } stats;
 
-  static btree_range_pin_t &get_pin(CachedExtent &e);
+  op_context_t<laddr_t> get_context(Transaction &t) {
+    return op_context_t<laddr_t>{cache, t};
+  }
 
   seastar::metrics::metric_group metrics;
   void register_metrics();
-  template <typename F, typename... Args>
-  auto with_btree(
-    op_context_t c,
-    F &&f) {
-    return cache.get_root(
-      c.trans
-    ).si_then([this, c, f=std::forward<F>(f)](RootBlockRef croot) mutable {
-      return seastar::do_with(
-       LBABtree(croot->get_root().lba_root),
-       [this, c, croot, f=std::move(f)](auto &btree) mutable {
-         return f(
-           btree
-         ).si_then([this, c, croot, &btree] {
-           if (btree.is_root_dirty()) {
-             auto mut_croot = cache.duplicate_for_write(
-               c.trans, croot
-             )->cast<RootBlock>();
-             mut_croot->get_root().lba_root = btree.get_root_undirty();
-           }
-           return base_iertr::now();
-         });
-       });
-    });
-  }
-
-  template <typename State, typename F>
-  auto with_btree_state(
-    op_context_t c,
-    State &&init,
-    F &&f) {
-    return seastar::do_with(
-      std::forward<State>(init),
-      [this, c, f=std::forward<F>(f)](auto &state) mutable {
-       (void)this; // silence incorrect clang warning about capture
-       return with_btree(c, [&state, f=std::move(f)](auto &btree) mutable {
-         return f(btree, state);
-       }).si_then([&state] {
-         return seastar::make_ready_future<State>(std::move(state));
-       });
-      });
-  }
-
-  template <typename State, typename F>
-  auto with_btree_state(
-    op_context_t c,
-    F &&f) {
-    return with_btree_state<State, F>(c, State{}, std::forward<F>(f));
-  }
-
-  template <typename Ret, typename F>
-  auto with_btree_ret(
-    op_context_t c,
-    F &&f) {
-    return with_btree_state<Ret>(
-      c,
-      [f=std::forward<F>(f)](auto &btree, auto &ret) mutable {
-       return f(
-         btree
-       ).si_then([&ret](auto &&_ret) {
-         ret = std::move(_ret);
-       });
-      });
-  }
 
   /**
    * update_refcount
@@ -212,19 +173,20 @@ private:
     int delta);
 
   /**
-   * update_mapping
+   * _update_mapping
    *
    * Updates mapping, removes if f returns nullopt
    */
-  using update_mapping_iertr = ref_iertr;
-  using update_mapping_ret = ref_iertr::future<lba_map_val_t>;
+  using _update_mapping_iertr = ref_iertr;
+  using _update_mapping_ret = ref_iertr::future<lba_map_val_t>;
   using update_func_t = std::function<
     lba_map_val_t(const lba_map_val_t &v)
     >;
-  update_mapping_ret update_mapping(
+  _update_mapping_ret _update_mapping(
     Transaction &t,
     laddr_t addr,
-    update_func_t &&f);
+    update_func_t &&f,
+    LogicalCachedExtent*);
 };
 using BtreeLBAManagerRef = std::unique_ptr<BtreeLBAManager>;