From c90aa1692903db275c579d89ad11e211e2d51a7a Mon Sep 17 00:00:00 2001 From: Aram Sargsyan Date: Fri, 7 Jun 2024 16:24:00 +0000 Subject: [PATCH] Exempt prefetches from the fetches-per-server quota Give prefetches a free pass through the quota so that the cache entries for popular zones could be updated successfully even if the quota for is already reached. (cherry picked from commit c7e8b7cf63385bf642b003b09ca987ec3dc2f924) --- lib/dns/adb.c | 8 ++++++-- lib/dns/include/dns/adb.h | 4 ++++ lib/dns/resolver.c | 7 +++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 23da59c330..a8214c9d39 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -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; } diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index cf725b62fc..65acb09ccf 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -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. diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 5936d16274..ded2e296fb 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -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. */