diff --git a/lib/ns/include/ns/client.h b/lib/ns/include/ns/client.h index a5c1f0072e..c5d8e86cf7 100644 --- a/lib/ns/include/ns/client.h +++ b/lib/ns/include/ns/client.h @@ -267,8 +267,7 @@ struct ns_client { #define NS_CLIENTATTR_WANTPAD 0x08000 /*%< pad reply */ #define NS_CLIENTATTR_USEKEEPALIVE 0x10000 /*%< use TCP keepalive */ -#define NS_CLIENTATTR_NOSETFC 0x20000 /*%< don't set servfail cache */ -#define NS_CLIENTATTR_RECURSING 0x40000 /*%< client is recursing */ +#define NS_CLIENTATTR_NOSETFC 0x20000 /*%< don't set servfail cache */ /* * Flag to use with the SERVFAIL cache to indicate diff --git a/lib/ns/query.c b/lib/ns/query.c index d87d1f8ec9..4ef38965ed 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -2530,6 +2530,8 @@ prefetch_done(isc_task_t *task, isc_event_t *event) { */ if (client->recursionquota != NULL) { isc_quota_detach(&client->recursionquota); + ns_stats_decrement(client->sctx->nsstats, + ns_statscounter_recursclients); } free_devent(client, &event, &devent); @@ -2557,10 +2559,15 @@ query_prefetch(ns_client_t *client, dns_name_t *qname, if (client->recursionquota == NULL) { result = isc_quota_attach(&client->sctx->recursionquota, &client->recursionquota); - if (result == ISC_R_SOFTQUOTA) { + switch (result) { + case ISC_R_SUCCESS: + ns_stats_increment(client->sctx->nsstats, + ns_statscounter_recursclients); + break; + case ISC_R_SOFTQUOTA: isc_quota_detach(&client->recursionquota); - } - if (result != ISC_R_SUCCESS) { + /* FALLTHROUGH */ + default: return; } } @@ -2770,10 +2777,15 @@ query_rpzfetch(ns_client_t *client, dns_name_t *qname, dns_rdatatype_t type) { if (client->recursionquota == NULL) { result = isc_quota_attach(&client->sctx->recursionquota, &client->recursionquota); - if (result == ISC_R_SOFTQUOTA) { + switch (result) { + case ISC_R_SUCCESS: + ns_stats_increment(client->sctx->nsstats, + ns_statscounter_recursclients); + break; + case ISC_R_SOFTQUOTA: isc_quota_detach(&client->recursionquota); - } - if (result != ISC_R_SUCCESS) { + /* FALLTHROUGH */ + default: return; } } @@ -6185,15 +6197,6 @@ fetch_callback(isc_task_t *task, isc_event_t *event) { isc_quota_detach(&client->recursionquota); ns_stats_decrement(client->sctx->nsstats, ns_statscounter_recursclients); - } else if (client->attributes & NS_CLIENTATTR_RECURSING) { - client->attributes &= ~NS_CLIENTATTR_RECURSING; - /* - * Detached from recursionquota via prefetch_done(), - * but need to decrement recursive client stats here anyway, - * since it was incremented in ns_query_recurse(). - */ - ns_stats_decrement(client->sctx->nsstats, - ns_statscounter_recursclients); } LOCK(&client->manager->reclock); @@ -6332,7 +6335,6 @@ check_recursionquota(ns_client_t *client) { if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) { ns_stats_increment(client->sctx->nsstats, ns_statscounter_recursclients); - client->attributes |= NS_CLIENTATTR_RECURSING; } if (result == ISC_R_SOFTQUOTA) { @@ -6381,18 +6383,6 @@ check_recursionquota(ns_client_t *client) { dns_message_clonebuffer(client->message); ns_client_recursing(client); - } else if ((client->attributes & NS_CLIENTATTR_RECURSING) == 0) { - client->attributes |= NS_CLIENTATTR_RECURSING; - /* - * query_prefetch() attached first to client->recursionquota, - * but we must check if NS_CLIENTATTR_RECURSING attribute is - * on, if not then turn it on and increment recursing clients - * stats counter only once. The attribute is also checked in - * fetch_callback() to know if a matching decrement to this - * counter should be applied. - */ - ns_stats_increment(client->sctx->nsstats, - ns_statscounter_recursclients); } return (result);