From bc5283223a1594928dc6e13854a0e0132019e5ec Mon Sep 17 00:00:00 2001 From: "Paul J. Davis" Date: Tue, 3 Dec 2019 10:24:36 -0600 Subject: Track a database level view size rollup This way we can expose the total view size for a database in the dbinfo JSON blob. --- src/couch_views/src/couch_views_fdb.erl | 17 ++++++++++++++-- src/fabric/src/fabric2_fdb.erl | 36 ++++++++++++++++----------------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/couch_views/src/couch_views_fdb.erl b/src/couch_views/src/couch_views_fdb.erl index 98cff46b2..5edaa3a5f 100644 --- a/src/couch_views/src/couch_views_fdb.erl +++ b/src/couch_views/src/couch_views_fdb.erl @@ -272,8 +272,16 @@ update_kv_size(TxDb, Sig, ViewId, Increment) -> tx := Tx, db_prefix := DbPrefix } = TxDb, - Key = kv_size_key(DbPrefix, Sig, ViewId), - erlfdb:add(Tx, Key, Increment). + + % Track a view specific size for calls to + % GET /dbname/_design/doc/_info` + IdxKey = kv_size_key(DbPrefix, Sig, ViewId), + erlfdb:add(Tx, IdxKey, Increment), + + % Track a database level rollup for calls to + % GET /dbname + DbKey = db_kv_size_key(DbPrefix), + erlfdb:add(Tx, DbKey, Increment). seq_key(DbPrefix, Sig) -> @@ -291,6 +299,11 @@ kv_size_key(DbPrefix, Sig, ViewId) -> erlfdb_tuple:pack(Key, DbPrefix). +db_kv_size_key(DbPrefix) -> + Key = {?DB_STATS, <<"sizes">>, <<"views">>}, + erlfdb_tuple:pack(Key, DbPrefix). + + id_idx_key(DbPrefix, Sig, DocId, ViewId) -> Key = {?DB_VIEWS, Sig, ?VIEW_ID_RANGE, DocId, ViewId}, erlfdb_tuple:pack(Key, DbPrefix). diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl index 6abe1f6de..8bfbb749a 100644 --- a/src/fabric/src/fabric2_fdb.erl +++ b/src/fabric/src/fabric2_fdb.erl @@ -174,11 +174,16 @@ create(#{} = Db0, Options) -> {?DB_STATS, <<"doc_del_count">>, ?uint2bin(0)}, {?DB_STATS, <<"doc_design_count">>, ?uint2bin(0)}, {?DB_STATS, <<"doc_local_count">>, ?uint2bin(0)}, - {?DB_STATS, <<"size">>, ?uint2bin(2)} + {?DB_STATS, <<"sizes">>, <<"external">>, ?uint2bin(2)}, + {?DB_STATS, <<"sizes">>, <<"views">>, ?uint2bin(0)} ], - lists:foreach(fun({P, K, V}) -> - Key = erlfdb_tuple:pack({P, K}, DbPrefix), - erlfdb:set(Tx, Key, V) + lists:foreach(fun + ({P, K, V}) -> + Key = erlfdb_tuple:pack({P, K}, DbPrefix), + erlfdb:set(Tx, Key, V); + ({P, S, K, V}) -> + Key = erlfdb_tuple:pack({P, S, K}, DbPrefix), + erlfdb:set(Tx, Key, V) end, Defaults), UserCtx = fabric2_util:get_value(user_ctx, Options, #user_ctx{}), @@ -348,26 +353,21 @@ get_info(#{} = Db) -> end, CProp = {update_seq, RawSeq}, - MProps = lists:flatmap(fun({K, V}) -> + MProps = lists:foldl(fun({K, V}, Acc) -> case erlfdb_tuple:unpack(K, DbPrefix) of {?DB_STATS, <<"doc_count">>} -> - [{doc_count, ?bin2uint(V)}]; + [{doc_count, ?bin2uint(V)} | Acc]; {?DB_STATS, <<"doc_del_count">>} -> - [{doc_del_count, ?bin2uint(V)}]; - {?DB_STATS, <<"size">>} -> + [{doc_del_count, ?bin2uint(V)} | Acc]; + {?DB_STATS, <<"sizes">>, Name} -> Val = ?bin2uint(V), - [ - {other, {[{data_size, Val}]}}, - {sizes, {[ - {active, 0}, - {external, Val}, - {file, 0} - ]}} - ]; + {_, {Sizes}} = lists:keyfind(sizes, 1, Acc), + NewSizes = lists:keystore(Name, 1, Sizes, {Name, Val}), + lists:keystore(sizes, 1, Acc, {sizes, {NewSizes}}); {?DB_STATS, _} -> - [] + Acc end - end, erlfdb:wait(MetaFuture)), + end, [{sizes, {[]}}], erlfdb:wait(MetaFuture)), [CProp | MProps]. -- cgit v1.2.1