]> 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 09:36:43 +0000 (09:36 +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.

(cherry picked from commit bab20802b3a8e44b45cbac24b556107680ed71d4)

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

index 36cd47c22f12d567a4c5fb56f3ac4c6666e3c382..27abec73586cd08ccbcedeca94229bccfa722f77 100644 (file)
@@ -255,6 +255,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 18bac081263f1d931e841d7153fc0906121aa595..6010820b8073743a94b14f63747b1abc7db464ea 100644 (file)
@@ -54,6 +54,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 72597cd1aeacbda545a33361d6d0925a556ef01b..21720131d0b81c1facb26e4879976f8957392528 100644 (file)
@@ -156,6 +156,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 036799831bbc1359b9cbedb58040f25a3a60914c..f5f449decc6e9ece7f208c1098dd58670e3ff805 100644 (file)
@@ -11134,6 +11134,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.
  */