diff options
| author | Olivier Dugeon <olivier.dugeon@orange.com> | 2020-04-24 09:34:27 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-24 09:34:27 +0200 | 
| commit | 814f6fc80a42d90d3a2d2baca2041abac60cc421 (patch) | |
| tree | 530ebf397c02deaea4f642fb8f2c55e7207fa730 /ldpd | |
| parent | 7a54a2caf76e4810b01ac3cb2f245245ec230571 (diff) | |
| parent | 9d694b0b01c056378e0e9e9f358dea28b44f11e8 (diff) | |
Merge pull request #6274 from mjstapp/fix_lde_blocking_sleep
ldpd: use a timer instead of sleeping in LM init
Diffstat (limited to 'ldpd')
| -rw-r--r-- | ldpd/lde.c | 51 | ||||
| -rw-r--r-- | ldpd/ldpd.c | 3 | 
2 files changed, 40 insertions, 14 deletions
diff --git a/ldpd/lde.c b/ldpd/lde.c index 2223e32f87..968fc490fb 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 diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index 8e546be93e..0e05f3c6a6 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -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;  | 
