]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Implement rndc reset-stats counter-name
authorAram Sargsyan <aram@isc.org>
Tue, 25 Mar 2025 10:44:20 +0000 (10:44 +0000)
committerArаm Sаrgsyаn <aram@isc.org>
Thu, 27 Mar 2025 08:51:12 +0000 (08:51 +0000)
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.

bin/named/control.c
bin/named/include/named/control.h
bin/named/include/named/server.h
bin/named/server.c

index 4f93d228051aca93400c0b296910676aa898d0e4..10a4e00fc40a3737fdfa5df283983e970dda9507 100644 (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",
index 79f62e6c10c20f5527d4d1a6768c1ad9075f3904..0718059bf64172afd82cba5c4871beedc0fe6846 100644 (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"
index 394b55ad4df3dc98d8af0e765db4a8260acada4b..a3aff6df945ae44913a1ab7f35b964a5f292ad22 100644 (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);
 /*%<
index f57a7276541de81687d32fc0bfd76c6687ccab6e..bc80f14d6986559d4aa7ca89b0ba50b940c524c6 100644 (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.
  */