]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Retry connecting to synchronouse label manager if not ready
authorDonatas Abraitis <donatas@opensourcerouting.org>
Sat, 17 Jun 2023 06:21:55 +0000 (09:21 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 20 Jun 2023 17:50:38 +0000 (20:50 +0300)
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_labelpool.c
bgpd/bgp_zebra.c
bgpd/bgpd.c
bgpd/bgpd.h

index 16314597c7c8f1652f11aafc75a8feac9ecfc48f..8ebb3339507a1a5542c2cab9c00f65e7f342f3ba 100644 (file)
@@ -575,7 +575,7 @@ finishedrequest:
 }
 
 event_add_timer(bm->master, bgp_sync_label_manager, NULL, 1,
-               &bm->t_bgp_label_manager);
+               &bm->t_bgp_sync_label_manager);
 }
 
 void bgp_lp_event_chunk(uint32_t first, uint32_t last)
@@ -700,7 +700,7 @@ void bgp_lp_event_zebra_up(void)
        }
 
        event_add_timer(bm->master, bgp_sync_label_manager, NULL, 1,
-                       &bm->t_bgp_label_manager);
+                       &bm->t_bgp_sync_label_manager);
 }
 
 DEFUN(show_bgp_labelpool_summary, show_bgp_labelpool_summary_cmd,
index 8808f1fcaf85df771f1f489a2557d6d4838249fd..96aebb36291e70821159f3175a12e156cd8041fa 100644 (file)
@@ -56,6 +56,7 @@
 /* All information about zebra. */
 struct zclient *zclient = NULL;
 struct zclient *zclient_sync = NULL;
+static bool bgp_zebra_label_manager_connect(void);
 
 /* hook to indicate vrf status change for SNMP */
 DEFINE_HOOK(bgp_vrf_status_changed, (struct bgp *bgp, struct interface *ifp),
@@ -3413,13 +3414,23 @@ void bgp_if_init(void)
        hook_register_prio(if_del, 0, bgp_if_delete_hook);
 }
 
-static void bgp_zebra_label_manager_connect(void)
+static void bgp_start_label_manager(struct event *start)
+{
+       bgp_zebra_label_manager_connect();
+}
+
+static bool bgp_zebra_label_manager_ready(void)
+{
+       return (zclient_sync->sock > 0);
+}
+
+static bool bgp_zebra_label_manager_connect(void)
 {
        /* Connect to label manager. */
        if (zclient_socket_connect(zclient_sync) < 0) {
                zlog_warn("%s: failed connecting synchronous zclient!",
                          __func__);
-               return;
+               return false;
        }
        /* make socket non-blocking */
        set_nonblocking(zclient_sync->sock);
@@ -3430,7 +3441,7 @@ static void bgp_zebra_label_manager_connect(void)
                          __func__);
                close(zclient_sync->sock);
                zclient_sync->sock = -1;
-               return;
+               return false;
        }
 
        /* Connect to label manager */
@@ -3440,11 +3451,13 @@ static void bgp_zebra_label_manager_connect(void)
                        close(zclient_sync->sock);
                        zclient_sync->sock = -1;
                }
-               return;
+               return false;
        }
 
        /* tell label pool that zebra is connected */
        bgp_lp_event_zebra_up();
+
+       return true;
 }
 
 void bgp_zebra_init(struct event_loop *master, unsigned short instance)
@@ -3472,7 +3485,9 @@ void bgp_zebra_init(struct event_loop *master, unsigned short instance)
        zclient_sync->session_id = 1;
        zclient_sync->privs = &bgpd_privs;
 
-       bgp_zebra_label_manager_connect();
+       if (!bgp_zebra_label_manager_ready())
+               event_add_timer(master, bgp_start_label_manager, NULL, 1,
+                               &bm->t_bgp_start_label_manager);
 }
 
 void bgp_zebra_destroy(void)
index 9edf0bf9f2d8fe06f62c319eab831b4ebb049ae6..619925ab2ccf089117e86b1ea497626b801ee278 100644 (file)
@@ -8062,7 +8062,8 @@ void bgp_master_init(struct event_loop *master, const int buffer_size,
        bm->tcp_dscp = IPTOS_PREC_INTERNETCONTROL;
        bm->inq_limit = BM_DEFAULT_Q_LIMIT;
        bm->outq_limit = BM_DEFAULT_Q_LIMIT;
-       bm->t_bgp_label_manager = NULL;
+       bm->t_bgp_sync_label_manager = NULL;
+       bm->t_bgp_start_label_manager = NULL;
 
        bgp_mac_init();
        /* init the rd id space.
@@ -8309,7 +8310,8 @@ void bgp_terminate(void)
                list_delete(&bm->listen_sockets);
 
        EVENT_OFF(bm->t_rmap_update);
-       EVENT_OFF(bm->t_bgp_label_manager);
+       EVENT_OFF(bm->t_bgp_sync_label_manager);
+       EVENT_OFF(bm->t_bgp_start_label_manager);
 
        bgp_mac_finish();
 }
index 0b16f8094ed1a9881641220ea19493a095243927..50cd9d17f775e5f2d8be4a27f0bacd3b3086df2e 100644 (file)
@@ -165,7 +165,8 @@ struct bgp_master {
        uint32_t inq_limit;
        uint32_t outq_limit;
 
-       struct event *t_bgp_label_manager;
+       struct event *t_bgp_sync_label_manager;
+       struct event *t_bgp_start_label_manager;
 
        QOBJ_FIELDS;
 };