diff options
Diffstat (limited to 'apps/couch/src/couch_view_group.erl')
-rw-r--r-- | apps/couch/src/couch_view_group.erl | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/apps/couch/src/couch_view_group.erl b/apps/couch/src/couch_view_group.erl index b0e67db5..de64ef51 100644 --- a/apps/couch/src/couch_view_group.erl +++ b/apps/couch/src/couch_view_group.erl @@ -466,6 +466,7 @@ get_group_info(State) -> fd = Fd, sig = GroupSig, def_lang = Lang, + views = Views, current_seq=CurrentSeq, purge_seq=PurgeSeq } = Group, @@ -474,6 +475,7 @@ get_group_info(State) -> {signature, ?l2b(hex_sig(GroupSig))}, {language, Lang}, {disk_size, Size}, + {data_size, compute_data_size(Views)}, {updater_running, UpdaterPid /= nil}, {compact_running, CompactorPid /= nil}, {waiting_commit, WaitingCommit}, @@ -482,6 +484,13 @@ get_group_info(State) -> {purge_seq, PurgeSeq} ]. +compute_data_size(ViewList) -> + lists:foldl(fun(#view{btree=Btree}, Acc) -> + {ok, {_, _, Size}} = couch_btree:full_reduce(Btree), + Size + Acc + end, 0, ViewList). + + % maybe move to another module design_doc_to_view_group(#doc{id=Id,body={Fields}}) -> Language = couch_util:get_value(<<"language">>, Fields, <<"javascript">>), @@ -563,13 +572,14 @@ init_group(Fd, #group{def_lang=Lang,views=Views}=Group, IndexHeader) -> KVs3 = couch_view:detuple_kvs(KVs2,[]), {ok, Reduced} = couch_query_servers:reduce(Lang, FunSrcs, KVs3), - {length(KVs3), Reduced}; + {length(KVs3), Reduced, couch_view:data_size(KVs3, Reduced)}; (rereduce, Reds) -> - Count = lists:sum([Count0 || {Count0, _} <- Reds]), - UserReds = [UserRedsList || {_, UserRedsList} <- Reds], + Count = lists:sum(extract(Reds, counts)), + DataSize = lists:sum(extract(Reds, data_size)), + UserReds = extract(Reds, user_reds), {ok, Reduced} = couch_query_servers:rereduce(Lang, FunSrcs, UserReds), - {Count, Reduced} + {Count, Reduced, DataSize} end, case couch_util:get_value(<<"collation">>, Options, <<"default">>) of @@ -585,3 +595,10 @@ init_group(Fd, #group{def_lang=Lang,views=Views}=Group, IndexHeader) -> ViewStates, Views), Group#group{fd=Fd, current_seq=Seq, purge_seq=PurgeSeq, id_btree=IdBtree, views=Views2}. + +extract(Reds, counts) -> + [element(1, R) || R <- Reds]; +extract(Reds, user_reds) -> + [element(2, R) || R <- Reds]; +extract(Reds, data_size) -> + lists:map(fun({_, _}) -> 0; ({_, _, Size}) -> Size end, Reds). |