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(
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(
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>
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);
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<>;
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());
} 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());
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;
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);
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(