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/07/22 15:34:00 UTC

[couchdb] branch prototype/fdb-layer-ebtree-order created (now 983ff1c)

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

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


      at 983ff1c  Use stored order without complaint

This branch includes the following new commits:

     new 983ff1c  Use stored order without complaint

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[couchdb] 01/01: Use stored order without complaint

Posted by rn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 983ff1c5a17c64e0c874374e4b0c00705c413341
Author: Robert Newson <rn...@apache.org>
AuthorDate: Wed Jul 22 16:22:06 2020 +0100

    Use stored order without complaint
---
 src/ebtree/src/ebtree.erl | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index f27f7d4..0ff8935 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -73,7 +73,8 @@ open(Db, Prefix, Order) ->
 %% @doc Open a new ebtree, initialising it if doesn't already exist.
 %% @param Db An erlfdb database or transaction.
 %% @param Prefix The key prefix applied to all ebtree keys.
-%% @param Order The maximum number of items allowed in an ebtree node (must be an even number).
+%% @param Order The maximum number of items allowed in an ebtree node (must be an even number). Ignored
+%% if ebtree is already initialised.
 %% @param Options Supported options are {reduce_fun, Fun} and {collate_fun, Fun}.
 %% @returns A data structure representing the ebtree, to be passed to all other functions.
 -spec open(term(), binary(), pos_integer(), list()) -> #tree{}.
@@ -82,27 +83,26 @@ open(Db, Prefix, Order, Options) when is_binary(Prefix), is_integer(Order), Orde
     CollateFun = proplists:get_value(collate_fun, Options, fun collate_raw/2),
     EncodeFun = proplists:get_value(encode_fun, Options, fun encode_erlang/2),
 
-    Tree0 = init_tree(Prefix, Order),
-    Tree1 = Tree0#tree{
+    Tree = #tree{
+        prefix = Prefix,
         reduce_fun = ReduceFun,
         collate_fun = CollateFun,
         encode_fun = EncodeFun
     },
 
     erlfdb:transactional(Db, fun(Tx) ->
-        case get_meta(Tx, Tree1, ?META_ORDER) of
+        case get_meta(Tx, Tree, ?META_ORDER) of
             not_found ->
                 erlfdb:clear_range_startswith(Tx, Prefix),
-                set_meta(Tx, Tree1, ?META_ORDER, Order),
-                set_meta(Tx, Tree1, ?META_NEXT_ID, 1),
-                set_node(Tx, Tree1, #node{id = ?NODE_ROOT_ID});
-            Order ->
-                ok;
-            Else ->
-                erlang:error({order_mismatch, Else})
+                set_meta(Tx, Tree, ?META_ORDER, Order),
+                set_meta(Tx, Tree, ?META_NEXT_ID, 1),
+                set_node(Tx, Tree, #node{id = ?NODE_ROOT_ID}),
+                init_order(Tree, Order);
+            ActualOrder when is_integer(ActualOrder) ->
+                init_order(Tree, ActualOrder)
         end
-    end),
-    Tree1.
+    end).
+
 
 %% @doc a special value guaranteed to be smaller than any value in an ebtree.
 min() ->
@@ -958,10 +958,9 @@ encode_erlang(decode, Bin) ->
 
 %% private functions
 
-init_tree(Prefix, Order)
-  when is_binary(Prefix), is_integer(Order), Order > 2, Order rem 2 == 0 ->
-    #tree{
-        prefix = Prefix,
+init_order(#tree{} = Tree, Order)
+  when is_integer(Order), Order > 2, Order rem 2 == 0 ->
+    Tree#tree{
         min = Order div 2,
         max = Order
     }.