summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2020-07-23 19:01:02 +0100
committerRobert Newson <rnewson@apache.org>2020-08-07 09:49:52 +0100
commit4b9221f37e26ee40fd343ad0cdd3f6b329fd5cd7 (patch)
tree68a14f0ce134f715b56c6acaac78147c92995138
parent9a0d67fb9ac79370b1a8616990eddd6d7ba30144 (diff)
downloadcouchdb-4b9221f37e26ee40fd343ad0cdd3f6b329fd5cd7.tar.gz
mutate node id of non-leaf, non-root nodes on delete
-rw-r--r--src/ebtree/src/ebtree.erl26
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.