]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / crimson / os / seastore / lba_manager / btree / btree_lba_manager.h
index 640d567348f5d83f6c46ddcbdae18e70bf27b815..a036b337b819a01138471cacdb2427ced5e3113b 100644 (file)
@@ -21,6 +21,7 @@
 #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"
 
 namespace crimson::os::seastore::lba_manager::btree {
 
@@ -50,7 +51,7 @@ public:
   mkfs_ret mkfs(
     Transaction &t) final;
 
-  get_mapping_ret get_mapping(
+  get_mappings_ret get_mappings(
     Transaction &t,
     laddr_t offset, extent_len_t length) final;
 
@@ -58,16 +59,16 @@ public:
     Transaction &t,
     laddr_list_t &&list) final;
 
+  get_mapping_ret get_mapping(
+    Transaction &t,
+    laddr_t offset) final;
+
   alloc_extent_ret alloc_extent(
     Transaction &t,
     laddr_t hint,
     extent_len_t len,
     paddr_t addr) final;
 
-  set_extent_ret set_extent(
-    Transaction &t,
-    laddr_t off, extent_len_t len, paddr_t addr) final;
-
   ref_ret decref_extent(
     Transaction &t,
     laddr_t addr) final {
@@ -80,7 +81,7 @@ public:
     return update_refcount(t, addr, 1);
   }
 
-  complete_transaction_ret complete_transaction(
+  void complete_transaction(
     Transaction &t) final;
 
   init_cached_extent_ret init_cached_extent(
@@ -99,7 +100,13 @@ public:
 
   rewrite_extent_ret rewrite_extent(
     Transaction &t,
-    CachedExtentRef extent);
+    CachedExtentRef extent) final;
+
+  update_le_mapping_ret update_mapping(
+    Transaction& t,
+    laddr_t laddr,
+    paddr_t prev_addr,
+    paddr_t paddr) final;
 
   get_physical_extent_if_live_ret get_physical_extent_if_live(
     Transaction &t,
@@ -114,6 +121,7 @@ public:
     bpin->parent = nullptr;
   }
 
+  ~BtreeLBAManager();
 private:
   SegmentManager &segment_manager;
   Cache &cache;
@@ -121,35 +129,76 @@ private:
   btree_pin_set_t pin_set;
 
   op_context_t get_context(Transaction &t) {
-    return op_context_t{cache, pin_set, t};
+    return op_context_t{cache, t, &pin_set};
   }
 
   static btree_range_pin_t &get_pin(CachedExtent &e);
 
+  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();
+         });
+       });
+    });
+  }
 
-  /**
-   * get_root
-   *
-   * Get a reference to the root LBANode.
-   */
-  using get_root_ertr = Cache::get_extent_ertr;
-  using get_root_ret = get_root_ertr::future<LBANodeRef>;
-  get_root_ret get_root(Transaction &);
+  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));
+       });
+      });
+  }
 
-  /**
-   * insert_mapping
-   *
-   * Insert a lba mapping into the tree
-   */
-  using insert_mapping_ertr = crimson::errorator<
-    crimson::ct_error::input_output_error>;
-  using insert_mapping_ret = insert_mapping_ertr::future<LBAPinRef>;
-  insert_mapping_ret insert_mapping(
-    Transaction &t,   ///< [in,out] transaction
-    LBANodeRef root,  ///< [in] root node
-    laddr_t laddr,    ///< [in] logical addr to insert
-    lba_map_val_t val ///< [in] mapping to insert
-  );
+  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
@@ -167,21 +216,15 @@ private:
    *
    * Updates mapping, removes if f returns nullopt
    */
-  using update_mapping_ertr = ref_ertr;
-  using update_mapping_ret = ref_ertr::future<lba_map_val_t>;
-  using update_func_t = LBANode::mutate_func_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(
     Transaction &t,
     laddr_t addr,
     update_func_t &&f);
-
-  using update_internal_mapping_ertr = LBANode::mutate_internal_address_ertr;
-  using update_internal_mapping_ret = LBANode::mutate_internal_address_ret;
-  update_internal_mapping_ret update_internal_mapping(
-    Transaction &t,
-    depth_t depth,
-    laddr_t laddr,
-    paddr_t paddr);
 };
 using BtreeLBAManagerRef = std::unique_ptr<BtreeLBAManager>;