diff options
| author | Donatas Abraitis <donatas@opensourcerouting.org> | 2022-10-10 17:14:38 +0300 |
|---|---|---|
| committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2022-10-10 17:18:30 +0300 |
| commit | 2ab760f0560172a1197c38fbf364eb104c690325 (patch) | |
| tree | 5f4b9071e0a0a7f3b440329a7f193f49d14e0f1d /watchfrr | |
| parent | eb531283675924c3bfb5034e54d234679208a2b4 (diff) | |
watchfrr: Delay restart_kill if still reading configuration
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>
Diffstat (limited to 'watchfrr')
| -rw-r--r-- | watchfrr/watchfrr.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/watchfrr/watchfrr.c b/watchfrr/watchfrr.c index 423f25faa2..4a3575ae75 100644 --- a/watchfrr/watchfrr.c +++ b/watchfrr/watchfrr.c @@ -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(); |
