From: Aram Sargsyan Date: Fri, 10 Nov 2023 11:10:32 +0000 (+0000) Subject: Expose the 'first refresh' zone flag in rndc status X-Git-Tag: v9.19.22~60^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2ec041b719f5ea6484e18807aa38dc4c91584e39;p=thirdparty%2Fbind9.git Expose the 'first refresh' zone flag in rndc status Expose the newly added 'first refresh' flag in the information provided by the 'rndc staus' command, by showing the number of zones, which are not yet fully ready, and their first refresh is pending or is in-progress. --- diff --git a/bin/named/server.c b/bin/named/server.c index d2da295f06e..6f9463f3446 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -12063,8 +12063,8 @@ named_server_flushnode(named_server_t *server, isc_lex_t *lex, bool tree) { isc_result_t named_server_status(named_server_t *server, isc_buffer_t **text) { isc_result_t result; - unsigned int zonecount, xferrunning, xferdeferred, soaqueries; - unsigned int automatic; + unsigned int zonecount, xferrunning, xferdeferred, xferfirstrefresh; + unsigned int soaqueries, automatic; const char *ob = "", *cb = "", *alt = ""; char boottime[ISC_FORMATHTTPTIMESTAMP_SIZE]; char configtime[ISC_FORMATHTTPTIMESTAMP_SIZE]; @@ -12087,6 +12087,8 @@ named_server_status(named_server_t *server, isc_buffer_t **text) { DNS_ZONESTATE_XFERRUNNING); xferdeferred = dns_zonemgr_getcount(server->zonemgr, DNS_ZONESTATE_XFERDEFERRED); + xferfirstrefresh = dns_zonemgr_getcount(server->zonemgr, + DNS_ZONESTATE_XFERFIRSTREFRESH); soaqueries = dns_zonemgr_getcount(server->zonemgr, DNS_ZONESTATE_SOAQUERY); automatic = dns_zonemgr_getcount(server->zonemgr, @@ -12143,6 +12145,10 @@ named_server_status(named_server_t *server, isc_buffer_t **text) { snprintf(line, sizeof(line), "xfers deferred: %u\n", xferdeferred); CHECK(putstr(text, line)); + snprintf(line, sizeof(line), "xfers first refresh: %u\n", + xferfirstrefresh); + CHECK(putstr(text, line)); + snprintf(line, sizeof(line), "soa queries in progress: %u\n", soaqueries); CHECK(putstr(text, line)); diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index 35017c78c29..909795717d6 100644 --- a/lib/dns/include/dns/zone.h +++ b/lib/dns/include/dns/zone.h @@ -116,6 +116,18 @@ typedef enum { DNS_ZONEKEY___MAX = UINT64_MAX, /* trick to make the ENUM 64-bit wide */ } dns_zonekey_t; +/* + * Zone states + */ +typedef enum { + DNS_ZONESTATE_XFERRUNNING = 1, + DNS_ZONESTATE_XFERDEFERRED, + DNS_ZONESTATE_XFERFIRSTREFRESH, + DNS_ZONESTATE_SOAQUERY, + DNS_ZONESTATE_ANY, + DNS_ZONESTATE_AUTOMATIC, +} dns_zonestate_t; + #ifndef DNS_ZONE_MINREFRESH #define DNS_ZONE_MINREFRESH 300 /*%< 5 minutes */ #endif /* ifndef DNS_ZONE_MINREFRESH */ @@ -137,12 +149,6 @@ typedef enum { * exponential backoff */ #endif /* ifndef DNS_ZONE_DEFAULTRETRY */ -#define DNS_ZONESTATE_XFERRUNNING 1 -#define DNS_ZONESTATE_XFERDEFERRED 2 -#define DNS_ZONESTATE_SOAQUERY 3 -#define DNS_ZONESTATE_ANY 4 -#define DNS_ZONESTATE_AUTOMATIC 5 - ISC_LANG_BEGINDECLS /*** @@ -1870,13 +1876,13 @@ dns_zonemgr_getserialqueryrate(dns_zonemgr_t *zmgr); */ unsigned int -dns_zonemgr_getcount(dns_zonemgr_t *zmgr, int state); +dns_zonemgr_getcount(dns_zonemgr_t *zmgr, dns_zonestate_t state); /*%< * Returns the number of zones in the specified state. * * Requires: *\li 'zmgr' to be a valid zone manager. - *\li 'state' to be a valid DNS_ZONESTATE_ constant. + *\li 'state' to be a valid DNS_ZONESTATE_ enum. */ isc_result_t diff --git a/lib/dns/zone.c b/lib/dns/zone.c index bf45a4d1f82..9a9411dc6d3 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -19671,7 +19671,7 @@ dns_zone_getkeystores(dns_zone_t *zone) { } unsigned int -dns_zonemgr_getcount(dns_zonemgr_t *zmgr, int state) { +dns_zonemgr_getcount(dns_zonemgr_t *zmgr, dns_zonestate_t state) { dns_zone_t *zone; unsigned int count = 0; @@ -19693,6 +19693,15 @@ dns_zonemgr_getcount(dns_zonemgr_t *zmgr, int state) { count++; } break; + case DNS_ZONESTATE_XFERFIRSTREFRESH: + for (zone = ISC_LIST_HEAD(zmgr->zones); zone != NULL; + zone = ISC_LIST_NEXT(zone, link)) + { + if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FIRSTREFRESH)) { + count++; + } + } + break; case DNS_ZONESTATE_SOAQUERY: for (zone = ISC_LIST_HEAD(zmgr->zones); zone != NULL; zone = ISC_LIST_NEXT(zone, link))