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

Reply via email to