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>'].