From 9e74dda819bf5922176fbbc7f3462c844099be13 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 30 Sep 2024 12:41:06 -0400 Subject: zebra: Delay some processing until after startup is finished Currently zebra starts the graceful restart timer as well as allows connections from clients before all data is read in from the kernel as well as the possiblity of allowing client connections before this happens as well. Let's move the graceful restart timer start till after this is done as well as not allowing client connections till then as well. Signed-off-by: Donald Sharp --- zebra/main.c | 66 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 29 deletions(-) (limited to 'zebra/main.c') diff --git a/zebra/main.c b/zebra/main.c index 4d9b7c3bbe..138a955bc3 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -54,6 +54,8 @@ #define ZEBRA_PTM_SUPPORT +char *zserv_path; + /* process id. */ pid_t pid; @@ -314,17 +316,46 @@ FRR_DAEMON_INFO(zebra, ZEBRA, ); /* clang-format on */ +void zebra_main_router_started(void) +{ + /* + * Clean up zebra-originated routes. The requests will be sent to OS + * immediately, so originating PID in notifications from kernel + * will be equal to the current getpid(). To know about such routes, + * we have to have route_read() called before. + * If FRR is gracefully restarting, we either wait for clients + * (e.g., BGP) to signal GR is complete else we wait for specified + * duration. + */ + zrouter.startup_time = monotime(NULL); + zrouter.rib_sweep_time = 0; + zrouter.graceful_restart = zebra_di.graceful_restart; + if (!zrouter.graceful_restart) + event_add_timer(zrouter.master, rib_sweep_route, NULL, 0, NULL); + else { + int gr_cleanup_time; + + gr_cleanup_time = zebra_di.gr_cleanup_time ? zebra_di.gr_cleanup_time + : ZEBRA_GR_DEFAULT_RIB_SWEEP_TIME; + event_add_timer(zrouter.master, rib_sweep_route, NULL, gr_cleanup_time, + &zrouter.t_rib_sweep); + } + + zserv_start(zserv_path); +} + /* Main startup routine. */ int main(int argc, char **argv) { // int batch_mode = 0; - char *zserv_path = NULL; struct sockaddr_storage dummy; socklen_t dummylen; bool asic_offload = false; bool v6_with_v4_nexthop = false; bool notify_on_ack = true; + zserv_path = NULL; + vrf_configure_backend(VRF_BACKEND_VRF_LITE); frr_preinit(&zebra_di, argc, argv); @@ -475,31 +506,11 @@ int main(int argc, char **argv) */ frr_config_fork(); - /* After we have successfully acquired the pidfile, we can be sure - * about being the only copy of zebra process, which is submitting - * changes to the FIB. - * Clean up zebra-originated routes. The requests will be sent to OS - * immediately, so originating PID in notifications from kernel - * will be equal to the current getpid(). To know about such routes, - * we have to have route_read() called before. - * If FRR is gracefully restarting, we either wait for clients - * (e.g., BGP) to signal GR is complete else we wait for specified - * duration. - */ - zrouter.startup_time = monotime(NULL); - zrouter.rib_sweep_time = 0; - zrouter.graceful_restart = zebra_di.graceful_restart; - if (!zrouter.graceful_restart) - event_add_timer(zrouter.master, rib_sweep_route, NULL, 0, NULL); - else { - int gr_cleanup_time; - - gr_cleanup_time = zebra_di.gr_cleanup_time - ? zebra_di.gr_cleanup_time - : ZEBRA_GR_DEFAULT_RIB_SWEEP_TIME; - event_add_timer(zrouter.master, rib_sweep_route, NULL, - gr_cleanup_time, &zrouter.t_rib_sweep); - } + /* + * After we have successfully acquired the pidfile, we can be sure + * about being the only copy of zebra process, which is submitting + * changes to the FIB. + */ /* Needed for BSD routing socket. */ pid = getpid(); @@ -510,9 +521,6 @@ int main(int argc, char **argv) /* Start the ted module, before zserv */ zebra_opaque_start(); - /* Start Zebra API server */ - zserv_start(zserv_path); - /* Init label manager */ label_manager_init(); -- cgit v1.2.3