diff --git a/persistent-data/data-structures/btree.h b/persistent-data/data-structures/btree.h index 5c58108..d690adb 100644 --- a/persistent-data/data-structures/btree.h +++ b/persistent-data/data-structures/btree.h @@ -397,12 +397,13 @@ namespace persistent_data { block_address parent_index, uint64_t key); - template + template bool insert_location(btree_detail::shadow_spine &spine, block_address block, uint64_t key, - int *index); + int *index, + RC &leaf_rc); void walk_tree(visitor &visitor, btree_detail::node_location const &loc, diff --git a/persistent-data/data-structures/btree.tcc b/persistent-data/data-structures/btree.tcc index 241c866..246e068 100644 --- a/persistent-data/data-structures/btree.tcc +++ b/persistent-data/data-structures/btree.tcc @@ -467,7 +467,7 @@ namespace persistent_data { shadow_spine spine(tm_, validator_); for (unsigned level = 0; level < Levels - 1; ++level) { - bool need_insert = insert_location(spine, block, key[level], &index); + bool need_insert = insert_location(spine, block, key[level], &index, internal_rc_); internal_node n = spine.template get_node(); if (need_insert) { @@ -478,7 +478,7 @@ namespace persistent_data { block = n.value_at(index); } - bool need_insert = insert_location(spine, block, key[Levels - 1], &index); + bool need_insert = insert_location(spine, block, key[Levels - 1], &index, rc_); leaf_node n = spine.template get_node(); if (need_insert) @@ -678,13 +678,14 @@ namespace persistent_data { // Returns true if we need a new insertion, rather than overwrite. template - template + template bool btree:: insert_location(btree_detail::shadow_spine &spine, block_address block, uint64_t key, - int *index) + int *index, + RC &leaf_rc) { using namespace btree_detail; @@ -694,10 +695,17 @@ namespace persistent_data { for (;;) { inc = spine.step(block); -#if 0 - if (inc) - inc_children(); -#endif + + // FIXME: factor out + { + node_ref nr = spine.template get_node(); + if (nr.get_type() == INTERNAL) + nr.inc_children(internal_rc_); + else { + node_ref leaf = spine.template get_node(); + leaf.inc_children(leaf_rc); + } + } // patch up the parent to point to the new shadow if (spine.has_parent()) {