]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Make sure that recursclient gauge is calculated correctly.
authorWitold Kręcicki <wpk@isc.org>
Thu, 13 Jun 2019 12:29:52 +0000 (14:29 +0200)
committerOndřej Surý <ondrej@sury.org>
Wed, 26 Jun 2019 09:10:42 +0000 (11:10 +0200)
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.

bin/named/query.c

index f85cc764ac46e915c8c54e83cd13b0e1afbc78df..b34d7e8fb55d53330844fdbf2cc6daaf1b39e4f4 100644 (file)
@@ -4220,12 +4220,14 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
        if (client->recursionquota == NULL) {
                result = isc_quota_attach(&ns_g_server->recursionquota,
                                          &client->recursionquota);
+               if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) {
+                       isc_stats_increment(ns_g_server->nsstats,
+                                           dns_nsstatscounter_recursclients);
+               }
                if (result == ISC_R_SUCCESS && !client->mortal && !TCP(client))
                        result = ns_client_replace(client);
                if (result != ISC_R_SUCCESS)
                        return;
-               isc_stats_increment(ns_g_server->nsstats,
-                                   dns_nsstatscounter_recursclients);
        }
 
        tmprdataset = query_newrdataset(client);
@@ -4277,8 +4279,10 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
                result = isc_quota_attach(&ns_g_server->recursionquota,
                                          &client->recursionquota);
 
-               isc_stats_increment(ns_g_server->nsstats,
-                                   dns_nsstatscounter_recursclients);
+               if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) {
+                       isc_stats_increment(ns_g_server->nsstats,
+                                           dns_nsstatscounter_recursclients);
+               }
 
                if  (result == ISC_R_SOFTQUOTA) {
                        static isc_stdtime_t last = 0;
@@ -4535,12 +4539,14 @@ query_rpzfetch(ns_client_t *client, dns_name_t *qname, dns_rdatatype_t type) {
        if (client->recursionquota == NULL) {
                result = isc_quota_attach(&ns_g_server->recursionquota,
                                          &client->recursionquota);
+               if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) {
+                       isc_stats_increment(ns_g_server->nsstats,
+                                           dns_nsstatscounter_recursclients);
+               }
                if (result == ISC_R_SUCCESS && !client->mortal && !TCP(client))
                        result = ns_client_replace(client);
                if (result != ISC_R_SUCCESS)
                        return;
-               isc_stats_increment(ns_g_server->nsstats,
-                                   dns_nsstatscounter_recursclients);
        }
 
        tmprdataset = query_newrdataset(client);