#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_NOSETFC 0x20000 /*%< don't set servfail cache */
+#define NS_CLIENTATTR_RECURSING 0x40000 /*%< client is recursing */
/*
* Flag to use with the SERVFAIL cache to indicate
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);
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) {
}
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);
}
/*