summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2018-05-03 16:04:42 -0500
committerPaul J. Davis <paul.joseph.davis@gmail.com>2018-05-03 16:04:42 -0500
commitce3f77066f54adaafddb2ea11384bf2b68a1dbbb (patch)
tree246e51027065986415845520fc35c916ad8b300a
parent56b6bf7fa1e8bf3b59b08d6a7a06ee6e600b5756 (diff)
downloadcouchdb-ce3f77066f54adaafddb2ea11384bf2b68a1dbbb.tar.gz
[SQUERGE] Don't bump update_seq if all replicated purges are filtered out
-rw-r--r--src/couch/src/couch_db_updater.erl81
1 files changed, 43 insertions, 38 deletions
diff --git a/src/couch/src/couch_db_updater.erl b/src/couch/src/couch_db_updater.erl
index 31a36ad6d..72977182b 100644
--- a/src/couch/src/couch_db_updater.erl
+++ b/src/couch/src/couch_db_updater.erl
@@ -114,41 +114,8 @@ handle_call({purge_docs, PurgeReqs0, Options}, _From, Db) ->
({{_, _, _, _}, _}) -> []
end, lists:zip(PurgeInfos, PurgeReqs0))
end,
-
- Ids = lists:usort(lists:map(fun({_UUID, Id, _Revs}) -> Id end, PurgeReqs)),
- FDIs = couch_db_engine:open_docs(Db, Ids),
- USeq = couch_db_engine:get_update_seq(Db),
-
- IdFDIs = lists:zip(Ids, FDIs),
- {NewIdFDIs, Replies} = purge_docs(PurgeReqs, IdFDIs, USeq, []),
-
- Pairs = lists:flatmap(fun({DocId, OldFDI}) ->
- {DocId, NewFDI} = lists:keyfind(DocId, 1, NewIdFDIs),
- %io:format(standard_error, "~nPAIR: ~p~n", [{OldFDI, NewFDI}]),
- case {OldFDI, NewFDI} of
- {not_found, not_found} ->
- [];
- {#full_doc_info{} = A, #full_doc_info{} = A} ->
- [];
- {#full_doc_info{}, _} ->
- [{OldFDI, NewFDI}]
- end
- end, IdFDIs),
-
- PSeq = couch_db_engine:get_purge_seq(Db),
- {RevPInfos, _} = lists:foldl(fun({UUID, DocId, Revs}, {PIAcc, PSeqAcc}) ->
- Info = {PSeqAcc + 1, UUID, DocId, Revs},
- {[Info | PIAcc], PSeqAcc + 1}
- end, {[], PSeq}, PurgeReqs),
- PInfos = lists:reverse(RevPInfos),
-
- %io:format(standard_error, "~n~nPAIRS: ~p~n~n", [Pairs]),
-
- {ok, Db1} = couch_db_engine:purge_docs(Db, Pairs, PInfos),
- Db2 = commit_data(Db1),
- ok = gen_server:call(couch_server, {db_updated, Db2}, infinity),
- couch_event:notify(Db2#db.name, updated),
- {reply, {ok, Replies}, Db2, idle_limit()};
+ {ok, NewDb, Replies} = purge_docs(Db, PurgeReqs),
+ {reply, {ok, Replies}, NewDb, idle_limit()};
handle_call(Msg, From, Db) ->
case couch_db_engine:handle_db_updater_call(Msg, From, Db) of
@@ -674,10 +641,47 @@ update_local_doc_revs(Docs) ->
end, Docs).
-purge_docs([], IdFDIs, _USeq, Replies) ->
+purge_docs(Db, []) ->
+ {ok, Db, []};
+
+purge_docs(Db, PurgeReqs) ->
+ Ids = lists:usort(lists:map(fun({_UUID, Id, _Revs}) -> Id end, PurgeReqs)),
+ FDIs = couch_db_engine:open_docs(Db, Ids),
+ USeq = couch_db_engine:get_update_seq(Db),
+
+ IdFDIs = lists:zip(Ids, FDIs),
+ {NewIdFDIs, Replies} = apply_purge_reqs(PurgeReqs, IdFDIs, USeq, []),
+
+ Pairs = lists:flatmap(fun({DocId, OldFDI}) ->
+ {DocId, NewFDI} = lists:keyfind(DocId, 1, NewIdFDIs),
+ case {OldFDI, NewFDI} of
+ {not_found, not_found} ->
+ [];
+ {#full_doc_info{} = A, #full_doc_info{} = A} ->
+ [];
+ {#full_doc_info{}, _} ->
+ [{OldFDI, NewFDI}]
+ end
+ end, IdFDIs),
+
+ PSeq = couch_db_engine:get_purge_seq(Db),
+ {RevPInfos, _} = lists:foldl(fun({UUID, DocId, Revs}, {PIAcc, PSeqAcc}) ->
+ Info = {PSeqAcc + 1, UUID, DocId, Revs},
+ {[Info | PIAcc], PSeqAcc + 1}
+ end, {[], PSeq}, PurgeReqs),
+ PInfos = lists:reverse(RevPInfos),
+
+ {ok, Db1} = couch_db_engine:purge_docs(Db, Pairs, PInfos),
+ Db2 = commit_data(Db1),
+ ok = gen_server:call(couch_server, {db_updated, Db2}, infinity),
+ couch_event:notify(Db2#db.name, updated),
+ {ok, Db2, Replies}.
+
+
+apply_purge_reqs([], IdFDIs, _USeq, Replies) ->
{IdFDIs, lists:reverse(Replies)};
-purge_docs([Req | RestReqs], IdFDIs, USeq, Replies) ->
+apply_purge_reqs([Req | RestReqs], IdFDIs, USeq, Replies) ->
{_UUID, DocId, Revs} = Req,
{value, {_, FDI0}, RestIdFDIs} = lists:keytake(DocId, 1, IdFDIs),
{NewFDI, RemovedRevs, NewUSeq} = case FDI0 of
@@ -713,8 +717,9 @@ purge_docs([Req | RestReqs], IdFDIs, USeq, Replies) ->
% Not found means nothing to change
{not_found, [], USeq}
end,
+ NewIdFDIs = [{DocId, NewFDI} | RestIdFDIs],
NewReplies = [{ok, RemovedRevs} | Replies],
- purge_docs(RestReqs, [{DocId, NewFDI} | RestIdFDIs], NewUSeq, NewReplies).
+ apply_purge_reqs(RestReqs, NewIdFDIs, NewUSeq, NewReplies).
commit_data(Db) ->