]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Make sure that recursclient gauge is calculated correctly.
authorWitold Kręcicki <wpk@isc.org>
Tue, 11 Jun 2019 09:32:35 +0000 (11:32 +0200)
committerMark Andrews <marka@isc.org>
Thu, 13 Jun 2019 03:35:44 +0000 (13:35 +1000)
We increase recursclients when we attach to recursion quota,
decrease when we detach. In some cases, when we hit soft
quota, we might attach to quota without increasing recursclients
gauge. We then decrease the gauge when we detach from quota,
and it causes the statistics to underflow.
Fix makes sure that we increase recursclients always when we
succesfully attach to recursion quota.

lib/ns/query.c

index 06f2b2fb2774362970077745e3ee15f8f28820f2..d990f4a1504a899545b15b54287fda8b9ac0919d 100644 (file)
@@ -2487,12 +2487,18 @@ 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_SUCCESS && !client->mortal && !TCP(client))
+               if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) {
+                       ns_stats_increment(client->sctx->nsstats,
+                                          ns_statscounter_recursclients);
+               }
+               if (result == ISC_R_SUCCESS && !client->mortal &&
+                   !TCP(client))
+               {
                        result = ns_client_replace(client);
-               if (result != ISC_R_SUCCESS)
+               }
+               if (result != ISC_R_SUCCESS) {
                        return;
-               ns_stats_increment(client->sctx->nsstats,
-                                  ns_statscounter_recursclients);
+               }
        }
 
        tmprdataset = ns_client_newrdataset(client);
@@ -2694,12 +2700,18 @@ 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_SUCCESS && !client->mortal && !TCP(client))
+               if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) {
+                       ns_stats_increment(client->sctx->nsstats,
+                                          ns_statscounter_recursclients);
+               }
+               if (result == ISC_R_SUCCESS && !client->mortal &&
+                   !TCP(client))
+               {
                        result = ns_client_replace(client);
-               if (result != ISC_R_SUCCESS)
+               }
+               if (result != ISC_R_SUCCESS) {
                        return;
-               ns_stats_increment(client->sctx->nsstats,
-                                  ns_statscounter_recursclients);
+               }
        }
 
        tmprdataset = ns_client_newrdataset(client);
@@ -5720,9 +5732,10 @@ ns_query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
        if (client->recursionquota == NULL) {
                result = isc_quota_attach(&client->sctx->recursionquota,
                                          &client->recursionquota);
-
-               ns_stats_increment(client->sctx->nsstats,
-                                  ns_statscounter_recursclients);
+               if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) {
+                       ns_stats_increment(client->sctx->nsstats,
+                                          ns_statscounter_recursclients);
+               }
 
                if  (result == ISC_R_SOFTQUOTA) {
                        static atomic_uint_fast32_t last = 0;