mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-04 16:45:24 +00:00
rewrote much of the statistics counter code
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: server.h,v 1.46 2000/11/30 19:38:03 gson Exp $ */
|
||||
/* $Id: server.h,v 1.47 2000/12/01 23:49:52 gson Exp $ */
|
||||
|
||||
#ifndef NAMED_SERVER_H
|
||||
#define NAMED_SERVER_H 1
|
||||
@@ -69,9 +69,8 @@ struct ns_server {
|
||||
isc_boolean_t flushonshutdown;
|
||||
isc_boolean_t log_queries; /* For BIND 8 compatibility */
|
||||
|
||||
char * statsfile;
|
||||
FILE * statsfp;
|
||||
isc_uint64_t globalcount[DNS_ZONE_COUNTSIZE];
|
||||
char * statsfile; /* Statistics file name */
|
||||
isc_uint64_t * querystats; /* Query statistics counters */
|
||||
};
|
||||
|
||||
#define NS_SERVER_MAGIC 0x53564552 /* SVER */
|
||||
@@ -125,11 +124,10 @@ ns_server_togglequerylog(ns_server_t *server);
|
||||
* Toggle logging of queries, as in BIND 8.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Dump the current statistics to the statstics file.
|
||||
*/
|
||||
isc_result_t
|
||||
ns_server_dumpstats(ns_server_t *server);
|
||||
|
||||
void
|
||||
ns_server_querycount(dns_zone_t *zone, isc_boolean_t is_zone,
|
||||
dns_zonecount_t counter);
|
||||
|
||||
#endif /* NAMED_SERVER_H */
|
||||
|
@@ -15,7 +15,7 @@
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: query.c,v 1.156 2000/11/30 00:25:09 gson Exp $ */
|
||||
/* $Id: query.c,v 1.157 2000/12/01 23:49:47 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <dns/rdatatype.h>
|
||||
#include <dns/resolver.h>
|
||||
#include <dns/result.h>
|
||||
#include <dns/stats.h>
|
||||
#include <dns/tkey.h>
|
||||
#include <dns/view.h>
|
||||
#include <dns/zone.h>
|
||||
@@ -94,6 +95,22 @@ query_adda6rrset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset,
|
||||
static void
|
||||
query_find(ns_client_t *client, dns_fetchevent_t *event);
|
||||
|
||||
/*
|
||||
* Increment query statistics counters.
|
||||
*/
|
||||
static void
|
||||
count_query(dns_zone_t *zone, isc_boolean_t is_zone, dns_statscounter_t counter)
|
||||
{
|
||||
REQUIRE(counter < dns_stats_ncounters());
|
||||
|
||||
ns_g_server->querystats[counter]++;
|
||||
|
||||
if (is_zone && zone != NULL) {
|
||||
isc_uint64_t *zonestats = dns_zone_getstatscounters(zone);
|
||||
if (zonestats != NULL)
|
||||
zonestats[counter]++;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
query_maybeputqname(ns_client_t *client) {
|
||||
@@ -778,8 +795,7 @@ query_simplefind(void *arg, dns_name_t *name, dns_rdatatype_t type,
|
||||
dns_rdataset_isassociated(sigrdataset))
|
||||
dns_rdataset_disassociate(sigrdataset);
|
||||
if (is_zone) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_delegate);
|
||||
count_query(zone, is_zone, dns_statscounter_referral);
|
||||
if (USECACHE(client)) {
|
||||
/*
|
||||
* Either the answer is in the cache, or we
|
||||
@@ -848,7 +864,7 @@ query_simplefind(void *arg, dns_name_t *name, dns_rdatatype_t type,
|
||||
* query counter.
|
||||
*/
|
||||
if (result == ISC_R_SUCCESS)
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_success);
|
||||
count_query(zone, is_zone, dns_statscounter_success);
|
||||
|
||||
cleanup:
|
||||
if (dns_rdataset_isassociated(&zrdataset)) {
|
||||
@@ -2341,23 +2357,21 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
*/
|
||||
dbuf = query_getnamebuf(client);
|
||||
if (dbuf == NULL) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
fname = query_newname(client, dbuf, &b);
|
||||
if (fname == NULL) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
tname = dns_fixedname_name(&event->foundname);
|
||||
result = dns_name_concatenate(tname, NULL, fname, NULL);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2380,8 +2394,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
result = query_getdb(client, client->query.qname, 0, &zone, &db,
|
||||
&version, &is_zone);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
ns_server_querycount(NULL, ISC_FALSE,
|
||||
dns_zonecount_failure);
|
||||
count_query(NULL, ISC_FALSE, dns_statscounter_failure);
|
||||
if (result == DNS_R_REFUSED)
|
||||
QUERY_ERROR(DNS_R_REFUSED);
|
||||
else
|
||||
@@ -2423,7 +2436,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
type = qtype;
|
||||
else {
|
||||
CTRACE("find_query: REFUSED: qcount != 1");
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_REFUSED);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2434,7 +2447,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
result = query_checktype(qtype);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
CTRACE("find_query: non supported query type");
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(result);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2452,22 +2465,21 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
*/
|
||||
dbuf = query_getnamebuf(client);
|
||||
if (dbuf == NULL) {
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
fname = query_newname(client, dbuf, &b);
|
||||
rdataset = query_newrdataset(client);
|
||||
if (fname == NULL || rdataset == NULL) {
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
if (WANTDNSSEC(client)) {
|
||||
sigrdataset = query_newrdataset(client);
|
||||
if (sigrdataset == NULL) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2524,8 +2536,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
result = dns_name_concatenate(client->query.qname,
|
||||
NULL, fname, NULL);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2543,8 +2554,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
CTRACE("query_find: resume");
|
||||
switch (result) {
|
||||
case ISC_R_SUCCESS:
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_success);
|
||||
count_query(zone, is_zone, dns_statscounter_success);
|
||||
/*
|
||||
* This case is handled in the main line below.
|
||||
*/
|
||||
@@ -2576,7 +2586,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
*/
|
||||
INSIST(!is_zone);
|
||||
INSIST(client->view->hints != NULL);
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_delegate);
|
||||
count_query(zone, is_zone, dns_statscounter_referral);
|
||||
if (db != NULL)
|
||||
dns_db_detach(&db);
|
||||
dns_db_attach(client->view->hints, &db);
|
||||
@@ -2588,8 +2598,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
* We can't even find the hints for the root
|
||||
* nameservers!
|
||||
*/
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2695,8 +2704,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
/*
|
||||
* Recurse!
|
||||
*/
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_recurse);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_recursion);
|
||||
if (type == dns_rdatatype_key)
|
||||
result = query_recurse(client, qtype,
|
||||
NULL, NULL);
|
||||
@@ -2707,16 +2716,16 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
client->query.attributes |=
|
||||
NS_QUERYATTR_RECURSING;
|
||||
else {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* This is the best answer.
|
||||
*/
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_delegate);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_referral);
|
||||
client->query.gluedb = zdb;
|
||||
client->query.attributes |=
|
||||
NS_QUERYATTR_CACHEGLUEOK;
|
||||
@@ -2735,7 +2744,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
goto cleanup;
|
||||
case DNS_R_NXRRSET:
|
||||
INSIST(is_zone);
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_nxrrset);
|
||||
count_query(zone, is_zone, dns_statscounter_nxrrset);
|
||||
if (dns_rdataset_isassociated(rdataset)) {
|
||||
/*
|
||||
* If we've got a NXT record, we need to save the
|
||||
@@ -2762,8 +2771,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
*/
|
||||
result = query_addsoa(client, db, ISC_FALSE);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_failure);
|
||||
QUERY_ERROR(result);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2782,7 +2791,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
goto cleanup;
|
||||
case DNS_R_NXDOMAIN:
|
||||
INSIST(is_zone);
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_nxdomain);
|
||||
count_query(zone, is_zone, dns_statscounter_nxdomain);
|
||||
if (client->query.restarts > 0) {
|
||||
/*
|
||||
* We hit a dead end following a CNAME or DNAME.
|
||||
@@ -2821,8 +2830,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
else
|
||||
result = query_addsoa(client, db, ISC_FALSE);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_failure);
|
||||
QUERY_ERROR(result);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -2845,11 +2854,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
goto cleanup;
|
||||
case DNS_R_NCACHENXDOMAIN:
|
||||
INSIST(!is_zone);
|
||||
ns_server_querycount(NULL, is_zone, dns_zonecount_nxdomain);
|
||||
count_query(NULL, is_zone, dns_statscounter_nxdomain);
|
||||
goto ncachenxrrset;
|
||||
case DNS_R_NCACHENXRRSET:
|
||||
INSIST(!is_zone);
|
||||
ns_server_querycount(NULL, is_zone, dns_zonecount_nxrrset);
|
||||
count_query(NULL, is_zone, dns_statscounter_nxrrset);
|
||||
ncachenxrrset:
|
||||
authoritative = ISC_FALSE;
|
||||
/*
|
||||
@@ -3019,7 +3028,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
/*
|
||||
* Something has gone wrong.
|
||||
*/
|
||||
ns_server_querycount(zone, is_zone, dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -3033,8 +3042,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
rdsiter = NULL;
|
||||
result = dns_db_allrdatasets(db, node, version, 0, &rdsiter);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -3108,15 +3117,14 @@ query_find(ns_client_t *client, dns_fetchevent_t *event) {
|
||||
/*
|
||||
* Something went wrong.
|
||||
*/
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone,
|
||||
dns_statscounter_failure);
|
||||
result = DNS_R_SERVFAIL;
|
||||
}
|
||||
}
|
||||
dns_rdatasetiter_destroy(&rdsiter);
|
||||
if (result != ISC_R_NOMORE) {
|
||||
ns_server_querycount(zone, is_zone,
|
||||
dns_zonecount_failure);
|
||||
count_query(zone, is_zone, dns_statscounter_failure);
|
||||
QUERY_ERROR(DNS_R_SERVFAIL);
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -3403,3 +3411,4 @@ ns_query_start(ns_client_t *client) {
|
||||
ns_client_attach(client, &qclient);
|
||||
query_find(qclient, NULL);
|
||||
}
|
||||
|
||||
|
@@ -15,7 +15,7 @@
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: server.c,v 1.266 2000/12/01 08:58:10 marka Exp $ */
|
||||
/* $Id: server.c,v 1.267 2000/12/01 23:49:49 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include <dns/rdatastruct.h>
|
||||
#include <dns/resolver.h>
|
||||
#include <dns/rootns.h>
|
||||
#include <dns/stats.h>
|
||||
#include <dns/tkey.h>
|
||||
#include <dns/view.h>
|
||||
#include <dns/zone.h>
|
||||
@@ -1310,57 +1311,19 @@ heartbeat_timer_tick(isc_task_t *task, isc_event_t *event) {
|
||||
RWUNLOCK(&server->conflock, isc_rwlocktype_read);
|
||||
}
|
||||
|
||||
static void
|
||||
ns_server_freestatsfile(ns_server_t *serv) {
|
||||
if (serv->statsfile != NULL)
|
||||
isc_mem_free(serv->mctx, serv->statsfile);
|
||||
serv->statsfile = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
ns_server_setstatsfile(const char *name, ns_server_t *serv) {
|
||||
int len;
|
||||
|
||||
ns_server_freestatsfile(serv);
|
||||
len = strlen(name);
|
||||
serv->statsfile = isc_mem_allocate(serv->mctx, len + 1);
|
||||
if (serv->statsfile == NULL)
|
||||
fatal("allocate memory for server stats", ISC_R_NOMEMORY);
|
||||
strcpy(serv->statsfile, name);
|
||||
}
|
||||
|
||||
|
||||
static isc_result_t
|
||||
ns_server_openstatsfile(ns_server_t *serv) {
|
||||
isc_result_t result;
|
||||
const char *defname = "named.stats";
|
||||
union { char *nc;
|
||||
const char *cc; } deconst;
|
||||
setstatsfile(ns_server_t *server, const char *name) {
|
||||
char *p;
|
||||
|
||||
if (serv->statsfile == NULL)
|
||||
deconst.cc = defname;
|
||||
else
|
||||
deconst.nc = serv->statsfile;
|
||||
result = isc_stdio_open(deconst.nc, "a", &serv->statsfp);
|
||||
return (result);
|
||||
}
|
||||
REQUIRE(name != NULL);
|
||||
|
||||
static isc_result_t
|
||||
ns_server_closestatsfile(ns_server_t *serv) {
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
|
||||
if (serv->statsfp != NULL)
|
||||
result = isc_stdio_close(serv->statsfp);
|
||||
serv->statsfp = NULL;
|
||||
return (result);
|
||||
}
|
||||
|
||||
static void
|
||||
ns_server_zeroglobal(ns_server_t *serv) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < DNS_ZONE_COUNTSIZE; i++)
|
||||
serv->globalcount[i] = 0;
|
||||
p = isc_mem_strdup(server->mctx, name);
|
||||
if (p == NULL)
|
||||
return (ISC_R_NOMEMORY);
|
||||
if (server->statsfile != NULL)
|
||||
isc_mem_free(server->mctx, server->statsfile);
|
||||
server->statsfile = p;
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
#define SETLIMIT(cfgvar, resource, description) \
|
||||
@@ -1778,8 +1741,12 @@ load_configuration(const char *filename, ns_server_t *server,
|
||||
else
|
||||
ns_os_writepidfile(ns_g_defaultpidfile);
|
||||
|
||||
if (dns_c_ctx_getstatsfilename(cctx, &statsfilename) != ISC_R_NOTFOUND)
|
||||
ns_server_setstatsfile(statsfilename, server);
|
||||
result = dns_c_ctx_getstatsfilename(cctx, &statsfilename);
|
||||
if (result == ISC_R_NOTFOUND) {
|
||||
CHECKM(setstatsfile(server, "named.stats"), "strdup");
|
||||
} else {
|
||||
CHECKM(setstatsfile(server, statsfilename), "strdup");
|
||||
}
|
||||
|
||||
cleanup:
|
||||
ns_aclconfctx_destroy(&aclconfctx);
|
||||
@@ -2024,9 +1991,12 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
|
||||
CHECKFATAL(dns_loadmgr_create(ns_g_mctx, &server->loadmgr),
|
||||
"dns_loadmgr_create");
|
||||
|
||||
server->statsfile = NULL;
|
||||
server->statsfp = NULL;
|
||||
ns_server_zeroglobal(server);
|
||||
server->statsfile = isc_mem_strdup(server->mctx, "named.stats");
|
||||
CHECKFATAL(server->statsfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS,
|
||||
"isc_mem_strdup");
|
||||
server->querystats = NULL;
|
||||
CHECKFATAL(dns_stats_alloccounters(ns_g_mctx, &server->querystats),
|
||||
"dns_stats_alloccounters");
|
||||
|
||||
server->flushonshutdown = ISC_FALSE;
|
||||
server->log_queries = ISC_FALSE;
|
||||
@@ -2040,7 +2010,8 @@ ns_server_destroy(ns_server_t **serverp) {
|
||||
ns_server_t *server = *serverp;
|
||||
REQUIRE(NS_SERVER_VALID(server));
|
||||
|
||||
ns_server_freestatsfile(server);
|
||||
dns_stats_freecounters(server->mctx, &server->querystats);
|
||||
isc_mem_free(server->mctx, server->statsfile);
|
||||
|
||||
dns_loadmgr_detach(&server->loadmgr);
|
||||
dns_zonemgr_detach(&server->zonemgr);
|
||||
@@ -2313,70 +2284,64 @@ ns_listenelt_fromconfig(dns_c_lstnon_t *celt, dns_c_ctx_t *cctx,
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
void
|
||||
ns_server_querycount(dns_zone_t *zone, isc_boolean_t is_zone,
|
||||
dns_zonecount_t counter)
|
||||
{
|
||||
REQUIRE(counter < DNS_ZONE_COUNTSIZE);
|
||||
|
||||
ns_g_server->globalcount[counter]++;
|
||||
if (is_zone && zone != NULL && !dns_zone_hascounts(zone))
|
||||
dns_zone_count(zone, counter);
|
||||
}
|
||||
|
||||
/*
|
||||
* Dump the current statistics to a file
|
||||
*
|
||||
* XXXMWS this should really be done asynchronously
|
||||
*/
|
||||
isc_result_t
|
||||
ns_server_dumpstats(ns_server_t *server) {
|
||||
isc_result_t result;
|
||||
dns_zone_t *zone = NULL, *next = NULL;
|
||||
char zonestore[DNS_NAME_FORMATSIZE];
|
||||
dns_view_t *zoneview = NULL;
|
||||
char *viewname;
|
||||
dns_zone_t *zone;
|
||||
isc_stdtime_t now;
|
||||
FILE *fp;
|
||||
FILE *fp = NULL;
|
||||
int i;
|
||||
int numbercounters;
|
||||
int ncounters;
|
||||
|
||||
isc_stdtime_get(&now);
|
||||
result = ns_server_openstatsfile(server);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
||||
NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
|
||||
"could not open statistics dump file: %s",
|
||||
isc_result_totext(result));
|
||||
|
||||
CHECKM(isc_stdio_open(server->statsfile, "a", &fp),
|
||||
"could not open statistics dump file");
|
||||
|
||||
ncounters = dns_stats_ncounters();
|
||||
fprintf(fp, "+++ Statistics Dump +++ (%lu)\n", (unsigned long)now);
|
||||
|
||||
for (i = 0; i < ncounters; i++)
|
||||
fprintf(fp, "%s %" ISC_PRINT_QUADFORMAT "d\n",
|
||||
dns_statscounter_names[i],
|
||||
server->querystats[i]);
|
||||
|
||||
dns_zonemgr_lockconf(server->zonemgr, isc_rwlocktype_read);
|
||||
for (result = dns_zone_first(server->zonemgr, &zone);
|
||||
result == ISC_R_SUCCESS;
|
||||
result = dns_zone_next(zone, &zone))
|
||||
{
|
||||
isc_uint64_t *zonestats = dns_zone_getstatscounters(zone);
|
||||
if (zonestats != NULL) {
|
||||
char zonename[DNS_NAME_FORMATSIZE];
|
||||
dns_view_t *view;
|
||||
char *viewname;
|
||||
|
||||
dns_name_format(dns_zone_getorigin(zone),
|
||||
zonename, sizeof(zonename));
|
||||
view = dns_zone_getview(zone);
|
||||
viewname = view->name;
|
||||
for (i = 0; i < ncounters; i++) {
|
||||
fprintf(fp, "%s %" ISC_PRINT_QUADFORMAT
|
||||
"d %s",
|
||||
dns_statscounter_names[i],
|
||||
zonestats[i],
|
||||
zonename);
|
||||
if (strcmp(viewname, "_default") != 0)
|
||||
fprintf(fp, " %s", viewname);
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (result == ISC_R_NOMORE)
|
||||
result = ISC_R_SUCCESS;
|
||||
CHECK(result);
|
||||
|
||||
fprintf(fp, "--- Statistics Dump --- (%lu)\n", (unsigned long)now);
|
||||
dns_zonemgr_unlockconf(server->zonemgr, isc_rwlocktype_read);
|
||||
|
||||
cleanup:
|
||||
if (fp != NULL)
|
||||
(void)isc_stdio_close(fp);
|
||||
return (result);
|
||||
}
|
||||
numbercounters = dns_zone_numbercounters();
|
||||
fp = server->statsfp;
|
||||
fprintf(fp, "+++ Statistics Dump +++ (%ld)\n",
|
||||
(long)now);
|
||||
for (i = 0; i < numbercounters; i++)
|
||||
fprintf(fp, "%s %ld\n", dns_zonecount_names[i],
|
||||
(long)server->globalcount[i]);
|
||||
dns_zonemgr_lockconf(server->zonemgr, isc_rwlocktype_read);
|
||||
dns_zone_first(server->zonemgr, &zone);
|
||||
while (zone != NULL) {
|
||||
dns_name_format(dns_zone_getorigin(zone),
|
||||
zonestore, sizeof(zonestore));
|
||||
zoneview = dns_zone_getview(zone);
|
||||
viewname = zoneview->name;
|
||||
if (dns_zone_hascounts(zone)) {
|
||||
for (i = 0; i < numbercounters; i++)
|
||||
fprintf(fp, "%s %ld %s:%s\n",
|
||||
dns_zonecount_names[i],
|
||||
(long)dns_zone_getcounts(zone, i),
|
||||
viewname, zonestore);
|
||||
}
|
||||
dns_zone_next(zone, &next);
|
||||
zone = next;
|
||||
next = NULL;
|
||||
}
|
||||
fprintf(fp, "--- Statistics Dump --- (%ld)\n", (long)now);
|
||||
dns_zonemgr_unlockconf(server->zonemgr, isc_rwlocktype_read);
|
||||
ns_server_closestatsfile(server);
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
@@ -15,7 +15,7 @@
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: zoneconf.c,v 1.75 2000/12/01 18:22:14 gson Exp $ */
|
||||
/* $Id: zoneconf.c,v 1.76 2000/12/01 23:49:50 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
@@ -258,10 +258,7 @@ ns_zone_configure(dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
||||
result = dns_c_ctx_getstatistics(cctx, &statistics);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
statistics = ISC_FALSE;
|
||||
if (statistics)
|
||||
dns_zone_startcounting(zone);
|
||||
else
|
||||
dns_zone_stopcounting(zone);
|
||||
dns_zone_setstatistics(zone, statistics);
|
||||
|
||||
#ifndef NOMINUM_PUBLIC
|
||||
if (czone->ztype != dns_c_zone_stub) {
|
||||
|
@@ -13,7 +13,7 @@
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
# $Id: Makefile.in,v 1.113 2000/11/17 19:04:45 gson Exp $
|
||||
# $Id: Makefile.in,v 1.114 2000/12/01 23:49:53 gson Exp $
|
||||
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
@@ -97,7 +97,7 @@ OBJS = a6.@O@ acl.@O@ adb.@O@ byaddr.@O@ \
|
||||
rbt.@O@ rbtdb.@O@ rbtdb64.@O@ rdata.@O@ rdatalist.@O@ \
|
||||
rdataset.@O@ rdatasetiter.@O@ rdataslab.@O@ request.@O@ \
|
||||
resolver.@O@ result.@O@ rootns.@O@ sdb.@O@ ssu.@O@ \
|
||||
tcpmsg.@O@ time.@O@ timer.@O@ tkey.@O@ \
|
||||
stats.@O@ tcpmsg.@O@ time.@O@ timer.@O@ tkey.@O@ \
|
||||
tsig.@O@ ttl.@O@ validator.@O@ \
|
||||
version.@O@ view.@O@ xfrin.@O@ zone.@O@ zt.@O@ \
|
||||
${DSTOBJS} @DST_OPENSSL_OBJS@ ${CONFOBJS}
|
||||
@@ -112,7 +112,7 @@ SRCS = a6.c acl.c adb.c byaddr.c \
|
||||
rbt.c rbtdb.c rbtdb64.c rdata.c rdatalist.c \
|
||||
rdataset.c rdatasetiter.c rdataslab.c request.c \
|
||||
resolver.c result.c rootns.c sdb.c ssu.c \
|
||||
tcpmsg.c time.c timer.c tkey.c \
|
||||
stats.c tcpmsg.c time.c timer.c tkey.c \
|
||||
tsig.c ttl.c validator.c \
|
||||
version.c view.c xfrin.c zone.c zt.c
|
||||
|
||||
|
63
lib/dns/include/dns/stats.h
Normal file
63
lib/dns/include/dns/stats.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2000 Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
|
||||
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: stats.h,v 1.1 2000/12/01 23:49:58 gson Exp $ */
|
||||
|
||||
#ifndef DNS_STATS_H
|
||||
#define DNS_STATS_H 1
|
||||
|
||||
#include <dns/types.h>
|
||||
|
||||
/*
|
||||
* Query statistics counter types.
|
||||
*/
|
||||
typedef enum {
|
||||
dns_statscounter_success = 0, /* Successful lookup */
|
||||
dns_statscounter_referral = 1, /* Referral result */
|
||||
dns_statscounter_nxrrset = 2, /* NXRRSET result */
|
||||
dns_statscounter_nxdomain = 3, /* NXDOMAIN result */
|
||||
dns_statscounter_recursion = 4, /* Recursion was used */
|
||||
dns_statscounter_failure = 5 /* Some other failure */
|
||||
} dns_statscounter_t;
|
||||
|
||||
#define DNS_STATS_NCOUNTERS 6
|
||||
|
||||
extern const char *dns_statscounter_names[];
|
||||
|
||||
isc_result_t
|
||||
dns_stats_alloccounters(isc_mem_t *mctx, isc_uint64_t **ctrp);
|
||||
/*
|
||||
* Allocate an array of query statistics counters from the memory
|
||||
* context 'mctx'.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_stats_freecounters(isc_mem_t *mctx, isc_uint64_t **ctrp);
|
||||
/*
|
||||
* Free an array of query statistics counters allocated from the memory
|
||||
* context 'mctx'.
|
||||
*/
|
||||
|
||||
unsigned int
|
||||
dns_stats_ncounters(void);
|
||||
/*
|
||||
* Return the number of query statistics counters.
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
#endif /* DNS_STATS_H */
|
@@ -15,7 +15,7 @@
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: zone.h,v 1.92 2000/11/25 02:43:56 marka Exp $ */
|
||||
/* $Id: zone.h,v 1.93 2000/12/01 23:49:57 gson Exp $ */
|
||||
|
||||
#ifndef DNS_ZONE_H
|
||||
#define DNS_ZONE_H 1
|
||||
@@ -38,18 +38,7 @@ typedef enum {
|
||||
dns_zone_stub
|
||||
} dns_zonetype_t;
|
||||
|
||||
typedef enum {
|
||||
dns_zonecount_success = 0, /* Successful lookups */
|
||||
dns_zonecount_delegate = 1, /* Delegation result */
|
||||
dns_zonecount_nxrrset = 2, /* NXRRSET result */
|
||||
dns_zonecount_nxdomain = 3, /* NXDOMAIN result */
|
||||
dns_zonecount_recurse = 4, /* Recursion was used */
|
||||
dns_zonecount_failure = 5 /* Some other failure */
|
||||
} dns_zonecount_t;
|
||||
|
||||
extern const char *dns_zonecount_names[];
|
||||
|
||||
#define DNS_ZONE_COUNTSIZE 6
|
||||
#define DNS_STATS_NCOUNTERS 6
|
||||
|
||||
#define DNS_ZONEOPT_SERVERS 0x00000001U /* perform server checks */
|
||||
#define DNS_ZONEOPT_PARENTS 0x00000002U /* perform parent checks */
|
||||
@@ -1298,83 +1287,25 @@ dns_zone_isforced(dns_zone_t *zone);
|
||||
* 'zone' to be a valid zone.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_zone_count(dns_zone_t *zone, dns_zonecount_t counter);
|
||||
/*
|
||||
* Increment a zone statistics counter.
|
||||
*
|
||||
* Requires:
|
||||
* zone be a valid zone.
|
||||
* MAY be safely called even if zone doesn't have counters
|
||||
* counter be a valid counter ID
|
||||
*/
|
||||
|
||||
isc_uint64_t
|
||||
dns_zone_getcounts(dns_zone_t *zone, dns_zonecount_t counter);
|
||||
/*
|
||||
* Return the value of a zone statistics counter.
|
||||
*
|
||||
* Requires:
|
||||
* zone be a valid zone.
|
||||
* MAY be safely called even if zone doesn't have statistics counters
|
||||
* counter be a valid counter ID
|
||||
*
|
||||
* Returns:
|
||||
* count if the zone has counters
|
||||
* 0 if the zone does not have counters
|
||||
*/
|
||||
|
||||
void
|
||||
dns_zone_resetcounts(dns_zone_t *zone);
|
||||
/*
|
||||
* Reset the statistics counters of 'zone'.
|
||||
*
|
||||
* Requires:
|
||||
* zone be a valid zone.
|
||||
* MAY be safely called even if zone doesn't have statistics counters
|
||||
*/
|
||||
|
||||
int
|
||||
dns_zone_numbercounters(void);
|
||||
/*
|
||||
* Return the number of statistics counters per zone.
|
||||
*
|
||||
* Use this instead of DNS_ZONE_COUNTSIZE if possible, to ensure
|
||||
* binary compatibility if the number of counters is changed in
|
||||
* future library releases.
|
||||
*/
|
||||
|
||||
isc_boolean_t
|
||||
dns_zone_hascounts(dns_zone_t *zone);
|
||||
/*
|
||||
* Return ISC_TRUE iff the zone has statistics counters.
|
||||
*
|
||||
* Requires:
|
||||
* zone be a valid zone.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_zone_startcounting(dns_zone_t *zone);
|
||||
dns_zone_setstatistics(dns_zone_t *zone, isc_boolean_t on);
|
||||
/*
|
||||
* Start maintaining statistics counters for 'zone'.
|
||||
* Make the zone keep or not keep an array of statistics
|
||||
* counter.
|
||||
*
|
||||
* Requires:
|
||||
* zone be a valid zone.
|
||||
* MAY be safely called even if zone already has statistics counters
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_NOMEMORY -- memory allocation failed.
|
||||
* ISC_R_SUCCESS -- Success
|
||||
*/
|
||||
|
||||
void
|
||||
dns_zone_stopcounting(dns_zone_t *zone);
|
||||
isc_uint64_t *
|
||||
dns_zone_getstatscounters(dns_zone_t *zone);
|
||||
/*
|
||||
* Stop maintaining statistics counters for 'zone'.
|
||||
*
|
||||
* Requires:
|
||||
* zone be a valid zone.
|
||||
* MAY be safely called even if zone doesn't have statistics counters
|
||||
*
|
||||
* Returns:
|
||||
* A pointer to the zone's array of statistics counters,
|
||||
* or NULL if it has none.
|
||||
*/
|
||||
|
||||
void
|
||||
|
57
lib/dns/stats.c
Normal file
57
lib/dns/stats.c
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2000 Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
|
||||
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: stats.c,v 1.1 2000/12/01 23:49:54 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <isc/mem.h>
|
||||
|
||||
#include <dns/stats.h>
|
||||
|
||||
const char *dns_statscounter_names[DNS_STATS_NCOUNTERS] = {
|
||||
"success",
|
||||
"referral",
|
||||
"nxrrset",
|
||||
"nxdomain",
|
||||
"recursion",
|
||||
"failure"
|
||||
};
|
||||
|
||||
isc_result_t
|
||||
dns_stats_alloccounters(isc_mem_t *mctx, isc_uint64_t **ctrp) {
|
||||
int i;
|
||||
isc_uint64_t *p =
|
||||
isc_mem_get(mctx, DNS_STATS_NCOUNTERS * sizeof(isc_uint64_t));
|
||||
if (p == NULL)
|
||||
return (ISC_R_NOMEMORY);
|
||||
for (i = 0; i < DNS_STATS_NCOUNTERS; i++)
|
||||
p[i] = 0;
|
||||
*ctrp = p;
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
void
|
||||
dns_stats_freecounters(isc_mem_t *mctx, isc_uint64_t **ctrp) {
|
||||
isc_mem_put(mctx, *ctrp, DNS_STATS_NCOUNTERS * sizeof(isc_uint64_t));
|
||||
*ctrp = NULL;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
dns_stats_ncounters(void) {
|
||||
return (DNS_STATS_NCOUNTERS);
|
||||
}
|
113
lib/dns/zone.c
113
lib/dns/zone.c
@@ -15,7 +15,7 @@
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: zone.c,v 1.264 2000/12/01 03:20:00 marka Exp $ */
|
||||
/* $Id: zone.c,v 1.265 2000/12/01 23:49:55 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#include <dns/request.h>
|
||||
#include <dns/resolver.h>
|
||||
#include <dns/result.h>
|
||||
#include <dns/stats.h>
|
||||
#include <dns/ssu.h>
|
||||
#include <dns/tsig.h>
|
||||
#include <dns/xfrin.h>
|
||||
@@ -192,7 +193,7 @@ struct dns_zone {
|
||||
ISC_LINK(dns_zone_t) statelink;
|
||||
dns_zonelist_t *statelist;
|
||||
/*
|
||||
* Optional per-zone statistics counters
|
||||
* Optional per-zone statistics counters (NULL if not present).
|
||||
*/
|
||||
isc_uint64_t *counters;
|
||||
};
|
||||
@@ -330,17 +331,6 @@ struct dns_io {
|
||||
isc_event_t *event;
|
||||
};
|
||||
|
||||
/*
|
||||
* Names of the zone counters
|
||||
*/
|
||||
const char *dns_zonecount_names[] = {
|
||||
"SUCCESS",
|
||||
"DELEGATION",
|
||||
"NXRRSET",
|
||||
"NXDOMAIN",
|
||||
"RECURSION",
|
||||
"SERVFAIL" };
|
||||
|
||||
static isc_result_t zone_settimer(dns_zone_t *, isc_stdtime_t);
|
||||
static void cancel_refresh(dns_zone_t *);
|
||||
|
||||
@@ -577,9 +567,7 @@ zone_free(dns_zone_t *zone) {
|
||||
isc_mem_free(zone->mctx, zone->journal);
|
||||
zone->journal = NULL;
|
||||
if (zone->counters != NULL)
|
||||
isc_mem_put(zone->mctx, zone->counters,
|
||||
DNS_ZONE_COUNTSIZE * sizeof(isc_uint64_t));
|
||||
zone->counters = NULL;
|
||||
dns_stats_freecounters(zone->mctx, &zone->counters);
|
||||
if (zone->db != NULL)
|
||||
dns_db_detach(&zone->db);
|
||||
zone_freedbargs(zone);
|
||||
@@ -5788,96 +5776,27 @@ dns_zone_isforced(dns_zone_t *zone) {
|
||||
return (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FORCELOAD));
|
||||
}
|
||||
|
||||
void
|
||||
dns_zone_count(dns_zone_t *zone, dns_zonecount_t counter) {
|
||||
REQUIRE(counter < DNS_ZONE_COUNTSIZE);
|
||||
|
||||
LOCK(&zone->lock);
|
||||
if (zone->counters != NULL)
|
||||
zone->counters[counter]++;
|
||||
UNLOCK(&zone->lock);
|
||||
}
|
||||
|
||||
isc_uint64_t
|
||||
dns_zone_getcounts(dns_zone_t *zone, dns_zonecount_t counter) {
|
||||
isc_uint64_t count = 0;
|
||||
REQUIRE(DNS_ZONE_VALID(zone));
|
||||
REQUIRE(counter < DNS_ZONE_COUNTSIZE);
|
||||
|
||||
LOCK(&zone->lock);
|
||||
if (zone->counters != NULL)
|
||||
count = zone->counters[counter];
|
||||
UNLOCK(&zone->lock);
|
||||
return (count);
|
||||
}
|
||||
|
||||
int
|
||||
dns_zone_numbercounters(void) {
|
||||
return (DNS_ZONE_COUNTSIZE);
|
||||
}
|
||||
|
||||
void
|
||||
dns_zone_resetcounts(dns_zone_t *zone) {
|
||||
int i;
|
||||
|
||||
REQUIRE(DNS_ZONE_VALID(zone));
|
||||
|
||||
LOCK(&zone->lock);
|
||||
if (zone->counters != NULL)
|
||||
for (i = 0; i < DNS_ZONE_COUNTSIZE; i++)
|
||||
zone->counters[i] = 0;
|
||||
UNLOCK(&zone->lock);
|
||||
}
|
||||
|
||||
isc_boolean_t
|
||||
dns_zone_hascounts(dns_zone_t *zone) {
|
||||
isc_boolean_t hascount = ISC_FALSE;
|
||||
REQUIRE(DNS_ZONE_VALID(zone));
|
||||
|
||||
LOCK(&zone->lock);
|
||||
if (zone->counters != NULL)
|
||||
hascount = ISC_TRUE;
|
||||
UNLOCK(&zone->lock);
|
||||
return (hascount);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
dns_zone_startcounting(dns_zone_t *zone) {
|
||||
dns_zone_setstatistics(dns_zone_t *zone, isc_boolean_t on) {
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
int i;
|
||||
|
||||
REQUIRE(DNS_ZONE_VALID(zone));
|
||||
|
||||
LOCK(&zone->lock);
|
||||
if (on) {
|
||||
if (zone->counters != NULL)
|
||||
goto done;
|
||||
|
||||
zone->counters = isc_mem_get(zone->mctx, sizeof(isc_uint64_t) *
|
||||
DNS_ZONE_COUNTSIZE);
|
||||
if (zone->counters == NULL)
|
||||
result = ISC_R_NOMEMORY;
|
||||
else
|
||||
for (i = 0; i < DNS_ZONE_COUNTSIZE; i++)
|
||||
zone->counters[i] = 0;
|
||||
done:
|
||||
UNLOCK(&zone->lock);
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
void
|
||||
dns_zone_stopcounting(dns_zone_t *zone) {
|
||||
REQUIRE(DNS_ZONE_VALID(zone));
|
||||
|
||||
LOCK(&zone->lock);
|
||||
result = dns_stats_alloccounters(zone->mctx, &zone->counters);
|
||||
} else {
|
||||
if (zone->counters == NULL)
|
||||
goto done;
|
||||
|
||||
isc_mem_put(zone->mctx, zone->counters,
|
||||
sizeof(isc_uint64_t) * DNS_ZONE_COUNTSIZE);
|
||||
zone->counters = NULL;
|
||||
dns_stats_freecounters(zone->mctx, &zone->counters);
|
||||
}
|
||||
done:
|
||||
UNLOCK(&zone->lock);
|
||||
return;
|
||||
return (result);
|
||||
}
|
||||
|
||||
isc_uint64_t *
|
||||
dns_zone_getstatscounters(dns_zone_t *zone) {
|
||||
return (zone->counters);
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -975,6 +975,7 @@
|
||||
./lib/dns/include/dns/secalg.h C 1999,2000
|
||||
./lib/dns/include/dns/secproto.h C 1999,2000
|
||||
./lib/dns/include/dns/ssu.h C 2000
|
||||
./lib/dns/include/dns/stats.h C 2000
|
||||
./lib/dns/include/dns/tcpmsg.h C 1999,2000
|
||||
./lib/dns/include/dns/time.h C 1999,2000
|
||||
./lib/dns/include/dns/timer.h C 2000
|
||||
@@ -1137,6 +1138,7 @@
|
||||
./lib/dns/sec/openssl/include/openssl/Makefile.in MAKE 1998,1999,2000
|
||||
./lib/dns/sec/rename.h C 2000
|
||||
./lib/dns/ssu.c C 2000
|
||||
./lib/dns/stats.c C 2000
|
||||
./lib/dns/tcpmsg.c C 1999,2000
|
||||
./lib/dns/time.c C 1998,1999,2000
|
||||
./lib/dns/timer.c C 2000
|
||||
|
Reference in New Issue
Block a user