#endif
impl->prepare_mutate(c);
- // update pos => left_child to pos => right_child
+ auto left_key = left_child->impl->get_largest_key_view();
auto left_child_addr = left_child->impl->laddr();
auto left_child_addr_packed = laddr_packed_t{left_child_addr};
+ auto right_key = right_child->impl->get_largest_key_view();
auto right_child_addr = right_child->impl->laddr();
+ std::cout << "internal insert at pos(" << pos << "), "
+ << "left-child[" << left_key << ", 0x"
+ << std::hex << left_child_addr << std::dec
+ << "], right-child[" << right_key << ", 0x" <<
+ std::hex << right_child_addr << std::dec << "]" << std::endl;
+#if 0
+ std::cout << "before insert:" << std::endl;
+ dump(std::cout) << std::endl;
+#endif
+
+ // update pos => left_child to pos => right_child
impl->replace_child_addr(pos, right_child_addr, left_child_addr);
replace_track(pos, right_child, left_child);
- auto left_key = left_child->impl->get_largest_key_view();
search_position_t insert_pos = pos;
auto [insert_stage, insert_size] = impl->evaluate_insert(
left_key, left_child_addr, insert_pos);
return node_ertr::now();
}
// split and insert
- std::cout << " try insert at: " << insert_pos
- << ", insert_stage=" << (int)insert_stage
- << ", insert_size=" << insert_size
- << ", values=0x" << std::hex << left_child_addr
- << ",0x" << right_child_addr << std::dec << std::endl;
Ref<InternalNode> this_ref = this;
return (is_root() ? upgrade_root(c) : node_ertr::now()
).safe_then([this, c] {
assert(impl->is_level_tail());
}
#endif
+ std::cout << "leaf insert at pos(" << pos << "), "
+ << key << ", " << value << std::endl;
+#if 0
+ std::cout << "before insert:" << std::endl;
+ dump(std::cout) << std::endl;
+#endif
search_position_t insert_pos = pos;
auto [insert_stage, insert_size] = impl->evaluate_insert(
return node_ertr::make_ready_future<Ref<tree_cursor_t>>(ret);
}
// split and insert
- std::cout << " try insert at: " << insert_pos
- << ", insert_stage=" << (int)insert_stage
- << ", insert_size=" << insert_size
- << std::endl;
Ref<LeafNode> this_ref = this;
return (is_root() ? upgrade_root(c) : node_ertr::now()
).safe_then([this, c] {
const full_key_t<KEY_TYPE>& key, const value_t& value,
search_position_t& insert_pos, match_stage_t& insert_stage,
node_offset_t& insert_size) override {
+ std::cout << "INSERT start: insert_pos(" << insert_pos
+ << "), insert_stage=" << (int)insert_stage
+ << ", insert_size=" << insert_size << " ..." << std::endl;
auto ret = extent.template insert_replayable<KEY_TYPE>(
key, value, cast_down<STAGE>(insert_pos), insert_stage, insert_size);
+#if 0
+ dump(std::cout) << std::endl;
+#endif
+ std::cout << "INSERT done: insert_pos(" << insert_pos
+ << "), insert_stage=" << (int)insert_stage
+ << ", insert_size=" << insert_size
+ << std::endl << std::endl;
assert(get_key_view(insert_pos) == key);
return ret;
}
const full_key_t<KEY_TYPE>& key, const value_t& value,
search_position_t& _insert_pos, match_stage_t& insert_stage,
node_offset_t& insert_size) override {
+ std::cout << "SPLIT-INSERT start: insert_pos(" << _insert_pos
+ << "), insert_stage=" << (int)insert_stage
+ << ", insert_size=" << insert_size
+ << std::endl;
auto& insert_pos = cast_down<STAGE>(_insert_pos);
auto& node_stage = extent.read();
- size_t empty_size = node_stage.size_before(0);
- size_t available_size = node_stage.total_size() - empty_size;
- size_t target_split_size = empty_size + (available_size + insert_size) / 2;
- // TODO adjust NODE_BLOCK_SIZE according to this requirement
- assert(insert_size < available_size / 2);
typename STAGE_T::StagedIterator split_at;
- bool is_insert_left = STAGE_T::locate_split(
- node_stage, target_split_size, insert_pos, insert_stage, insert_size, split_at);
-
- std::cout << " split at: " << split_at << ", is_insert_left=" << is_insert_left
- << ", now insert at: " << insert_pos
- << std::endl;
+ bool is_insert_left;
+ {
+ size_t empty_size = node_stage.size_before(0);
+ size_t available_size = node_stage.total_size() - empty_size;
+ size_t target_split_size = empty_size + (available_size + insert_size) / 2;
+ // TODO adjust NODE_BLOCK_SIZE according to this requirement
+ assert(insert_size < available_size / 2);
+
+ size_t split_size = 0;
+ std::optional<bool> _is_insert_left;
+ split_at.set(node_stage);
+ STAGE_T::recursively_locate_split_inserted(
+ split_size, 0, target_split_size, insert_pos,
+ insert_stage, insert_size, _is_insert_left, split_at);
+ is_insert_left = *_is_insert_left;
+ std::cout << "located_split: split_at(" << split_at << "), insert_pos(" << insert_pos
+ << "), is_insert_left=" << is_insert_left
+ << ", estimated_split_size=" << split_size
+ << "(target=" << target_split_size
+ << ", current=" << node_stage.size_before(node_stage.keys())
+ << ")" << std::endl;
+ assert(split_size <= target_split_size);
+ }
auto append_at = split_at;
// TODO(cross-node string dedup)
// right node: append [start(append_at), insert_pos)
STAGE_T::template append_until<KEY_TYPE>(
append_at, right_appender, insert_pos, insert_stage);
- std::cout << "insert to right: " << insert_pos
- << ", insert_stage=" << (int)insert_stage << std::endl;
+ std::cout << "append-insert right: insert_pos(" << insert_pos
+ << "), insert_stage=" << (int)insert_stage
+ << " ..." << std::endl;
// right node: append [insert_pos(key, value)]
bool is_front_insert = (insert_pos == position_t::begin());
bool is_end = STAGE_T::template append_insert<KEY_TYPE>(
key, value, append_at, right_appender,
is_front_insert, insert_stage, p_value);
assert(append_at.is_end() == is_end);
+ } else {
+ std::cout << "append right ..." << std::endl;
}
// right node: append (insert_pos, end)
// mutate left node
if (is_insert_left) {
+ std::cout << "trim-insert left: insert_pos(" << insert_pos
+ << "), insert_stage=" << (int)insert_stage
+ << " ..." << std::endl;
p_value = extent.template split_insert_replayable<KEY_TYPE>(
split_at, key, value, insert_pos, insert_stage, insert_size);
assert(get_key_view(_insert_pos) == key);
} else {
+ std::cout << "trim left ..." << std::endl;
assert(right_impl.get_key_view(_insert_pos) == key);
extent.split_replayable(split_at);
}
assert(p_value);
auto split_pos = normalize(split_at.get_pos());
- std::cout << "split at " << split_pos
- << ", insert at " << _insert_pos
- << ", is_insert_left=" << is_insert_left
- << ", insert_stage=" << (int)insert_stage << std::endl;
+ std::cout << "SPLIT-INSERT done: split_pos(" << split_pos
+ << "), insert_pos(" << _insert_pos
+ << "), insert_stage=" << (int)insert_stage
+ << ", insert_size=" << insert_size
+ << std::endl << std::endl;
return {split_pos, is_insert_left, p_value};
}