]> git.proxmox.com Git - mirror_frr.git/commitdiff
watchfrr: Delay restart_kill if still reading configuration
authorDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 10 Oct 2022 14:14:38 +0000 (17:14 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 10 Oct 2022 14:18:30 +0000 (17:18 +0300)
This mostly happens only for large configuration files, where the default
restart-time (-T, --restart-time / 20s) is not enough.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
watchfrr/watchfrr.c

index 423f25faa2ccb8652681935b9aab0a16fe67c2cb..4a3575ae75051b6719e5f65bf3b25dfbe2b3e822 100644 (file)
@@ -112,6 +112,7 @@ static struct global_state {
        long period;
        long timeout;
        long restart_timeout;
+       bool reading_configuration;
        long min_restart_interval;
        long max_restart_interval;
        long operational_timeout;
@@ -365,6 +366,16 @@ static void restart_kill(struct thread *t_kill)
        struct timeval delay;
 
        time_elapsed(&delay, &restart->time);
+
+       if (gs.reading_configuration) {
+               zlog_err(
+                       "%s %s child process appears to still be reading configuration, delaying for another %lu time",
+                       restart->what, restart->name, gs.restart_timeout);
+               thread_add_timer(master, restart_kill, restart,
+                                gs.restart_timeout, &restart->t_kill);
+               return;
+       }
+
        zlog_warn(
                "%s %s child process %d still running after %ld seconds, sending signal %d",
                restart->what, restart->name, (int)restart->pid,
@@ -1059,6 +1070,8 @@ void watchfrr_status(struct vty *vty)
        vty_out(vty, " Min Restart Interval: %ld\n", gs.min_restart_interval);
        vty_out(vty, " Max Restart Interval: %ld\n", gs.max_restart_interval);
        vty_out(vty, " Restart Timeout: %ld\n", gs.restart_timeout);
+       vty_out(vty, " Reading Configuration: %s\n",
+               gs.reading_configuration ? "yes" : "no");
        if (gs.restart.pid)
                vty_out(vty, "    global restart running, pid %ld\n",
                        (long)gs.restart.pid);
@@ -1264,6 +1277,16 @@ static void netns_setup(const char *nsname)
 }
 #endif
 
+static void watchfrr_start_config(void)
+{
+       gs.reading_configuration = true;
+}
+
+static void watchfrr_end_config(void)
+{
+       gs.reading_configuration = false;
+}
+
 static void watchfrr_init(int argc, char **argv)
 {
        const char *special = "zebra";
@@ -1558,6 +1581,7 @@ int main(int argc, char **argv)
        master = frr_init();
        watchfrr_error_init();
        watchfrr_init(argc, argv);
+       cmd_init_config_callbacks(watchfrr_start_config, watchfrr_end_config);
        watchfrr_vty_init();
 
        frr_config_fork();