From: Evan Hunt Date: Thu, 25 Jul 2013 17:51:31 +0000 (-0700) Subject: [master] perf: eliminate cache stats attach/detach X-Git-Tag: v9.10.0a1~190 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d640b4a0ab9dec252749793f78a1ed1e8551ea19;p=thirdparty%2Fbind9.git [master] perf: eliminate cache stats attach/detach 3622. [tuning] Eliminate an unnecessary lock when incrementing cache statistics. [RT #34339] --- diff --git a/CHANGES b/CHANGES index 5d7e2a1962f..52bbff4c044 100644 --- 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] diff --git a/bin/named/query.c b/bin/named/query.c index c805d26db1c..a592967f83b 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -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"); diff --git a/lib/dns/cache.c b/lib/dns/cache.c index c1a94ed7b68..abe163b35da 100644 --- a/lib/dns/cache.c +++ b/lib/dns/cache.c @@ -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 diff --git a/lib/dns/include/dns/cache.h b/lib/dns/include/dns/cache.h index 89a64b49ed0..5e196ffd6f9 100644 --- a/lib/dns/include/dns/cache.h +++ b/lib/dns/include/dns/cache.h @@ -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); diff --git a/lib/dns/win32/libdns.def b/lib/dns/win32/libdns.def index 8ecad2337f1..18b67709fad 100644 --- a/lib/dns/win32/libdns.def +++ b/lib/dns/win32/libdns.def @@ -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