Skip to content

Commit

Permalink
watchfrr: Delay restart_kill if still reading configuration
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ton31337 committed Oct 10, 2022
1 parent eb53128 commit 2ab760f
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions watchfrr/watchfrr.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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";
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 2ab760f

Please sign in to comment.