You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2020/08/06 17:50:09 UTC

[couchdb] 02/02: Chunkify ebtree nodes when necessary

This is an automated email from the ASF dual-hosted git repository.

davisp pushed a commit to branch ebtree-node-chunking
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 370df565d010c35e7cdd08b22e06ef9e61a3c7ac
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Thu Aug 6 12:33:30 2020 -0500

    Chunkify ebtree nodes when necessary
    
    Chunking is done after decoding and before encoding so that any custom
    encoding function will still work correctly.
---
 src/ebtree/src/ebtree.erl | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index c31f503..e3efee8 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) ->