From 43f347ececc4139e9a10aab1e686e6924eee8b1b Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 10 Dec 2021 13:51:31 -0800 Subject: [PATCH] crimson/os/seastore: pass depth/begin/end to get_*_node We'll need this to populate the pin fields prior to read. Signed-off-by: Samuel Just --- .../seastore/lba_manager/btree/lba_btree.cc | 35 ++++++++++++----- .../os/seastore/lba_manager/btree/lba_btree.h | 38 +++++++++++++++---- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc index 8f48affe1f4a3..21587962ce2b2 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc @@ -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 LBABtree::base_iertr::future 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 get_node( 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 get_node( 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 @@ -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( 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); diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h index f78f49ddc9607..96b92c73d3162 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h @@ -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; 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 get_node( op_context_t c, depth_t depth, - paddr_t addr); + paddr_t addr, + laddr_t begin, + laddr_t end); template friend handle_merge_ret merge_level( -- 2.39.5