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

[couchdb] 07/07: change cache api so implementations don't need to understand node format

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

rnewson pushed a commit to branch prototype/fdb-layer-ebtree-immutable
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit b56cb0e61c5a40d6ff03caabba90c8ab179c9205
Author: Robert Newson <rn...@apache.org>
AuthorDate: Mon Aug 10 10:14:34 2020 +0100

    change cache api so implementations don't need to understand node format
---
 src/ebtree/src/ebtree.erl | 34 ++++++++++++++++------------------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index 5409966..0406f12 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -782,7 +782,7 @@ get_node(Tx, #tree{} = Tree, Id) ->
             Key = node_key(Tree#tree.prefix, Id),
             Value = persist(Tree, Tx, get, Key),
             Node = decode_node(Tree, Id, Key, Value),
-            cache(Tree, set, Node),
+            cache(Tree, set, [Id, Node]),
             Node;
         #node{} = Node ->
             Node
@@ -797,7 +797,7 @@ clear_nodes(Tx, #tree{} = Tree, Nodes) ->
 
 clear_node(Tx, #tree{} = Tree, #node{} = Node) ->
      Key = node_key(Tree#tree.prefix, Node#node.id),
-     cache(Tree, clear, Node),
+     cache(Tree, clear, Node#node.id),
      persist(Tree, Tx, clear, Key).
 
 
@@ -818,7 +818,7 @@ 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),
-    cache(Tree, set, Node),
+    cache(Tree, set, [Node#node.id, Node]),
     persist(Tree, Tx, set, [Key, Value]).
 
 
@@ -1046,27 +1046,25 @@ cache_noop(get, _) ->
     undefined.
 
 
-cache(#tree{} = Tree, Action, #node{} = Node) when Action == set; Action == clear ->
+cache(#tree{} = Tree, set, [Id, #node{} = Node]) ->
     #tree{cache_fun = CacheFun} = Tree,
-    NodeIsCacheable = node_is_cacheable(Node),
-    if
-        NodeIsCacheable andalso CacheFun /= undefined ->
-            CacheFun(Action, Node);
+    case node_is_cacheable(Node) of
         true ->
+            CacheFun(set, [Id, Node]);
+        false ->
             ok
     end;
 
+cache(#tree{} = Tree, clear, Id) ->
+    #tree{cache_fun = CacheFun} = Tree,
+    CacheFun(clear, Id);
+
 cache(#tree{} = _Tree, get, ?NODE_ROOT_ID) ->
     undefined;
 
 cache(#tree{} = Tree, get, Id) ->
     #tree{cache_fun = CacheFun} = Tree,
-    if
-        CacheFun /= undefined ->
-            CacheFun(get, Id);
-        true ->
-            undefined
-    end.
+    CacheFun(get, Id).
 
 %% private functions
 
@@ -1533,10 +1531,10 @@ cache_test_() ->
     {spawn, [fun() ->
         Db = erlfdb_util:get_test_db([empty]),
         CacheFun = fun
-            (set, Node) ->
-                erlang:put(Node#node.id, Node);
-            (clear, Node) ->
-                erlang:erase(Node#node.id);
+            (set, [Id, Node]) ->
+                erlang:put(Id, Node);
+            (clear, Id) ->
+                erlang:erase(Id);
             (get, Id) ->
                 erlang:get(Id)
         end,