diff options
author | Robert Newson <rnewson@apache.org> | 2020-07-23 19:01:02 +0100 |
---|---|---|
committer | Robert Newson <rnewson@apache.org> | 2020-08-07 09:49:52 +0100 |
commit | 4b9221f37e26ee40fd343ad0cdd3f6b329fd5cd7 (patch) | |
tree | 68a14f0ce134f715b56c6acaac78147c92995138 | |
parent | 9a0d67fb9ac79370b1a8616990eddd6d7ba30144 (diff) | |
download | couchdb-4b9221f37e26ee40fd343ad0cdd3f6b329fd5cd7.tar.gz |
mutate node id of non-leaf, non-root nodes on delete
-rw-r--r-- | src/ebtree/src/ebtree.erl | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl index 639406ec4..d9bc30bdd 100644 --- a/src/ebtree/src/ebtree.erl +++ b/src/ebtree/src/ebtree.erl @@ -684,20 +684,38 @@ delete(Tx, #tree{} = Tree, #node{} = Parent0, Key) -> end, Members2, NewNodes), Parent1 = Parent0#node{ - %% TODO change id members = Members3 }, + Parent2 = if + Parent1#node.id == ?NODE_ROOT_ID -> + Parent1; + Parent0#node.members == Parent1#node.members -> + Parent1; + true -> + clear_node(Tx, Tree, Parent1), + Parent1#node{id = new_node_id(Tx, Tree)} + end, clear_nodes(Tx, Tree, [Child0, Sibling]), set_nodes(Tx, Tree, NewNodes), - Parent1; + Parent2; false -> set_node(Tx, Tree, Child0, Child1), {_OldFirstKey, _OldLastKey, ChildId0, _OldReduction} = lists:keyfind(ChildId0, 3, Parent0#node.members), - Parent0#node{ + Parent1 = Parent0#node{ members = lists:keyreplace(ChildId0, 3, Parent0#node.members, {first_key(Child1), last_key(Child1), Child1#node.id, reduce_node(Tree, Child1)}) - } + }, + Parent2 = if + Parent1#node.id == ?NODE_ROOT_ID -> + Parent1; + Parent0#node.members == Parent1#node.members -> + Parent1; + true -> + clear_node(Tx, Tree, Parent1), + Parent1#node{id = new_node_id(Tx, Tree)} + end, + Parent2 end. |