This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/main by this push:
new d521620ca Remove purge max_document_id_number and change
max_revisions_number
d521620ca is described below
commit d521620cacaccb551f6c3b22fa39c00982d48dfb
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