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.
void
dns_resolver_cancelfetch(dns_fetch_t *fetch) {
fetchctx_t *fctx = NULL;
+ bool last_fetch = false;
REQUIRE(DNS_FETCH_VALID(fetch));
fctx = fetch->private;
}
}
- /*
- * 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