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.
This commit is contained in:
Aram Sargsyan 2025-03-25 10:44:20 +00:00 committed by Arаm Sаrgsyаn
parent 1d14612bb9
commit bab20802b3
4 changed files with 59 additions and 0 deletions

View file

@ -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",

View file

@ -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"

View file

@ -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);
/*%<

View file

@ -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.
*/