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

rnewson pushed a commit to branch user-partitioned-dbs-6
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 027c1f133ac63c0adcd44ef8f5493299dd725eac
Author: Robert Newson <[email protected]>
AuthorDate: Wed Sep 12 19:10:34 2018 +0100

    WIP get_size_info by partition
---
 src/couch/src/couch_bt_engine.erl | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/couch/src/couch_bt_engine.erl 
b/src/couch/src/couch_bt_engine.erl
index 6748e98..4ab6211 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -43,6 +43,7 @@
     get_prop/2,
     get_prop/3,
     get_size_info/1,
+    get_size_info/2,
     get_update_seq/1,
     get_uuid/1,
 
@@ -262,6 +263,37 @@ get_size_info(#st{} = St) ->
     ].
 
 
+get_size_info(#st{} = St, Partition) when is_binary(Partition) ->
+    StartKey = <<Partition/binary, ":">>,
+    EndKey = <<Partition/binary, ";">>,
+    Fun = fun(_Key, {FDIs, SIs}, Acc) ->
+        Sizes = [sizes(S) || S <- FDIs ++ SIs],
+        {ok, sum_sizes([Acc | Sizes])}
+    end,
+    Options = [{start_key, StartKey}, {end_key, EndKey}, {key_group_level, 0}],
+    {ok, {ActiveSize, ExternalSize}} = couch_btree:fold_reduce(
+        St#st.id_tree, Fun, {0, 0}, Options),
+    [
+        {active, ActiveSize},
+        {external, ExternalSize}
+    ].
+
+sizes(#full_doc_info{} = FDI) ->
+    sizes(FDI#full_doc_info.sizes);
+sizes({_DocCount, _DelDocCount, #size_info{} = SI}) ->
+    sizes(SI);
+sizes(#size_info{} = SI) ->
+    #size_info{active = A, external = E} = SI,
+    {A, E}.
+
+sum_sizes(Sizes) ->
+    sum_sizes(Sizes, {0, 0}).
+
+sum_sizes([], Acc) ->
+    Acc;
+sum_sizes([{Active, External} | Rest], {ActiveAcc, ExternalAcc}) ->
+    sum_sizes(Rest, {Active + ActiveAcc, External + ExternalAcc}).
+
 get_security(#st{header = Header} = St) ->
     case couch_bt_engine_header:get(Header, security_ptr) of
         undefined ->

Reply via email to