]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ldpd: use a timer instead of sleeping in LM init
authorMark Stapp <mjs@voltanet.io>
Wed, 22 Apr 2020 15:39:50 +0000 (11:39 -0400)
committerMark Stapp <mjs@voltanet.io>
Thu, 23 Apr 2020 14:17:34 +0000 (10:17 -0400)
Stop sleeping if synchronous label-manager zapi session
has trouble during init: retry using a timer instead. Move
initial label-block request to a point where the LM zapi
session is known to be running. Remove the use of the
daemon 'instance' - we're using the session_id to distinguish
the LM zapi session.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
ldpd/lde.c
ldpd/ldpd.c

index 2223e32f87f6e4b82cd149e023d5f6c7ed924e5b..968fc490fb8cc2e6a12ca9e52cde36f02aa1cf1e 100644 (file)
@@ -56,7 +56,7 @@ static void            lde_map_free(void *);
 static int              lde_address_add(struct lde_nbr *, struct lde_addr *);
 static int              lde_address_del(struct lde_nbr *, struct lde_addr *);
 static void             lde_address_list_free(struct lde_nbr *);
-static void zclient_sync_init(unsigned short instance);
+static void              zclient_sync_init(void);
 static void             lde_label_list_init(void);
 static int              lde_get_label_chunk(void);
 static void             on_get_label_chunk_response(uint32_t start, uint32_t end);
@@ -173,8 +173,7 @@ lde_init(struct ldpd_init *init)
        /* Init synchronous zclient and label list */
        frr_zclient_addr(&zclient_addr, &zclient_addr_len,
                         init->zclient_serv_path);
-       zclient_sync_init(init->instance);
-       lde_label_list_init();
+       zclient_sync_init();
 }
 
 static void
@@ -1746,37 +1745,67 @@ lde_address_list_free(struct lde_nbr *ln)
                free(lde_addr);
 }
 
-static void zclient_sync_init(unsigned short instance)
+/*
+ * Event callback used to retry the label-manager sync zapi session.
+ */
+static int zclient_sync_retry(struct thread *thread)
+{
+       zclient_sync_init();
+
+       return 0;
+}
+
+/*
+ * Initialize and open a synchronous zapi session. This is used by label chunk
+ * management code, which acquires and releases blocks of labels from the
+ * zebra label-manager module.
+ */
+static void zclient_sync_init(void)
 {
        struct zclient_options options = zclient_options_default;
+
        options.synchronous = true;
 
        /* Initialize special zclient for synchronous message exchanges. */
        zclient_sync = zclient_new(master, &options);
        zclient_sync->sock = -1;
        zclient_sync->redist_default = ZEBRA_ROUTE_LDP;
-       zclient_sync->instance = instance;
        zclient_sync->session_id = 1; /* Distinguish from main session */
        zclient_sync->privs = &lde_privs;
 
-       while (zclient_socket_connect(zclient_sync) < 0) {
+       if (zclient_socket_connect(zclient_sync) < 0) {
                log_warnx("Error connecting synchronous zclient!");
-               sleep(1);
+               goto retry;
        }
        /* make socket non-blocking */
        sock_set_nonblock(zclient_sync->sock);
 
        /* Send hello to notify zebra this is a synchronous client */
-       while (zclient_send_hello(zclient_sync) < 0) {
+       if (zclient_send_hello(zclient_sync) < 0) {
                log_warnx("Error sending hello for synchronous zclient!");
-               sleep(1);
+               goto retry;
        }
 
        /* Connect to label manager */
-       while (lm_label_manager_connect(zclient_sync, 0) != 0) {
+       if (lm_label_manager_connect(zclient_sync, 0) != 0) {
                log_warnx("Error connecting to label manager!");
-               sleep(1);
+               goto retry;
        }
+
+       /* Finish label-manager init once the LM session is running */
+       lde_label_list_init();
+
+       return;
+
+retry:
+
+       /* Discard failed zclient object */
+       zclient_stop(zclient_sync);
+       zclient_free(zclient_sync);
+       zclient_sync = NULL;
+
+       /* Retry using a timer */
+       thread_add_timer(master, zclient_sync_retry, NULL, 1, NULL);
 }
 
 static void
index 8e546be93ed297a15ec5472617541f06ca7f1720..0e05f3c6a6dae1017dc9013db1dfeb4ae8b0f7c6 100644 (file)
@@ -239,9 +239,6 @@ main(int argc, char *argv[])
                "      --ctl_socket   Override ctl socket path\n"
                "  -n, --instance     Instance id\n");
 
-       /* set default instance (to differentiate ldpd socket from lde one */
-       init.instance = 1;
-
        while (1) {
                int opt;