From: Aram Sargsyan Date: Tue, 25 Mar 2025 10:44:20 +0000 (+0000) Subject: Implement rndc reset-stats counter-name X-Git-Tag: v9.21.7~17^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bab20802b3a8e44b45cbac24b556107680ed71d4;p=thirdparty%2Fbind9.git Implement rndc reset-stats counter-name This new rndc option allows to reset some statistics counters during runtime. At this moment only the high-water type counters are supported as such an ability to reset them after the initial peaks during the server's "warm-up" phase can be useful for some operators. --- diff --git a/bin/named/control.c b/bin/named/control.c index 4f93d228051..10a4e00fc40 100644 --- a/bin/named/control.c +++ b/bin/named/control.c @@ -259,6 +259,9 @@ named_control_docommand(isccc_sexpr_t *message, bool readonly, result = named_server_refreshcommand(named_g_server, lex, text); } else if (command_compare(command, NAMED_COMMAND_RELOAD)) { result = named_server_reloadcommand(named_g_server, lex, text); + } else if (command_compare(command, NAMED_COMMAND_RESETSTATS)) { + result = named_server_resetstatscommand(named_g_server, lex, + text); } else if (command_compare(command, NAMED_COMMAND_RESPONSELOG)) { result = named_server_setortoggle(named_g_server, "response logging", diff --git a/bin/named/include/named/control.h b/bin/named/include/named/control.h index 79f62e6c10c..0718059bf64 100644 --- a/bin/named/include/named/control.h +++ b/bin/named/include/named/control.h @@ -55,6 +55,7 @@ #define NAMED_COMMAND_RECURSING "recursing" #define NAMED_COMMAND_REFRESH "refresh" #define NAMED_COMMAND_RELOAD "reload" +#define NAMED_COMMAND_RESETSTATS "reset-stats" #define NAMED_COMMAND_RESPONSELOG "responselog" #define NAMED_COMMAND_RETRANSFER "retransfer" #define NAMED_COMMAND_SCAN "scan" diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 394b55ad4df..a3aff6df945 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -153,6 +153,13 @@ named_server_reloadcommand(named_server_t *server, isc_lex_t *lex, * Act on a "reload" command from the command channel. */ +isc_result_t +named_server_resetstatscommand(named_server_t *server, isc_lex_t *lex, + isc_buffer_t **text); +/*%< + * Act on a "reset-stats" command from the command channel. + */ + isc_result_t named_server_reconfigcommand(named_server_t *server); /*%< diff --git a/bin/named/server.c b/bin/named/server.c index f57a7276541..bc80f14d698 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -10487,6 +10487,54 @@ named_server_reloadcommand(named_server_t *server, isc_lex_t *lex, return result; } +/* + * Act on a "reset-stats" command from the command channel. + */ +isc_result_t +named_server_resetstatscommand(named_server_t *server, isc_lex_t *lex, + isc_buffer_t **text) { + const char *arg = NULL; + bool recursive_high_water = false; + bool tcp_high_water = false; + + REQUIRE(text != NULL); + + /* Skip the command name. */ + (void)next_token(lex, text); + + arg = next_token(lex, text); + if (arg == NULL) { + (void)putstr(text, "reset-stats: argument expected"); + (void)putnull(text); + return ISC_R_UNEXPECTEDEND; + } + while (arg != NULL) { + if (strcmp(arg, "recursive-high-water") == 0) { + recursive_high_water = true; + } else if (strcmp(arg, "tcp-high-water") == 0) { + tcp_high_water = true; + } else { + (void)putstr(text, "reset-stats: " + "unrecognized argument: "); + (void)putstr(text, arg); + (void)putnull(text); + return ISC_R_FAILURE; + } + arg = next_token(lex, text); + } + + if (recursive_high_water) { + isc_stats_set(ns_stats_get(server->sctx->nsstats), 0, + ns_statscounter_recurshighwater); + } + if (tcp_high_water) { + isc_stats_set(ns_stats_get(server->sctx->nsstats), 0, + ns_statscounter_tcphighwater); + } + + return ISC_R_SUCCESS; +} + /* * Act on a "reconfig" command from the command channel. */