summaryrefslogtreecommitdiffstats
path: root/ldpd/lde.c
diff options
context:
space:
mode:
authorMark Stapp <mjs@voltanet.io>2020-04-22 17:39:50 +0200
committerMark Stapp <mjs@voltanet.io>2020-04-23 16:17:34 +0200
commit9d694b0b01c056378e0e9e9f358dea28b44f11e8 (patch)
tree157856706b8101013841d440b31440fa65d2e841 /ldpd/lde.c
parentMerge pull request #6269 from donaldsharp/coverity_likes_coverity (diff)
downloadfrr-9d694b0b01c056378e0e9e9f358dea28b44f11e8.tar.xz
frr-9d694b0b01c056378e0e9e9f358dea28b44f11e8.zip
ldpd: use a timer instead of sleeping in LM init
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>
Diffstat (limited to 'ldpd/lde.c')
-rw-r--r--ldpd/lde.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/ldpd/lde.c b/ldpd/lde.c
index 2223e32f8..968fc490f 100644
--- a/ldpd/lde.c
+++ b/ldpd/lde.c
@@ -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