summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2020-08-06 12:33:30 -0500
committerPaul J. Davis <paul.joseph.davis@gmail.com>2020-08-06 12:42:32 -0500
commit370df565d010c35e7cdd08b22e06ef9e61a3c7ac (patch)
tree48f3ab7eedeec2d2ce2e494dc706e095db5bcf38
parentfaa78c4ad7ead51ff8a10bd95a7854f0fcd3efbe (diff)
downloadcouchdb-ebtree-node-chunking.tar.gz
Chunkify ebtree nodes when necessaryarchive/ebtree-node-chunkingebtree-node-chunking
Chunking is done after decoding and before encoding so that any custom encoding function will still work correctly.
-rw-r--r--src/ebtree/src/ebtree.erl19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index c31f503d5..e3efee8c5 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -772,9 +772,9 @@ meta_key(Prefix, MetaKey) when is_binary(Prefix) ->
get_node(Tx, #tree{} = Tree, Id) ->
Key = node_key(Tree#tree.prefix, Id),
- Future = erlfdb:get(Tx, Key),
- Value = erlfdb:wait(Future),
- decode_node(Tree, Id, Key, Value).
+ Rows = erlfdb:get_range_startswith(Tx, Key),
+ Values = [V || {_K, V} <- Rows],
+ decode_node(Tree, Id, Key, iolist_to_binary(Values)).
clear_nodes(Tx, #tree{} = Tree, Nodes) ->
@@ -785,7 +785,7 @@ clear_nodes(Tx, #tree{} = Tree, Nodes) ->
clear_node(Tx, #tree{} = Tree, #node{} = Node) ->
Key = node_key(Tree#tree.prefix, Node#node.id),
- erlfdb:clear(Tx, Key).
+ erlfdb:clear_range_startswith(Tx, Key).
set_nodes(Tx, #tree{} = Tree, Nodes) ->
@@ -803,9 +803,14 @@ set_node(Tx, #tree{} = Tree, #node{} = _From, #node{} = To) ->
set_node(Tx, #tree{} = Tree, #node{} = Node) ->
validate_node(Tree, Node),
- Key = node_key(Tree#tree.prefix, Node#node.id),
- Value = encode_node(Tree, Key, Node),
- erlfdb:set(Tx, Key, Value).
+ BaseKey = node_key(Tree#tree.prefix, Node#node.id),
+ WholeValue = encode_node(Tree, BaseKey, Node),
+ Values = fabric2_fdb:chunkify_binary(WholeValue),
+ lists:foldl(fun(Val, Id) ->
+ Key = erlfdb_tuple:pack({Id}, BaseKey),
+ erlfdb:set(Tx, Key, Val),
+ Id + 1
+ end, 0, Values).
node_key(Prefix, Id) when is_binary(Prefix), is_integer(Id) ->