Updated Branches: refs/heads/1994-merge-rcouch b116413ae -> 6f173d5b3
couch_mrview: fix purge when seq_indexed=true This change makes tsure to also purge the log btree and related btrees in views when seqs_indexed is set to true. Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/f37134b7 Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/f37134b7 Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/f37134b7 Branch: refs/heads/1994-merge-rcouch Commit: f37134b764117728338edd38b6b993f192779ede Parents: b116413 Author: Benoit Chesneau <[email protected]> Authored: Mon Jan 27 10:14:59 2014 +0100 Committer: Benoit Chesneau <[email protected]> Committed: Mon Jan 27 10:14:59 2014 +0100 ---------------------------------------------------------------------- apps/couch_mrview/src/couch_mrview.erl | 1 - apps/couch_mrview/src/couch_mrview_updater.erl | 57 +++++++++++++++------ 2 files changed, 41 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb/blob/f37134b7/apps/couch_mrview/src/couch_mrview.erl ---------------------------------------------------------------------- diff --git a/apps/couch_mrview/src/couch_mrview.erl b/apps/couch_mrview/src/couch_mrview.erl index ca15457..eb929a6 100644 --- a/apps/couch_mrview/src/couch_mrview.erl +++ b/apps/couch_mrview/src/couch_mrview.erl @@ -101,7 +101,6 @@ view_changes_since(Db, DDoc, VName, StartSeq, Fun, Options, Acc) -> true -> View#mrview.key_byseq_btree; _ -> View#mrview.seq_btree end, - io:format("opt list ~p~n", [OptList]), AccOut = lists:foldl(fun(Opts, Acc0) -> {ok, _R, A} = couch_mrview_util:fold_changes( Btree, Fun, Acc0, Opts), http://git-wip-us.apache.org/repos/asf/couchdb/blob/f37134b7/apps/couch_mrview/src/couch_mrview_updater.erl ---------------------------------------------------------------------- diff --git a/apps/couch_mrview/src/couch_mrview_updater.erl b/apps/couch_mrview/src/couch_mrview_updater.erl index 03a0561..782502a 100644 --- a/apps/couch_mrview/src/couch_mrview_updater.erl +++ b/apps/couch_mrview/src/couch_mrview_updater.erl @@ -55,40 +55,66 @@ start_update(Partial, State, NumChanges) -> purge(_Db, PurgeSeq, PurgedIdRevs, State) -> #mrst{ id_btree=IdBtree, + log_btree=LogBtree, views=Views } = State, Ids = [Id || {Id, _Revs} <- PurgedIdRevs], - {ok, Lookups, IdBtree2} = couch_btree:query_modify(IdBtree, Ids, [], Ids), + {ok, Lookups, LLookups, LogBtree2, IdBtree2} = case LogBtree of + nil -> + {ok, L, Bt} = couch_btree:query_modify(IdBtree, Ids, [], Ids), + {ok, L, [], nil, Bt}; + _ -> + {ok, L, Bt} = couch_btree:query_modify(IdBtree, Ids, [], Ids), + {ok, LL, LBt} = couch_btree:query_modify(LogBtree, Ids, [], Ids), + {ok, L, LL, LBt, Bt} + end, MakeDictFun = fun ({ok, {DocId, ViewNumRowKeys}}, DictAcc) -> - FoldFun = fun({ViewNum, RowKey}, DictAcc2) -> - dict:append(ViewNum, {RowKey, DocId}, DictAcc2) + FoldFun = fun + ({ViewNum, {Key, Seq, _Op}}, DictAcc2) -> + dict:append(ViewNum, {Key, Seq, DocId}, DictAcc2); + ({ViewNum, RowKey}, DictAcc2) -> + dict:append(ViewNum, {RowKey, DocId}, DictAcc2) end, lists:foldl(FoldFun, DictAcc, ViewNumRowKeys); ({not_found, _}, DictAcc) -> DictAcc end, KeysToRemove = lists:foldl(MakeDictFun, dict:new(), Lookups), + SeqsToRemove = lists:foldl(MakeDictFun, dict:new(), LLookups), + + RemKeysFun = fun(#mrview{id_num=ViewId}=View) -> + ToRem = couch_util:dict_find(ViewId, KeysToRemove, []), + {ok, VBtree2} = couch_btree:add_remove(View#mrview.btree, [], ToRem), + NewPurgeSeq = case VBtree2 =/= View#mrview.btree of + true -> PurgeSeq; + _ -> View#mrview.purge_seq + end, + {SeqBtree2, KeyBySeqBtree2} = case View#mrview.seq_indexed of + true -> + SToRem = couch_util:dict_find(ViewId, SeqsToRemove, []), + SKs = [{Seq, Key} || {Key, Seq, _} <- SToRem], + KSs = [{[Seq, Key], DocId} || {Key, Seq, DocId} <- SToRem], + {ok, SBt} = couch_btree:add_remove(View#mrview.seq_btree, + [], SKs), + {ok, KSbt} = couch_btree:add_remove(View#mrview.key_byseq_btree, + [], KSs), + {SBt, KSbt}; + _ -> {nil, nil} + end, + View#mrview{btree=VBtree2, + seq_btree=SeqBtree2, + key_byseq_btree=KeyBySeqBtree2, + purge_seq=NewPurgeSeq} - RemKeysFun = fun(#mrview{id_num=Num, btree=Btree}=View) -> - case dict:find(Num, KeysToRemove) of - {ok, RemKeys} -> - {ok, Btree2} = couch_btree:add_remove(Btree, [], RemKeys), - NewPurgeSeq = case Btree2 /= Btree of - true -> PurgeSeq; - _ -> View#mrview.purge_seq - end, - View#mrview{btree=Btree2, purge_seq=NewPurgeSeq}; - error -> - View - end end, Views2 = lists:map(RemKeysFun, Views), {ok, State#mrst{ id_btree=IdBtree2, + log_btree=LogBtree2, views=Views2, purge_seq=PurgeSeq }}. @@ -313,7 +339,6 @@ update_log(Btree, Log, UpdatedSeq, _) -> end, KeysAcc, DIKeys), {[Id | IdsAcc], KeysAcc1} end, {[], []}, Log), - io:format("updated ~p~n", [Updated]), RemValue = {[{<<"_removed">>, true}]}, {Log1, AddAcc, DelAcc} = walk_log(Btree, fun({DocId, VIdKeys}, {Log2, AddAcc2, DelAcc2}) ->
