diff options
Diffstat (limited to 'src/couch_views/src/couch_views_fdb.erl')
-rw-r--r-- | src/couch_views/src/couch_views_fdb.erl | 52 |
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}) -> |