]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: pass depth/begin/end to get_*_node
authorSamuel Just <sjust@redhat.com>
Fri, 10 Dec 2021 21:51:31 +0000 (13:51 -0800)
committerSamuel Just <sjust@redhat.com>
Fri, 10 Dec 2021 22:56:15 +0000 (14:56 -0800)
We'll need this to populate the pin fields prior to read.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba_manager/btree/lba_btree.cc
src/crimson/os/seastore/lba_manager/btree/lba_btree.h

index 8f48affe1f4a39d6e9ee1dca2d105b258586eb13..21587962ce2b29957a57d51759e556469f333027 100644 (file)
@@ -469,7 +469,9 @@ LBABtree::rewrite_lba_extent_ret LBABtree::rewrite_lba_extent(
 LBABtree::get_internal_node_ret LBABtree::get_internal_node(
   op_context_t c,
   depth_t depth,
-  paddr_t offset)
+  paddr_t offset,
+  laddr_t begin,
+  laddr_t end)
 {
   LOG_PREFIX(LBATree::get_internal_node);
   DEBUGT(
@@ -516,7 +518,9 @@ LBABtree::get_internal_node_ret LBABtree::get_internal_node(
 
 LBABtree::get_leaf_node_ret LBABtree::get_leaf_node(
   op_context_t c,
-  paddr_t offset)
+  paddr_t offset,
+  laddr_t begin,
+  laddr_t end)
 {
   LOG_PREFIX(LBATree::get_leaf_node);
   DEBUGT(
@@ -709,23 +713,29 @@ template <typename NodeType>
 LBABtree::base_iertr::future<typename NodeType::Ref> get_node(
   op_context_t c,
   depth_t depth,
-  paddr_t addr);
+  paddr_t addr,
+  laddr_t begin,
+  laddr_t end);
 
 template <>
 LBABtree::base_iertr::future<LBALeafNodeRef> get_node<LBALeafNode>(
   op_context_t c,
   depth_t depth,
-  paddr_t addr) {
+  paddr_t addr,
+  laddr_t begin,
+  laddr_t end) {
   assert(depth == 1);
-  return LBABtree::get_leaf_node(c, addr);
+  return LBABtree::get_leaf_node(c, addr, begin, end);
 }
 
 template <>
 LBABtree::base_iertr::future<LBAInternalNodeRef> get_node<LBAInternalNode>(
   op_context_t c,
   depth_t depth,
-  paddr_t addr) {
-  return LBABtree::get_internal_node(c, depth, addr);
+  paddr_t addr,
+  laddr_t begin,
+  laddr_t end) {
+  return LBABtree::get_internal_node(c, depth, addr, begin, end);
 }
 
 template <typename NodeType>
@@ -746,12 +756,19 @@ LBABtree::handle_merge_ret merge_level(
   assert(iter.get_offset() < parent_pos.node->get_size());
   bool donor_is_left = ((iter.get_offset() + 1) == parent_pos.node->get_size());
   auto donor_iter = donor_is_left ? (iter - 1) : (iter + 1);
-
+  auto next_iter = donor_iter + 1;
+  auto begin = donor_iter->get_key();
+  auto end = next_iter == parent_pos.node->end()
+    ? parent_pos.node->get_node_meta().end
+    : next_iter->get_key();
+  
   DEBUGT("parent: {}, node: {}", c.trans, *parent_pos.node, *pos.node);
   return get_node<NodeType>(
     c,
     depth,
-    donor_iter.get_val().maybe_relative_to(parent_pos.node->get_paddr())
+    donor_iter.get_val().maybe_relative_to(parent_pos.node->get_paddr()),
+    begin,
+    end
   ).si_then([c, iter, donor_iter, donor_is_left, &parent_pos, &pos](
              typename NodeType::Ref donor) {
     LOG_PREFIX(LBABtree::merge_level);
index f78f49ddc96075ae4f8f4a6584c310954a9ad724..96b92c73d3162a9d3eb411fcd0d8d2dd4f099b17 100644 (file)
@@ -421,13 +421,17 @@ private:
   static get_internal_node_ret get_internal_node(
     op_context_t c,
     depth_t depth,
-    paddr_t offset);
+    paddr_t offset,
+    laddr_t begin,
+    laddr_t end);
 
   using get_leaf_node_iertr = base_iertr;
   using get_leaf_node_ret = get_leaf_node_iertr::future<LBALeafNodeRef>;
   static get_leaf_node_ret get_leaf_node(
     op_context_t c,
-    paddr_t offset);
+    paddr_t offset,
+    laddr_t begin,
+    laddr_t end);
 
   using lookup_root_iertr = base_iertr;
   using lookup_root_ret = lookup_root_iertr::future<>;
@@ -439,7 +443,9 @@ private:
       return get_internal_node(
        c,
        root.get_depth(),
-       root.get_location()
+       root.get_location(),
+       0,
+       L_ADDR_MAX
       ).si_then([this, visitor, &iter](LBAInternalNodeRef root_node) {
        iter.get_internal(root.get_depth()).node = root_node;
        if (visitor) (*visitor)(root_node->get_paddr(), root_node->get_length());
@@ -448,7 +454,9 @@ private:
     } else {
       return get_leaf_node(
        c,
-       root.get_location()
+       root.get_location(),
+       0,
+       L_ADDR_MAX
       ).si_then([visitor, &iter](LBALeafNodeRef root_node) {
        iter.leaf.node = root_node;
        if (visitor) (*visitor)(root_node->get_paddr(), root_node->get_length());
@@ -471,10 +479,17 @@ private:
     auto &parent_entry = iter.get_internal(depth + 1);
     auto parent = parent_entry.node;
     auto node_iter = parent->iter_idx(parent_entry.pos);
+    auto next_iter = node_iter + 1;
+    auto begin = node_iter->get_key();
+    auto end = next_iter == parent->end()
+      ? parent->get_node_meta().end
+      : next_iter->get_key();
     return get_internal_node(
       c,
       depth,
-      node_iter->get_val().maybe_relative_to(parent->get_paddr())
+      node_iter->get_val().maybe_relative_to(parent->get_paddr()),
+      begin,
+      end
     ).si_then([depth, visitor, &iter, &f](LBAInternalNodeRef node) {
       auto &entry = iter.get_internal(depth);
       entry.node = node;
@@ -499,10 +514,17 @@ private:
     auto parent = parent_entry.node;
     assert(parent);
     auto node_iter = parent->iter_idx(parent_entry.pos);
+    auto next_iter = node_iter + 1;
+    auto begin = node_iter->get_key();
+    auto end = next_iter == parent->end()
+      ? parent->get_node_meta().end
+      : next_iter->get_key();
 
     return get_leaf_node(
       c,
-      node_iter->get_val().maybe_relative_to(parent->get_paddr())
+      node_iter->get_val().maybe_relative_to(parent->get_paddr()),
+      begin,
+      end
     ).si_then([visitor, &iter, &f](LBALeafNodeRef node) {
       iter.leaf.node = node;
       auto node_iter = f(*node);
@@ -675,7 +697,9 @@ private:
   friend base_iertr::future<typename NodeType::Ref> get_node(
     op_context_t c,
     depth_t depth,
-    paddr_t addr);
+    paddr_t addr,
+    laddr_t begin,
+    laddr_t end);
 
   template <typename NodeType>
   friend handle_merge_ret merge_level(