static dns_dispatch_t *dispatch6 = NULL;
static dns_db_t *roothints = NULL;
static isc_stats_t *resstats = NULL;
-static dns_stats_t *resquerystats = NULL;
+static isc_statsmulti_t *resquerystats = NULL;
static FILE *logfp = NULL;
/* Managers */
dns_rdatatypestats_create(isc_g_mctx, &resquerystats);
dns_resolver_setquerystats(view->resolver, resquerystats);
- dns_stats_detach(&resquerystats);
+ isc_statsmulti_detach(&resquerystats);
dns_view_freeze(view);
bool empty_zones_enable;
const cfg_obj_t *disablelist = NULL;
isc_stats_t *resstats = NULL;
- dns_stats_t *resquerystats = NULL;
+ isc_statsmulti_t *resquerystats = NULL;
bool auto_root = false;
named_cache_t *nsc = NULL;
bool zero_no_soattl;
isc_stats_detach(&resstats);
}
if (resquerystats != NULL) {
- dns_stats_detach(&resquerystats);
+ isc_statsmulti_detach(&resquerystats);
}
if (order != NULL) {
dns_order_detach(&order);
#include <isc/mem.h>
#include <isc/once.h>
#include <isc/stats.h>
-#include <isc/statsmulti.h>
#include <isc/string.h>
#include <isc/util.h>
#endif /* ifdef HAVE_LIBXML2 */
}
-static void rdtypestat_dump(dns_rdatastatstype_t type, uint64_t val, void *arg);
-
-static void
-rdtypestat_dumpcb(isc_statscounter_t counter, uint64_t value, void *arg) {
- dns_rdatastatstype_t type;
- dns_rdatatype_t rdtype = dns_rdatatype_none;
- unsigned int attributes = 0;
-
- /* Convert counter back to dns_rdatastatstype_t, based on rdatatype_dumpcb */
- if ((counter & 0xff) == 0) {
- attributes |= DNS_RDATASTATSTYPE_ATTR_OTHERTYPE;
- } else {
- rdtype = (dns_rdatatype_t)(counter & 0xff);
- }
- type = DNS_RDATASTATSTYPE_VALUE((dns_rdatastatstype_t)rdtype, attributes);
- rdtypestat_dump(type, value, arg);
-}
-
static void
rdtypestat_dump(dns_rdatastatstype_t type, uint64_t val, void *arg) {
char typebuf[64];
if (statlevel == dns_zonestat_full) {
isc_stats_t *zonestats;
isc_stats_t *gluecachestats;
- dns_stats_t *rcvquerystats;
+ isc_statsmulti_t *rcvquerystats;
dns_stats_t *dnssecsignstats;
uint64_t nsstat_values[ns_statscounter_max];
uint64_t gluecachestats_values[dns_gluecachestatscounter_max];
ISC_XMLCHAR "qtype"));
dumparg.result = ISC_R_SUCCESS;
- isc_statsmulti_dump(server->sctx->rcvquerystats,
- rdtypestat_dumpcb, &dumparg, 0);
+ dns_rdatatypestats_dump(server->sctx->rcvquerystats,
+ rdtypestat_dump, &dumparg, 0);
CHECK(dumparg.result);
TRY0(xmlTextWriterEndElement(writer)); /* counters */
STATS_XML_XFRINS)) != 0))
{
isc_stats_t *istats = NULL;
- dns_stats_t *dstats = NULL;
+ isc_statsmulti_t *dstats = NULL;
dns_adb_t *adb = NULL;
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"));
&dumparg, 0);
CHECK(dumparg.result);
}
- dns_stats_detach(&dstats);
+ isc_statsmulti_detach(&dstats);
TRY0(xmlTextWriterEndElement(writer));
/* <resstats> */
if (statlevel == dns_zonestat_full) {
isc_stats_t *zonestats;
isc_stats_t *gluecachestats;
- dns_stats_t *rcvquerystats;
+ isc_statsmulti_t *rcvquerystats;
dns_stats_t *dnssecsignstats;
uint64_t nsstat_values[ns_statscounter_max];
uint64_t gluecachestats_values[dns_gluecachestatscounter_max];
dumparg.result = ISC_R_SUCCESS;
dumparg.arg = counters;
- isc_statsmulti_dump(server->sctx->rcvquerystats,
- rdtypestat_dumpcb, &dumparg, 0);
+ dns_rdatatypestats_dump(server->sctx->rcvquerystats,
+ rdtypestat_dump, &dumparg, 0);
if (dumparg.result != ISC_R_SUCCESS) {
json_object_put(counters);
goto cleanup;
if ((flags & STATS_JSON_SERVER) != 0) {
json_object *res = NULL;
- dns_stats_t *dstats = NULL;
+ isc_statsmulti_t *dstats = NULL;
isc_stats_t *istats = NULL;
res = json_object_new_object();
json_object_object_add(res, "qtypes",
counters);
- dns_stats_detach(&dstats);
+ isc_statsmulti_detach(&dstats);
}
- dstats = dns_db_getrrsetstats(view->cachedb);
- if (dstats != NULL) {
+ dns_stats_t *rrsetstats = dns_db_getrrsetstats(view->cachedb);
+ if (rrsetstats != NULL) {
counters = json_object_new_object();
CHECKMEM(counters);
dumparg.arg = counters;
dumparg.result = ISC_R_SUCCESS;
dns_rdatasetstats_dump(
- dstats, rdatasetstats_dump,
+ rrsetstats, rdatasetstats_dump,
&dumparg, 0);
if (dumparg.result != ISC_R_SUCCESS) {
json_object_put(counters);
&dumparg, 0);
fprintf(fp, "++ Incoming Queries ++\n");
- isc_statsmulti_dump(server->sctx->rcvquerystats, rdtypestat_dumpcb,
- &dumparg, 0);
+ dns_rdatatypestats_dump(server->sctx->rcvquerystats, rdtypestat_dump,
+ &dumparg, 0);
fprintf(fp, "++ Outgoing Rcodes ++\n");
dns_rcodestats_dump(server->sctx->rcodestats, rcodestat_dump, &dumparg,
fprintf(fp, "++ Outgoing Queries ++\n");
ISC_LIST_FOREACH(server->viewlist, view, link) {
- dns_stats_t *dstats = NULL;
+ isc_statsmulti_t *dstats = NULL;
dns_resolver_getquerystats(view->resolver, &dstats);
if (dstats == NULL) {
continue;
fprintf(fp, "[View: %s]\n", view->name);
}
dns_rdatatypestats_dump(dstats, rdtypestat_dump, &dumparg, 0);
- dns_stats_detach(&dstats);
+ isc_statsmulti_detach(&dstats);
}
fprintf(fp, "++ Name Server Statistics ++\n");
dns_masterformat_t masterformat;
const dns_master_style_t *masterstyle = &dns_master_style_default;
isc_stats_t *zoneqrystats;
- dns_stats_t *rcvquerystats;
+ isc_statsmulti_t *rcvquerystats;
dns_stats_t *dnssecsignstats;
dns_zonestat_level_t statlevel = dns_zonestat_none;
dns_ttl_t maxttl = 0; /* unlimited */
}
if (rcvquerystats != NULL) {
- dns_stats_detach(&rcvquerystats);
+ isc_statsmulti_detach(&rcvquerystats);
}
if (dnssecsignstats != NULL) {
#include <isc/loop.h>
#include <isc/refcount.h>
#include <isc/stats.h>
+#include <isc/statsmulti.h>
#include <isc/tls.h>
#include <isc/types.h>
*/
void
-dns_resolver_setquerystats(dns_resolver_t *res, dns_stats_t *stats);
+dns_resolver_setquerystats(dns_resolver_t *res, isc_statsmulti_t *stats);
/*%<
* Set a statistics counter set of rdata type, 'stats', for 'res'. Once the
* statistic set is installed, the resolver will count outgoing queries
*/
void
-dns_resolver_getquerystats(dns_resolver_t *res, dns_stats_t **statsp);
+dns_resolver_getquerystats(dns_resolver_t *res, isc_statsmulti_t **statsp);
/*%<
* Get the rdatatype statistics counter set for 'res'. If a statistics set is
* set '*statsp' will be attached to the set; otherwise, '*statsp' will be
#include <inttypes.h>
#include <isc/histo.h>
+#include <isc/statsmulti.h>
#include <dns/types.h>
*/
void
-dns_rdatatypestats_create(isc_mem_t *mctx, dns_stats_t **statsp);
+dns_rdatatypestats_create(isc_mem_t *mctx, isc_statsmulti_t **statsp);
/*%<
* Create a statistics counter structure per rdatatype.
*
*/
void
-dns_rdatatypestats_increment(dns_stats_t *stats, dns_rdatatype_t type);
+dns_rdatatypestats_increment(isc_statsmulti_t *stats, dns_rdatatype_t type);
/*%<
* Increment the statistics counter for 'type'.
*
* Requires:
- *\li 'stats' is a valid dns_stats_t created by dns_rdatatypestats_create().
+ *\li 'stats' is a valid isc_statsmulti_t created by dns_rdatatypestats_create().
*/
void
*/
void
-dns_rdatatypestats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn,
+dns_rdatatypestats_dump(isc_statsmulti_t *stats, dns_rdatatypestats_dumper_t dump_fn,
void *arg, unsigned int options);
/*%<
* Dump the current statistics counters in a specified way. For each counter
* the ISC_STATSDUMP_VERBOSE flag, even such counters are dumped.
*
* Requires:
- *\li 'stats' is a valid dns_stats_t created by dns_generalstats_create().
+ *\li 'stats' is a valid isc_statsmulti_t created by dns_rdatatypestats_create().
*/
void
#include <isc/formatcheck.h>
#include <isc/rwlock.h>
+#include <isc/statsmulti.h>
#include <isc/tls.h>
#include <dns/catz.h>
dns_zone_setrequeststats(dns_zone_t *zone, isc_stats_t *stats);
void
-dns_zone_setrcvquerystats(dns_zone_t *zone, dns_stats_t *stats);
+dns_zone_setrcvquerystats(dns_zone_t *zone, isc_statsmulti_t *stats);
void
dns_zone_setdnssecsignstats(dns_zone_t *zone, dns_stats_t *stats);
isc_stats_t *
dns_zone_getrequeststats(dns_zone_t *zone);
-dns_stats_t *
+isc_statsmulti_t *
dns_zone_getrcvquerystats(dns_zone_t *zone);
dns_stats_t *
unsigned int maxqueries;
isc_result_t quotaresp[2];
isc_stats_t *stats;
- dns_stats_t *querystats;
+ isc_statsmulti_t *querystats;
/* Additions for serve-stale feature. */
unsigned int retryinterval; /* in milliseconds */
dns_nametree_detach(&res->digests);
if (res->querystats != NULL) {
- dns_stats_detach(&res->querystats);
+ isc_statsmulti_detach(&res->querystats);
}
if (res->stats != NULL) {
isc_stats_detach(&res->stats);
}
void
-dns_resolver_setquerystats(dns_resolver_t *res, dns_stats_t *stats) {
+dns_resolver_setquerystats(dns_resolver_t *res, isc_statsmulti_t *stats) {
REQUIRE(VALID_RESOLVER(res));
REQUIRE(res->querystats == NULL);
- dns_stats_attach(stats, &res->querystats);
+ isc_statsmulti_attach(stats, &res->querystats);
}
void
-dns_resolver_getquerystats(dns_resolver_t *res, dns_stats_t **statsp) {
+dns_resolver_getquerystats(dns_resolver_t *res, isc_statsmulti_t **statsp) {
REQUIRE(VALID_RESOLVER(res));
REQUIRE(statsp != NULL && *statsp == NULL);
if (res->querystats != NULL) {
- dns_stats_attach(res->querystats, statsp);
+ isc_statsmulti_attach(res->querystats, statsp);
}
}
#include <isc/mem.h>
#include <isc/refcount.h>
#include <isc/stats.h>
+#include <isc/statsmulti.h>
#include <isc/util.h>
#include <dns/opcode.h>
}
void
-dns_rdatatypestats_create(isc_mem_t *mctx, dns_stats_t **statsp) {
+dns_rdatatypestats_create(isc_mem_t *mctx, isc_statsmulti_t **statsp) {
REQUIRE(statsp != NULL && *statsp == NULL);
/*
- * Create rdtype statistics for the first 255 RRtypes,
- * plus one additional for other RRtypes.
+ * Create rdtype statistics using statsmulti for better multithreading performance.
+ * We need RDTYPECOUNTER_MAXVAL + 1 counters (0x0602 + 1 = 1539 counters).
*/
- create_stats(mctx, dns_statstype_rdtype, RDTYPECOUNTER_MAXTYPE + 1,
- statsp);
+ isc_statsmulti_create(mctx, statsp, RDTYPECOUNTER_MAXVAL + 1);
}
void
}
void
-dns_rdatatypestats_increment(dns_stats_t *stats, dns_rdatatype_t type) {
+dns_rdatatypestats_increment(isc_statsmulti_t *stats, dns_rdatatype_t type) {
isc_statscounter_t counter;
- REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_rdtype);
+ REQUIRE(stats != NULL);
counter = rdatatype2counter(type);
- isc_stats_increment(stats->counters, counter);
+ isc_statsmulti_increment(stats, counter);
}
static void
}
void
-dns_rdatatypestats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn,
+dns_rdatatypestats_dump(isc_statsmulti_t *stats, dns_rdatatypestats_dumper_t dump_fn,
void *arg0, unsigned int options) {
rdatadumparg_t arg;
- REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_rdtype);
+ REQUIRE(stats != NULL);
arg.fn = dump_fn;
arg.arg = arg0;
- isc_stats_dump(stats->counters, rdatatype_dumpcb, &arg, options);
+ isc_statsmulti_dump(stats, rdatatype_dumpcb, &arg, options);
}
static void
dns_zonestat_level_t statlevel;
bool requeststats_on;
isc_stats_t *requeststats;
- dns_stats_t *rcvquerystats;
+ isc_statsmulti_t *rcvquerystats;
dns_stats_t *dnssecsignstats;
uint32_t notifydelay;
uint32_t notifydefer;
isc_stats_detach(&zone->requeststats);
}
if (zone->rcvquerystats != NULL) {
- dns_stats_detach(&zone->rcvquerystats);
+ isc_statsmulti_detach(&zone->rcvquerystats);
}
if (zone->dnssecsignstats != NULL) {
dns_stats_detach(&zone->dnssecsignstats);
}
void
-dns_zone_setrcvquerystats(dns_zone_t *zone, dns_stats_t *stats) {
+dns_zone_setrcvquerystats(dns_zone_t *zone, isc_statsmulti_t *stats) {
REQUIRE(DNS_ZONE_VALID(zone));
LOCK_ZONE(zone);
if (zone->requeststats_on && stats != NULL) {
if (zone->rcvquerystats == NULL) {
- dns_stats_attach(stats, &zone->rcvquerystats);
+ isc_statsmulti_attach(stats, &zone->rcvquerystats);
zone->requeststats_on = true;
}
}
* Return the received query stats bucket
* see note from dns_zone_getrequeststats()
*/
-dns_stats_t *
+isc_statsmulti_t *
dns_zone_getrcvquerystats(dns_zone_t *zone) {
if (zone->requeststats_on) {
return zone->rcvquerystats;
dns_rdatatype_t qtype;
dns_rdataset_t *rdataset;
isc_stats_t *zonestats;
- dns_stats_t *querystats = NULL;
+ isc_statsmulti_t *querystats = NULL;
ns_stats_increment(client->manager->sctx->nsstats, counter);
rdataset = ISC_LIST_HEAD(client->query.qname->list);
INSIST(rdataset != NULL);
client->query.qtype = qtype = rdataset->type;
- isc_statscounter_t counter = (qtype > 0xff) ? 0 : (isc_statscounter_t)qtype;
- isc_statsmulti_increment(client->manager->sctx->rcvquerystats, counter);
+ dns_rdatatypestats_increment(client->manager->sctx->rcvquerystats,
+ qtype);
log_tat(client);
#include <dns/stats.h>
#include <dns/tkey.h>
-#include <isc/statsmulti.h>
-
#include <ns/query.h>
#include <ns/server.h>
#include <ns/stats.h>
ns_stats_create(mctx, ns_statscounter_max, &sctx->nsstats);
- isc_statsmulti_create(mctx, &sctx->rcvquerystats, 0x0602 + 1);
+ dns_rdatatypestats_create(mctx, &sctx->rcvquerystats);
dns_opcodestats_create(mctx, &sctx->opcodestats);