]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Disable periodic interface re-scans on modern platforms
authorArtem Boldariev <artem@boldariev.com>
Fri, 8 Apr 2022 12:32:10 +0000 (15:32 +0300)
committerArtem Boldariev <artem@boldariev.com>
Tue, 24 May 2022 12:26:35 +0000 (15:26 +0300)
This commit disables periodic interface re-scans timer on Linux where
a kernel-based dynamic interface mechanisms make it a thing of the
past in most cases.

bin/named/server.c
lib/ns/include/ns/interfacemgr.h
lib/ns/interfacemgr.c

index 7d6840f4ca2d3b09f0ccdb2d1e1442cc9754cf10..49ec7cb4f60d96638c42d0db8a4118136a23f60d 100644 (file)
@@ -8981,13 +8981,18 @@ load_configuration(const char *filename, named_server_t *server,
        result = named_config_get(maps, "interface-interval", &obj);
        INSIST(result == ISC_R_SUCCESS);
        interface_interval = cfg_obj_asduration(obj);
-       if (interface_interval == 0) {
-               CHECK(isc_timer_reset(server->interface_timer,
-                                     isc_timertype_inactive, NULL, true));
-       } else if (server->interface_interval != interface_interval) {
-               isc_interval_set(&interval, interface_interval, 0);
-               CHECK(isc_timer_reset(server->interface_timer,
-                                     isc_timertype_ticker, &interval, false));
+
+       if (server->interface_timer != NULL) {
+               if (interface_interval == 0) {
+                       CHECK(isc_timer_reset(server->interface_timer,
+                                             isc_timertype_inactive, NULL,
+                                             true));
+               } else if (server->interface_interval != interface_interval) {
+                       isc_interval_set(&interval, interface_interval, 0);
+                       CHECK(isc_timer_reset(server->interface_timer,
+                                             isc_timertype_ticker, &interval,
+                                             false));
+               }
        }
        server->interface_interval = interface_interval;
 
@@ -9824,8 +9829,23 @@ run_server(isc_task_t *task, isc_event_t *event) {
                                          &server->interfacemgr),
                   "creating interface manager");
 
-       isc_timer_create(named_g_timermgr, server->task, interface_timer_tick,
-                        server, &server->interface_timer);
+       /*
+        * In some cases the user might expect a certain behaviour from
+        * the rescan timer, let's try to deduce that from the
+        * configuration options.
+        */
+       if ((ns_interfacemgr_dynamic_updates_are_reliable() &&
+            server->interface_auto) ||
+           (server->interface_interval == 0))
+       {
+               isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
+                             NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
+                             "Disabling periodic interface re-scans timer");
+       } else {
+               isc_timer_create(named_g_timermgr, server->task,
+                                interface_timer_tick, server,
+                                &server->interface_timer);
+       }
 
        isc_timer_create(named_g_timermgr, server->task, heartbeat_timer_tick,
                         server, &server->heartbeat_timer);
@@ -9926,7 +9946,9 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
                isc_mem_put(server->mctx, nsc, sizeof(*nsc));
        }
 
-       isc_timer_destroy(&server->interface_timer);
+       if (server->interface_timer != NULL) {
+               isc_timer_destroy(&server->interface_timer);
+       }
        isc_timer_destroy(&server->heartbeat_timer);
        isc_timer_destroy(&server->pps_timer);
        isc_timer_destroy(&server->tat_timer);
index 8bd96101037d157493ee64ed112bb7dfcaefebbf..dac165da651f7bc289670c5776c7814a131bc907 100644 (file)
@@ -190,3 +190,11 @@ ns_interfacemgr_getclientmgr(ns_interfacemgr_t *mgr);
  * Returns the client manager for the current worker thread.
  * (This cannot be run from outside a network manager thread.)
  */
+
+bool
+ns_interfacemgr_dynamic_updates_are_reliable(void);
+/*%<
+ * Returns 'true' if periodic interface re-scans timer should be
+ * disabled. That is the case on the platforms where kernel-based
+ * mechanisms for tracking networking interface states is reliable enough.
+ */
index 7b5093e13bbd443343c68d37355493ff1d82ee66..90268e94e433a921bcb94a0be1315f7b02c8abac 100644 (file)
@@ -1379,3 +1379,17 @@ ns_interfacemgr_getclientmgr(ns_interfacemgr_t *mgr) {
 
        return (mgr->clientmgrs[tid]);
 }
+
+bool
+ns_interfacemgr_dynamic_updates_are_reliable(void) {
+#if defined(LINUX_NETLINK_AVAILABLE)
+       /*
+        * Let's disable periodic interface rescans on Linux, as there a
+        * reliable kernel-based mechanism for tracking interface state
+        * changes is available.
+        */
+       return (true);
+#else
+       return (false);
+#endif /* LINUX_NETLINK_AVAILABLE */
+}