summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2020-07-24 16:11:49 +0100
committerGitHub <noreply@github.com>2020-07-24 16:11:49 +0100
commitf811f3f56cef4527e75ae591fcb4dbfeb69636f5 (patch)
tree26ff240560cb9cab693d85555e55a511c381fe60
parent6875e7bf710cd2ffdf6d115af2bcd877012626c3 (diff)
parentebe62b281f9ba30bd3643181ec0b6674bedd7c03 (diff)
downloadcouchdb-f811f3f56cef4527e75ae591fcb4dbfeb69636f5.tar.gz
Merge pull request #3033 from apache/prototype/fdb-layer-ebtree-spurious-conflicts
Only call erlfdb:set if the node changes
-rw-r--r--src/ebtree/src/ebtree.erl15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index cb5e80541..38a328947 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -534,7 +534,7 @@ insert_nonfull(Tx, #tree{} = Tree, #node{level = 0} = Node0, Key, Value) ->
Node1 = Node0#node{
members = umerge(Tree, [{Key, Value}], Node0#node.members)
},
- set_node(Tx, Tree, Node1),
+ set_node(Tx, Tree, Node0, Node1),
reduce_node(Tree, Node1);
insert_nonfull(Tx, #tree{} = Tree, #node{} = Node0, Key, Value) ->
@@ -563,7 +563,7 @@ insert_nonfull(Tx, #tree{} = Tree, #node{} = Node0, Key, Value) ->
members = lists:keyreplace(ChildId1, 3, Node1#node.members,
{NewFirstKey, NewLastKey, ChildId1, NewReduction})
},
- set_node(Tx, Tree, Node2),
+ set_node(Tx, Tree, Node0, Node2),
reduce_node(Tree, Node2).
@@ -584,7 +584,7 @@ delete(Db, #tree{} = Tree, Key) ->
clear_node(Tx, Tree, Root2),
set_node(Tx, Tree, Root2#node{id = ?NODE_ROOT_ID});
Root1 ->
- set_node(Tx, Tree, Root1)
+ set_node(Tx, Tree, Root0, Root1)
end
end),
Tree.
@@ -633,7 +633,7 @@ delete(Tx, #tree{} = Tree, #node{} = Parent0, Key) ->
set_nodes(Tx, Tree, NewNodes),
Parent1;
false ->
- set_node(Tx, Tree, Child1),
+ set_node(Tx, Tree, Child0, Child1),
{_OldFirstKey, _OldLastKey, ChildId0, _OldReduction} = lists:keyfind(ChildId0, 3, Parent0#node.members),
Parent0#node{
members = lists:keyreplace(ChildId0, 3, Parent0#node.members,
@@ -756,6 +756,13 @@ set_nodes(Tx, #tree{} = Tree, Nodes) ->
end, Nodes).
+set_node(_Tx, #tree{} = _Tree, #node{} = Same, #node{} = Same) ->
+ ok;
+
+set_node(Tx, #tree{} = Tree, #node{} = _From, #node{} = To) ->
+ set_node(Tx, Tree, To).
+
+
set_node(Tx, #tree{} = Tree, #node{} = Node) ->
validate_node(Tree, Node),
Key = node_key(Tree#tree.prefix, Node#node.id),