You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by to...@apache.org on 2017/10/09 05:25:52 UTC

[couchdb] branch seqt-external-size-bug updated: use custom reduce function for seq btree

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

tonysun83 pushed a commit to branch seqt-external-size-bug
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/seqt-external-size-bug by this push:
     new 1fff79b  use custom reduce function for seq btree
1fff79b is described below

commit 1fff79bbc8603493ae311c51cefda8cc30ae0305
Author: Tony Sun <to...@gmail.com>
AuthorDate: Sun Oct 8 22:26:38 2017 -0700

    use custom reduce function for seq btree
---
 src/couch_mrview/src/couch_mrview_util.erl | 41 +++++++++++++++++++++++-------
 1 file changed, 32 insertions(+), 9 deletions(-)

diff --git a/src/couch_mrview/src/couch_mrview_util.erl b/src/couch_mrview/src/couch_mrview_util.erl
index b798a9d..02e05fd 100644
--- a/src/couch_mrview/src/couch_mrview_util.erl
+++ b/src/couch_mrview/src/couch_mrview_util.erl
@@ -299,7 +299,7 @@ open_view(Db, Fd, Lang, ViewState, View) ->
     ],
     {ok, Btree} = couch_btree:open(BTState, Fd, ViewBtOpts),
 
-    BySeqReduceFun = fun couch_db_updater:btree_by_seq_reduce/2,
+    BySeqReduceFun = make_seq_reduce_fun(),
     {ok, SeqBtree} = if View#mrview.seq_indexed ->
         SeqBTState = get_seq_btree_state(ViewState),
         ViewSeqBtOpts = [{reduce, BySeqReduceFun},
@@ -796,27 +796,30 @@ changes_ekey_opts(_StartSeq, #mrargs{end_key=EKey,
     end.
 
 
-reduced_external_size(Tree) ->
+reduced_external_size(btree, Tree) ->
     case couch_btree:full_reduce(Tree) of
         {ok, {_, _, Size}} -> Size;
         % return 0 for versions of the reduce function without Size
-        {ok, {_, _}} -> 0;
-        % This is for the case when seq_btree or key_byseq_btree is not
-        % null. Reduces will return an integer.
-        {ok, Size} when is_integer(Size) -> Size
+        {ok, {_, _}} -> 0
+    end;
+reduced_external_size(seq_btree, Tree) ->
+    case couch_btree:full_reduce(Tree) of
+        {ok, {_, Size}} -> Size;
+        % return 0 for older versions that only returned number of docs
+        {ok, NumDocs} when is_integer(NumDocs) -> 0
     end.
 
 
 calculate_external_size(Views) ->
     SumFun = fun(#mrview{btree=Bt, seq_btree=SBt, key_byseq_btree=KSBt}, Acc) ->
-        Size0 = sum_btree_sizes(Acc, reduced_external_size(Bt)),
+        Size0 = sum_btree_sizes(Acc, reduced_external_size(btree, Bt)),
         Size1 = case SBt of
             nil -> Size0;
-            _ -> sum_btree_sizes(Size0, reduced_external_size(SBt))
+            _ -> sum_btree_sizes(Size0, reduced_external_size(seq_btree, SBt))
         end,
         case KSBt of
             nil -> Size1;
-            _ -> sum_btree_sizes(Size1, reduced_external_size(KSBt))
+            _ -> sum_btree_sizes(Size1, reduced_external_size(seq_btree, KSBt))
         end
     end,
     {ok, lists:foldl(SumFun, 0, Views)}.
@@ -1047,6 +1050,10 @@ get_user_reds(Reduction) ->
     element(2, Reduction).
 
 
+% This is for backwards compatibility for seq btree reduces
+get_external_size_reds(Reduction) when is_integer(Reduction) ->
+    0;
+
 get_external_size_reds(Reduction) when tuple_size(Reduction) == 2 ->
     0;
 
@@ -1075,6 +1082,22 @@ make_reduce_fun(Lang, ReduceFuns) ->
             {Counts, Result, ExternalSize}
     end.
 
+make_seq_reduce_fun() ->
+    fun
+        (reduce, KVs0) ->
+            KVs = detuple_kvs(expand_dups(KVs0, []), []),
+            NumDocs = length(KVs),
+            ExternalSize = kv_external_size(KVs, NumDocs),
+            {NumDocs, ExternalSize};
+        (rereduce, Reds) ->
+            ExtractFun = fun(Red, {NumDocsAcc0, ExtAcc0}) ->
+                NumDocsAcc = NumDocsAcc0 + get_count(Red),
+                ExtAcc = ExtAcc0 + get_external_size_reds(Red),
+                {NumDocsAcc, ExtAcc}
+            end,
+            lists:foldl(ExtractFun, {0, 0}, Reds)
+    end.
+
 
 maybe_define_less_fun(#mrview{options = Options}) ->
     case couch_util:get_value(<<"collation">>, Options) of

-- 
To stop receiving notification emails like this one, please contact
['"commits@couchdb.apache.org" <co...@couchdb.apache.org>'].