]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[master] perf: eliminate cache stats attach/detach
authorEvan Hunt <each@isc.org>
Thu, 25 Jul 2013 17:51:31 +0000 (10:51 -0700)
committerEvan Hunt <each@isc.org>
Thu, 25 Jul 2013 17:51:31 +0000 (10:51 -0700)
3622. [tuning] Eliminate an unnecessary lock when incrementing
cache statistics. [RT #34339]

CHANGES
bin/named/query.c
lib/dns/cache.c
lib/dns/include/dns/cache.h
lib/dns/win32/libdns.def

diff --git a/CHANGES b/CHANGES
index 5d7e2a1962f7f4d4873961f04743f73c56e3d71a..52bbff4c04440734f88d959fe0c7914376f732b4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3622.  [tuning]        Eliminate an unnecessary lock when incrementing
+                       cache statistics. [RT #34339]
+
 3621.  [security]      Incorrect bounds checking on private type 'keydata'
                        can lead to a remotely triggerable REQUIRE failure
                        (CVE-2013-4854). [RT #34238]
index c805d26db1c17cec7150a916b9b18269097d391d..a592967f83b44fae0d63df2e7ad14be9df43fa62 100644 (file)
@@ -1205,31 +1205,6 @@ query_isduplicate(ns_client_t *client, dns_name_t *name,
        return (ISC_FALSE);
 }
 
-static void
-update_cachestats(dns_cache_t *cache, isc_result_t result) {
-       isc_stats_t *cachestats = NULL;
-       if (cache == NULL)
-               return;
-
-       isc_stats_attach(dns_cache_getstats(cache), &cachestats);
-       switch (result) {
-       case ISC_R_SUCCESS:
-       case DNS_R_NCACHENXDOMAIN:
-       case DNS_R_NCACHENXRRSET:
-       case DNS_R_CNAME:
-       case DNS_R_DNAME:
-       case DNS_R_GLUE:
-       case DNS_R_ZONECUT:
-               isc_stats_increment(cachestats,
-                                   dns_cachestatscounter_queryhits);
-               break;
-       default:
-               isc_stats_increment(cachestats,
-                                   dns_cachestatscounter_querymisses);
-       }
-       isc_stats_detach(&cachestats);
-}
-
 static isc_result_t
 query_addadditional(void *arg, dns_name_t *name, dns_rdatatype_t qtype) {
        ns_client_t *client = arg;
@@ -1362,7 +1337,7 @@ query_addadditional(void *arg, dns_name_t *name, dns_rdatatype_t qtype) {
                                client->now, &node, fname, &cm, &ci,
                                rdataset, sigrdataset);
 
-       update_cachestats(client->view->cache, result);
+       dns_cache_updatestats(client->view->cache, result);
        if (result == DNS_R_GLUE &&
            validate(client, db, fname, rdataset, sigrdataset))
                result = ISC_R_SUCCESS;
@@ -6294,7 +6269,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
                                &node, fname, &cm, &ci, rdataset, sigrdataset);
 
        if (db == client->view->cachedb)
-               update_cachestats(client->view->cache, result);
+               dns_cache_updatestats(client->view->cache, result);
 
  resume:
        CTRACE("query_find: resume");
index c1a94ed7b6849e50a0da5aada4f60ff3541e9949..abe163b35da15027cbe51e408c17599a3dbdfb6a 100644 (file)
@@ -1300,6 +1300,29 @@ dns_cache_getstats(dns_cache_t *cache) {
        return (cache->stats);
 }
 
+void
+dns_cache_updatestats(dns_cache_t *cache, isc_result_t result) {
+       REQUIRE(VALID_CACHE(cache));
+       if (cache->stats == NULL)
+               return;
+
+       switch (result) {
+       case ISC_R_SUCCESS:
+       case DNS_R_NCACHENXDOMAIN:
+       case DNS_R_NCACHENXRRSET:
+       case DNS_R_CNAME:
+       case DNS_R_DNAME:
+       case DNS_R_GLUE:
+       case DNS_R_ZONECUT:
+               isc_stats_increment(cache->stats,
+                                   dns_cachestatscounter_queryhits);
+               break;
+       default:
+               isc_stats_increment(cache->stats,
+                                   dns_cachestatscounter_querymisses);
+       }
+}
+
 /*
  * XXX: Much of the following code has been copied in from statschannel.c.
  * We should refactor this into a generic function in stats.c that can be
index 89a64b49ed0ba26ba14f1a6f6f5b607b5cb14cc2..5e196ffd6f9bb76ca3045cdd55d5d9d38d7689cd 100644 (file)
@@ -320,6 +320,12 @@ dns_cache_dumpstats(dns_cache_t *cache, FILE *fp);
  * Dump cache statistics and status in text to 'fp'
  */
 
+void
+dns_cache_updatestats(dns_cache_t *cache, isc_result_t result);
+/*
+ * Update cache statistics based on result code in 'result'
+ */
+
 #ifdef HAVE_LIBXML2
 int
 dns_cache_renderxml(dns_cache_t *cache, xmlTextWriterPtr writer);
index 8ecad2337f1f2eb4d230071e1ceec5aa39ac7f2e..18b67709fad3ad6fa6383cd047201718d3a9cdc8 100644 (file)
@@ -74,6 +74,7 @@ dns_cache_renderxml
 dns_cache_setcachesize
 dns_cache_setcleaninginterval
 dns_cache_setfilename
+dns_cache_updatestats
 dns_cert_fromtext
 dns_cert_totext
 dns_clientinfo_init