summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2020-07-09 20:41:19 +0100
committerRobert Newson <rnewson@apache.org>2020-07-09 20:41:19 +0100
commit387b7c122a1685c03b5a0868df5f81424c2e47a0 (patch)
treecc69d669521b1345718d4ea06d266db0ae392908
parent2818bce6d9f55fd732cd6cf8d1d588de771e5fd5 (diff)
downloadcouchdb-387b7c122a1685c03b5a0868df5f81424c2e47a0.tar.gz
assert that non-leafs have no prev/next pointers
-rw-r--r--src/ebtree.erl5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/ebtree.erl b/src/ebtree.erl
index a2ad0224c..827d6fe5c 100644
--- a/src/ebtree.erl
+++ b/src/ebtree.erl
@@ -666,6 +666,7 @@ validate_tree(Tx, #tree{} = Tree, [{_F, _L, P, _R} | Rest]) ->
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(Tree, Node#node.members),
Duplicates = Node#node.members /= usort(Tree, Node#node.members),
@@ -676,6 +677,10 @@ validate_node(#tree{} = Tree, #node{} = Node) ->
erlang:error({too_few_keys, Node});
NumKeys > Tree#tree.max ->
erlang:error({too_many_keys, Node});
+ not IsLeaf andalso Node#node.prev /= undefined ->
+ erlang:error({non_leaf_with_prev, Node});
+ not IsLeaf andalso Node#node.next /= undefined ->
+ erlang:error({non_leaf_with_next, Node});
OutOfOrder ->
erlang:error({out_of_order, Node});
Duplicates ->