From a2e51062e333b3f128184d8a6d81066950db4d37 Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Wed, 19 Jun 2013 17:20:12 +0100 Subject: [PATCH] [btree] call inc_children when shadowning a btree node. --- persistent-data/data-structures/btree.h | 5 +++-- persistent-data/data-structures/btree.tcc | 24 +++++++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) 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()) {