[9.20] chg: usr: Exempt prefetches from the fetches-per-zone and fetches-per-server quotas

Fetches generated automatically as a result of 'prefetch' are now
exempt from the 'fetches-per-zone' and 'fetches-per-server' quotas.
This should help in maintaining the cache from which query responses
can be given.

Closes #4219

Backport of MR !9095

Merge branch 'backport-4219-exempt-good-queries-from-fetch-limits-9.20' into 'bind-9.20'

See merge request isc-projects/bind9!9420
This commit is contained in:
Arаm Sаrgsyаn 2024-08-26 16:29:16 +00:00
commit 5e78cade52
4 changed files with 38 additions and 8 deletions

View file

@ -3842,6 +3842,11 @@ system.
is sent to that domain, it is recreated with the counters set
to zero.)
.. note::
Fetches generated automatically in the result of :any:`prefetch` are
exempt from this quota.
.. namedconf:statement:: fetches-per-server
:tags: server, query
:short: Sets the maximum number of simultaneous iterative queries allowed to be sent by a server to an upstream name server before the server blocks additional queries.
@ -3873,6 +3878,11 @@ system.
increased. The :any:`fetch-quota-params` options can be used to adjust
the parameters for this calculation.
.. note::
Fetches generated automatically in the result of :any:`prefetch` are
exempt from this quota, but they are included in the quota calculations.
.. namedconf:statement:: fetch-quota-params
:tags: server, query
:short: Sets the parameters for dynamic resizing of the :any:`fetches-per-server` quota in response to detected congestion.

View file

@ -1481,7 +1481,9 @@ copy_namehook_lists(dns_adb_t *adb, dns_adbfind_t *find, dns_adbname_t *name) {
dns_adbaddrinfo_t *addrinfo = NULL;
entry = namehook->entry;
if (adbentry_overquota(entry)) {
if ((find->options & DNS_ADBFIND_QUOTAEXEMPT) == 0 &&
adbentry_overquota(entry))
{
find->options |= DNS_ADBFIND_OVERQUOTA;
goto nextv4;
}
@ -1503,7 +1505,9 @@ copy_namehook_lists(dns_adb_t *adb, dns_adbfind_t *find, dns_adbname_t *name) {
dns_adbaddrinfo_t *addrinfo = NULL;
entry = namehook->entry;
if (adbentry_overquota(entry)) {
if ((find->options & DNS_ADBFIND_QUOTAEXEMPT) == 0 &&
adbentry_overquota(entry))
{
find->options |= DNS_ADBFIND_OVERQUOTA;
goto nextv6;
}

View file

@ -179,6 +179,10 @@ struct dns_adbfind {
* This is useful for reestablishing glue that has expired.
*/
#define DNS_ADBFIND_STARTATZONE 0x00000020
/*%
* Fetches will be exempted from the quota.
*/
#define DNS_ADBFIND_QUOTAEXEMPT 0x00000040
/*%
* The server's fetch quota is exceeded; it will be treated as
* lame for this query.

View file

@ -3263,6 +3263,13 @@ findname(fetchctx_t *fctx, const dns_name_t *name, in_port_t port,
options |= DNS_ADBFIND_STARTATZONE;
}
/*
* Exempt prefetches from ADB quota.
*/
if ((fctx->options & DNS_FETCHOPT_PREFETCH) != 0) {
options |= DNS_ADBFIND_QUOTAEXEMPT;
}
/*
* See what we know about this address.
*/
@ -4667,13 +4674,18 @@ fctx_create(dns_resolver_t *res, isc_loop_t *loop, const dns_name_t *name,
}
/*
* Are there too many simultaneous queries for this domain?
* Exempt prefetch queries from the fetches-per-zone quota check
*/
result = fcount_incr(fctx, false);
if (result != ISC_R_SUCCESS) {
result = fctx->res->quotaresp[dns_quotatype_zone];
inc_stats(res, dns_resstatscounter_zonequota);
goto cleanup_nameservers;
if ((fctx->options & DNS_FETCHOPT_PREFETCH) == 0) {
/*
* Are there too many simultaneous queries for this domain?
*/
result = fcount_incr(fctx, false);
if (result != ISC_R_SUCCESS) {
result = fctx->res->quotaresp[dns_quotatype_zone];
inc_stats(res, dns_resstatscounter_zonequota);
goto cleanup_nameservers;
}
}
log_ns_ttl(fctx, "fctx_create");