This is an automated email from the ASF dual-hosted git repository. vatamane pushed a commit to branch remove-max-id-purge-limit in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit d6e9d412b24bd58a3c0a5b3dda35a54faedf827f Author: Nick Vatamaniuc <[email protected]> AuthorDate: Tue Oct 14 23:24:26 2025 -0400 Remove purge max_document_id_number and change max_revisions_number * Remove `max_document_id_number` setting. Purged revisions are already limited via `max_revisions_number` so it's somewhat redundant to also limit them via doc ids. For example, the effect of setting max docs ids = 1000, and max revisions = 500 would be odd since the limits are dependent, and max revisions will limit the max docs ids anyway (unless we discard case of users posting doc ID entries with empty revisions lists). How these limits interact can be confusing so let's have just one of them. * Make max_revisions_number unlimited by default. None of the other bulk endpoints like `_bulk_docs` and `_bulk_get` have limits so it's awkward to pick a limit for `_purge`. Depending on hardware environment some systems can hanle more than 1000 revisions, some smaller ones might not be able to handle 1000, so let's not pick a default. However still keep the setting around for compatibility, some users may still want limit the revisions if they wants based on their needs. --- rel/overlay/etc/default.ini | 5 +---- src/chttpd/src/chttpd_db.erl | 27 ++++++++++------------- src/chttpd/test/eunit/chttpd_purge_tests.erl | 32 ++-------------------------- src/docs/src/cluster/purging.rst | 4 +--- src/docs/src/config/misc.rst | 13 ++--------- 5 files changed, 17 insertions(+), 64 deletions(-) diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini index ccc324e9f..6dcda19cb 100644 --- a/rel/overlay/etc/default.ini +++ b/rel/overlay/etc/default.ini @@ -168,11 +168,8 @@ view_index_dir = {{view_index_dir}} ;db_btree_cache_depth = 3 [purge] -; Allowed maximum number of documents in one purge request -;max_document_id_number = 100 - ; Allowed maximum number of accumulated revisions in one purge request -;max_revisions_number = 1000 +;max_revisions_number = infinity ; Allowed durations when index is not updated for local purge checkpoint ; document. Default is 24 hours. diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl index f7ca6122e..111ae4eed 100644 --- a/src/chttpd/src/chttpd_db.erl +++ b/src/chttpd/src/chttpd_db.erl @@ -730,22 +730,17 @@ db_req(#httpd{method = 'POST', path_parts = [_, <<"_purge">>]} = Req, Db) -> Options = [{user_ctx, Req#httpd.user_ctx}, {w, W}], {IdsRevs} = chttpd:json_body_obj(Req), IdsRevs2 = [{Id, couch_doc:parse_revs(Revs)} || {Id, Revs} <- IdsRevs], - MaxIds = config:get_integer("purge", "max_document_id_number", 100), - case length(IdsRevs2) =< MaxIds of - false -> throw({bad_request, "Exceeded maximum number of documents."}); - true -> ok - end, - RevsLen = lists:foldl( - fun({_Id, Revs}, Acc) -> - length(Revs) + Acc - end, - 0, - IdsRevs2 - ), - MaxRevs = config:get_integer("purge", "max_revisions_number", 1000), - case RevsLen =< MaxRevs of - false -> throw({bad_request, "Exceeded maximum number of revisions."}); - true -> ok + case config:get("purge", "max_revisions_number", "infinity") of + "infinity" -> + ok; + Val -> + MaxRevs = list_to_integer(Val), + SumFun = fun({_Id, Revs}, Acc) -> length(Revs) + Acc end, + RevsLen = lists:foldl(SumFun, 0, IdsRevs2), + case RevsLen =< MaxRevs of + false -> throw({bad_request, "Exceeded maximum number of revisions."}); + true -> ok + end end, couch_stats:increment_counter([couchdb, document_purges, total], length(IdsRevs2)), Results2 = diff --git a/src/chttpd/test/eunit/chttpd_purge_tests.erl b/src/chttpd/test/eunit/chttpd_purge_tests.erl index 352e5ba22..3b91571ee 100644 --- a/src/chttpd/test/eunit/chttpd_purge_tests.erl +++ b/src/chttpd/test/eunit/chttpd_purge_tests.erl @@ -49,7 +49,6 @@ purge_test_() -> ?TDEF_FE(t_purge_only_post_allowed), ?TDEF_FE(t_empty_purge_request), ?TDEF_FE(t_ok_purge_request), - ?TDEF_FE(t_ok_purge_with_max_document_id_number), ?TDEF_FE(t_accepted_purge_request), ?TDEF_FE(t_partial_purge_request), ?TDEF_FE(t_mixed_purge_request), @@ -85,23 +84,6 @@ t_ok_purge_request(DbUrl) -> ?assertMatch(#{<<"purge_seq">> := null, <<"purged">> := IdsRevs}, Response2), ?assert(Status =:= 201 orelse Status =:= 202). -t_ok_purge_with_max_document_id_number(DbUrl) -> - PurgedDocsNum = 101, - {201, Response1} = create_docs(DbUrl, docs(PurgedDocsNum)), - IdsRevs = ids_revs(Response1), - - {400, #{<<"reason">> := Error}} = req(post, url(DbUrl, "_purge"), IdsRevs), - ?assertEqual(<<"Exceeded maximum number of documents.">>, Error), - - ok = config:set("purge", "max_document_id_number", "101", _Persist = false), - try - {Status, Response2} = req(post, url(DbUrl, "_purge"), IdsRevs), - ?assertMatch(#{<<"purge_seq">> := null, <<"purged">> := IdsRevs}, Response2), - ?assert(Status =:= 201 orelse Status =:= 202) - after - ok = config:delete("purge", "max_document_id_number", _Persist) - end. - t_accepted_purge_request(DbUrl) -> try meck:new(fabric, [passthrough]), @@ -173,24 +155,14 @@ t_over_many_ids_or_revs_purge_request(DbUrl) -> <<"doc3">> => [Rev3] }, - % Ids larger than expected - config:set("purge", "max_document_id_number", "1", _Persist = false), - try - {Status1, #{<<"reason">> := Error1}} = req(post, url(DbUrl, "_purge"), IdsRevs), - ?assertEqual(<<"Exceeded maximum number of documents.">>, Error1), - ?assertEqual(400, Status1) - after - config:delete("purge", "max_document_id_number", _Persist) - end, - % Revs larger than expected - config:set("purge", "max_revisions_number", "1", _Persist), + config:set("purge", "max_revisions_number", "1", false), try {Status2, #{<<"reason">> := Error2}} = req(post, url(DbUrl, "_purge"), IdsRevs), ?assertEqual(<<"Exceeded maximum number of revisions.">>, Error2), ?assertEqual(400, Status2) after - config:delete("purge", "max_revisions_number", _Persist) + config:delete("purge", "max_revisions_number", false) end. t_purged_infos_limit_only_get_put_allowed(DbUrl) -> diff --git a/src/docs/src/cluster/purging.rst b/src/docs/src/cluster/purging.rst index cc9087d89..af5d7556f 100644 --- a/src/docs/src/cluster/purging.rst +++ b/src/docs/src/cluster/purging.rst @@ -141,10 +141,8 @@ These settings can be updated in the default.ini or local.ini: +-----------------------+--------------------------------------------+----------+ | Field | Description | Default | +=======================+============================================+==========+ -| max_document_id_number| Allowed maximum number of documents in one | 100 | -| | purge request | | +-----------------------+--------------------------------------------+----------+ -| max_revisions_number | Allowed maximum number of accumulated | 1000 | +| max_revisions_number | Allowed maximum number of accumulated | infinity | | | revisions in one purge request | | +-----------------------+--------------------------------------------+----------+ | allowed_purge_seq_lag | Beside purged_infos_limit, allowed | 100 | diff --git a/src/docs/src/config/misc.rst b/src/docs/src/config/misc.rst index 8373e0f98..6c9d6003e 100644 --- a/src/docs/src/config/misc.rst +++ b/src/docs/src/config/misc.rst @@ -313,26 +313,17 @@ Configuration of Database Purge .. config:section:: purge :: Configuration of Database Purge - .. config:option:: max_document_id_number :: Allowed number of documents \ - per Delete-Request - - .. versionadded:: 3.0 - - Sets the maximum number of documents allowed in a single purge request:: - - [purge] - max_document_id_number = 100 - .. config:option:: max_revisions_number :: Allowed number of accumulated \ revisions per Purge-Request .. versionadded:: 3.0 + .. versionchanged:: 3.6 Sets the maximum number of accumulated revisions allowed in a single purge request:: [purge] - max_revisions_number = 1000 + max_revisions_number = infinity .. config:option:: index_lag_warn_seconds :: Allowed duration for purge \ checkpoint document
