/* pos may be either node_position_t<LBALeafNode> or
* node_position_t<LBAInternalNode> */
auto split_level = [&](auto &parent_pos, auto &pos) {
+ LOG_PREFIX(LBATree::handle_split);
auto [left, right, pivot] = pos.node->make_split_children(c);
auto parent_node = parent_pos.node;
pivot,
right->get_paddr());
+ DEBUGT("splitted {} into left: {}, right: {}",
+ c.trans,
+ *pos.node,
+ *left,
+ *right);
c.cache.retire_extent(c.trans, pos.node);
return std::make_pair(left, right);
LBABtree::node_position_t<LBAInternalNode> &parent_pos,
LBABtree::node_position_t<NodeType> &pos)
{
+ LOG_PREFIX(LBABtree::merge_level);
if (!parent_pos.node->is_pending()) {
parent_pos.node = c.cache.duplicate_for_write(
c.trans, parent_pos.node
bool donor_is_left = ((iter.get_offset() + 1) == parent_pos.node->get_size());
auto donor_iter = donor_is_left ? (iter - 1) : (iter + 1);
+ 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())
).si_then([c, iter, donor_iter, donor_is_left, &parent_pos, &pos](
typename NodeType::Ref donor) {
+ LOG_PREFIX(LBABtree::merge_level);
auto [l, r] = donor_is_left ?
std::make_pair(donor, pos.node) : std::make_pair(pos.node, donor);
parent_pos.pos--;
}
+ DEBUGT("l: {}, r: {}, replacement: {}", c.trans, *l, *r, *replacement);
c.cache.retire_extent(c.trans, l);
c.cache.retire_extent(c.trans, r);
} else {
+ LOG_PREFIX(LBABtree::merge_level);
auto [replacement_l, replacement_r, pivot] =
l->make_balanced(
c,
pos.pos = orig_position - replacement_l->get_size();
}
+ DEBUGT("l: {}, r: {}, replacement_l: {}, replacement_r: {}",
+ c.trans, *l, *r, *replacement_l, *replacement_r);
c.cache.retire_extent(c.trans, l);
c.cache.retire_extent(c.trans, r);
}