diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2020-08-06 12:33:30 -0500 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2020-08-06 12:42:32 -0500 |
commit | 370df565d010c35e7cdd08b22e06ef9e61a3c7ac (patch) | |
tree | 48f3ab7eedeec2d2ce2e494dc706e095db5bcf38 | |
parent | faa78c4ad7ead51ff8a10bd95a7854f0fcd3efbe (diff) | |
download | couchdb-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.erl | 19 |
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) -> |