Shutdown the fetch context after canceling the last fetch

Currently, the fetch context will continue running even when the last
fetch (response) has been removed from the context, so named can process
and cache the answer.  This can lead to a situation where the number of
outgoing recursing clients exceeds the the configured number for
recursive-clients.

Be more stringent about the recursive-clients limit and shutdown the
fetch context immediately after the last fetch has been canceled from
that particular fetch context.

(cherry picked from commit 9f945c8b67)
This commit is contained in:
Ondřej Surý 2025-01-15 13:02:20 +01:00
parent 0ab22458f5
commit ea301cf062
No known key found for this signature in database
GPG key ID: 2820F37E873DEA41

View file

@ -10604,6 +10604,7 @@ fail:
void
dns_resolver_cancelfetch(dns_fetch_t *fetch) {
fetchctx_t *fctx = NULL;
bool last_fetch = false;
REQUIRE(DNS_FETCH_VALID(fetch));
fctx = fetch->private;
@ -10634,11 +10635,15 @@ dns_resolver_cancelfetch(dns_fetch_t *fetch) {
}
}
/*
* The fctx continues running even if no fetches remain;
* the answer is still cached.
*/
if (ISC_LIST_EMPTY(fctx->resps)) {
last_fetch = true;
}
UNLOCK(&fctx->lock);
if (last_fetch) {
fetchctx_ref(fctx);
isc_async_run(fctx->loop, fctx_shutdown, fctx);
}
}
void