summaryrefslogtreecommitdiff
path: root/src/couch_views/src/couch_views_fdb.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/couch_views/src/couch_views_fdb.erl')
-rw-r--r--src/couch_views/src/couch_views_fdb.erl52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/couch_views/src/couch_views_fdb.erl b/src/couch_views/src/couch_views_fdb.erl
index fe52853ba..0a3ae01db 100644
--- a/src/couch_views/src/couch_views_fdb.erl
+++ b/src/couch_views/src/couch_views_fdb.erl
@@ -290,15 +290,19 @@ update_views(TxDb, Mrst, Docs) ->
tx := Tx
} = TxDb,
- % Collect update information
+ % Get initial KV size
+ OldKVSize = lists:foldl(fun(View, SizeAcc) ->
+ {_, Size, _} = ebtree:full_reduce(Tx, View#mrview.btree),
+ SizeAcc + Size
+ end, 0, Mrst#mrst.views),
+ % Collect update information
#{
ids := IdMap,
views := ViewMaps,
delete_ref := DeleteRef
} = gather_update_info(Tx, Mrst, Docs),
- % Generate a list of Keys to delete and Rows to insert from a map
UpdateBTree = fun(BTree, Map) ->
{ToRemove, ToInsert} = maps:fold(fun(Key, Value, {Keys, Rows}) ->
case Value of
@@ -326,7 +330,15 @@ update_views(TxDb, Mrst, Docs) ->
ViewMap = maps:get(ViewId, ViewMaps, #{}),
UpdateBTree(BTree, ViewMap)
- end, Mrst#mrst.views).
+ end, Mrst#mrst.views),
+
+ % Get new KV size after update
+ NewKVSize = lists:foldl(fun(View, SizeAcc) ->
+ {_, Size, _} = ebtree:full_reduce(Tx, View#mrview.btree),
+ SizeAcc + Size
+ end, 0, Mrst#mrst.views),
+
+ update_kv_size(TxDb, Mrst#mrst.sig, OldKVSize, NewKVSize).
list_signatures(Db) ->
@@ -347,6 +359,11 @@ clear_index(Db, Signature) ->
db_prefix := DbPrefix
} = Db,
+ % Get view size to remove from global counter
+ SizeTuple = {?DB_VIEWS, ?VIEW_INFO, ?VIEW_KV_SIZE, Signature},
+ SizeKey = erlfdb_tuple:pack(SizeTuple, DbPrefix),
+ ViewSize = ?bin2uint(erlfdb:wait(erlfdb:get(Tx, SizeKey))),
+
% Clear index info keys
Keys = [
{?DB_VIEWS, ?VIEW_INFO, ?VIEW_UPDATE_SEQ, Signature},
@@ -366,7 +383,12 @@ clear_index(Db, Signature) ->
% Clear tree data
TreeTuple = {?DB_VIEWS, ?VIEW_TREES, Signature},
TreePrefix = erlfdb_tuple:pack(TreeTuple, DbPrefix),
- erlfdb:clear_range_startswith(Tx, TreePrefix).
+ erlfdb:clear_range_startswith(Tx, TreePrefix),
+
+ % Decrement db wide view size counter
+ DbSizeTuple = {?DB_STATS, <<"sizes">>, <<"views">>},
+ DbSizeKey = erlfdb_tuple:pack(DbSizeTuple, DbPrefix),
+ erlfdb:add(Tx, DbSizeKey, -ViewSize).
open_id_tree(TxDb, Sig) ->
@@ -420,13 +442,14 @@ make_reduce_fun(Lang, #mrview{} = View) ->
RedFuns = [Src || {_, Src} <- View#mrview.reduce_funs],
fun
(KVs0, _ReReduce = false) ->
- KVs1 = detuple_kvs(expand_dupes(KVs0)),
- TotalSize = lists:foldl(fun([K, V], Acc) ->
+ KVs1 = expand_dupes(KVs0),
+ TotalSize = lists:foldl(fun({K, V}, Acc) ->
KSize = couch_ejson_size:encoded_size(K),
VSize = couch_ejson_size:encoded_size(V),
KSize + VSize + Acc
end, 0, KVs1),
- {ok, UserReds} = couch_query_servers:reduce(Lang, RedFuns, KVs1),
+ KVs2 = detuple_kvs(KVs1),
+ {ok, UserReds} = couch_query_servers:reduce(Lang, RedFuns, KVs2),
{length(KVs1), TotalSize, UserReds};
(Reductions, _ReReduce = true) ->
FoldFun = fun({Count, Size, UserReds}, {CAcc, SAcc, URedAcc}) ->
@@ -600,6 +623,21 @@ gather_update_info(Tx, Mrst, Docs) ->
end, InfoAcc1, Docs).
+update_kv_size(TxDb, Sig, OldSize, NewSize) ->
+ #{
+ tx := Tx,
+ db_prefix := DbPrefix
+ } = TxDb,
+
+ ViewTuple = {?DB_VIEWS, ?VIEW_INFO, ?VIEW_KV_SIZE, Sig},
+ ViewKey = erlfdb_tuple:pack(ViewTuple, DbPrefix),
+ erlfdb:set(Tx, ViewKey, ?uint2bin(NewSize)),
+
+ DbTuple = {?DB_STATS, <<"sizes">>, <<"views">>},
+ DbKey = erlfdb_tuple:pack(DbTuple, DbPrefix),
+ erlfdb:add(Tx, DbKey, NewSize - OldSize).
+
+
dedupe_rows(View, KVs0) ->
CollateFun = couch_views_util:collate_fun(View),
KVs1 = lists:sort(fun({KeyA, ValA}, {KeyB, ValB}) ->