diff options
author | Robert Newson <rnewson@apache.org> | 2020-08-06 12:58:46 +0100 |
---|---|---|
committer | Robert Newson <rnewson@apache.org> | 2020-08-06 16:39:24 +0100 |
commit | 51a131d59c2c62a827b2f646aced2f53bf789176 (patch) | |
tree | eb316e91cc41f193a98cde02c028105b4c67a424 | |
parent | dff8bc9c254b1657279f55f21485b29f1b08cad6 (diff) | |
download | couchdb-51a131d59c2c62a827b2f646aced2f53bf789176.tar.gz |
Tighten expectation of members format by level
-rw-r--r-- | src/ebtree/src/ebtree.erl | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl index 6a4f4a80e..d3ec7a988 100644 --- a/src/ebtree/src/ebtree.erl +++ b/src/ebtree/src/ebtree.erl @@ -542,8 +542,8 @@ split_child(Tx, #tree{} = Tree, #node{} = Parent0, #node{} = Child) -> Parent1 = Parent0#node{ members = - umerge_members(Tree, [{FirstLeftKey, LastLeftKey, LeftId, LeftReduction}], - umerge_members(Tree, [{FirstRightKey, LastRightKey, RightId, RightReduction}], + umerge_members(Tree, Parent0#node.level, [{FirstLeftKey, LastLeftKey, LeftId, LeftReduction}], + umerge_members(Tree, Parent0#node.level, [{FirstRightKey, LastRightKey, RightId, RightReduction}], lists:keydelete(Child#node.id, 3, Parent0#node.members))) }, clear_node(Tx, Tree, Child), @@ -569,7 +569,7 @@ update_next_neighbour(Tx, #tree{} = Tree, #node{} = Node) -> insert_nonfull(Tx, #tree{} = Tree, #node{level = 0} = Node0, Key, Value) -> Node1 = Node0#node{ - members = umerge_members(Tree, [{Key, Value}], Node0#node.members) + members = umerge_members(Tree, 0, [{Key, Value}], Node0#node.members) }, set_node(Tx, Tree, Node0, Node1), reduce_node(Tree, Node1); @@ -658,7 +658,8 @@ delete(Tx, #tree{} = Tree, #node{} = Parent0, Key) -> Members1 = lists:keydelete(ChildId0, 3, Members0), Members2 = lists:keydelete(Sibling#node.id, 3, Members1), Members3 = lists:foldl(fun(N, Acc) -> - umerge_members(Tree, [{first_key(N), last_key(N), N#node.id, reduce_node(Tree, N)}], Acc) + umerge_members(Tree, Parent0#node.level, + [{first_key(N), last_key(N), N#node.id, reduce_node(Tree, N)}], Acc) end, Members2, NewNodes), Parent1 = Parent0#node{ @@ -842,8 +843,8 @@ validate_node(#tree{} = Tree, #node{} = Node) -> NumKeys = length(Node#node.members), IsLeaf = Node#node.level =:= 0, IsRoot = ?NODE_ROOT_ID == Node#node.id, - OutOfOrder = Node#node.members /= sort_members(Tree, Node#node.members), - Duplicates = Node#node.members /= usort_members(Tree, Node#node.members), + OutOfOrder = Node#node.members /= sort_members(Tree, Node#node.level, Node#node.members), + Duplicates = Node#node.members /= usort_members(Tree, Node#node.level, Node#node.members), if Node#node.id == undefined -> erlang:error({node_without_id, Node}); @@ -940,11 +941,11 @@ collate(#tree{} = Tree, A, B, Allowed) -> lists:member(collate(Tree, A, B), Allowed). -umerge_members(#tree{} = Tree, List1, List2) -> +umerge_members(#tree{} = Tree, Level, List1, List2) -> CollateWrapper = fun - ({K1, _V1}, {K2, _V2}) -> + ({K1, _V1}, {K2, _V2}) when Level == 0 -> collate(Tree, K1, K2, [lt, eq]); - ({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) -> + ({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) when Level > 0 -> collate(Tree, L1, L2, [lt, eq]) end, lists:umerge(CollateWrapper, List1, List2). @@ -966,21 +967,21 @@ sort_nodes(#tree{} = Tree, List) -> lists:sort(CollateWrapper, List). -sort_members(#tree{} = Tree, List) -> +sort_members(#tree{} = Tree, Level, List) -> CollateWrapper = fun - ({K1, _V1}, {K2, _V2}) -> + ({K1, _V1}, {K2, _V2}) when Level == 0 -> collate(Tree, K1, K2, [lt, eq]); - ({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) -> + ({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) when Level > 0 -> collate(Tree, L1, L2, [lt, eq]) end, lists:sort(CollateWrapper, List). -usort_members(#tree{} = Tree, List) -> +usort_members(#tree{} = Tree, Level, List) -> CollateWrapper = fun - ({K1, _V1}, {K2, _V2}) -> + ({K1, _V1}, {K2, _V2}) when Level == 0 -> collate(Tree, K1, K2, [lt, eq]); - ({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) -> + ({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) when Level > 0 -> collate(Tree, L1, L2, [lt, eq]) end, lists:usort(CollateWrapper, List). |