diff --git a/bin/named/control.c b/bin/named/control.c index 4f93d22805..10a4e00fc4 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 79f62e6c10..0718059bf6 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 394b55ad4d..a3aff6df94 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 f57a727654..bc80f14d69 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. */