diff options
| author | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2022-10-20 23:46:47 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-20 23:46:47 -0500 | 
| commit | cd5649848dbeb52d615cf31a75b035c3003c9d2a (patch) | |
| tree | a6a2d3f6214bfa30589a55472821947b7e116126 /watchfrr | |
| parent | 4f40a902c026277621017b076df57abfb4605e3c (diff) | |
| parent | 2ab760f0560172a1197c38fbf364eb104c690325 (diff) | |
Merge pull request #12140 from opensourcerouting/fix/watchfrr_dont_givup
watchfrr: Delay restart_kill if still reading configuration
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();  | 
