From 98e9ab8b31804593a140fd147450d455bd26ed4a Mon Sep 17 00:00:00 2001 From: "F. Aragon" Date: Fri, 5 Apr 2019 15:26:14 +0200 Subject: [PATCH] zebra: label manager race condition fix This fix covers the case where two or more events are processed but only one becoming effective. E.g. when mixing a synchronous label request from a LDP deamon and an asynchronous request from a BGP daemon it could happen to the BGP having the label chunk, but the LDP stuck waiting for the response. Given e.g. ldpd <--------> (sync label request) Zebra (label proxy) <--> Zebra (shared label manager) bgpd <--------> (async label request) Sequence: LDP label request -----> Zebra (label proxy FW) ----> Zebra (LM) BGP label request -----> Zebra (label proxy FW) ----> Zebra (LM) <---- Zebra (LM) RP LDP <---- Zebra (LM) RP BGP Signed-off-by: F. Aragon --- zebra/label_manager.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/zebra/label_manager.c b/zebra/label_manager.c index 1b17845e41..16d45836e0 100644 --- a/zebra/label_manager.c +++ b/zebra/label_manager.c @@ -156,11 +156,9 @@ static int lm_zclient_read(struct thread *t) /* read response and send it back */ ret = relay_response_back(); - /* on error, schedule another read */ - if (ret == -1) - if (!zclient->t_read) - thread_add_read(zclient->master, lm_zclient_read, NULL, - zclient->sock, &zclient->t_read); + /* re-arm read */ + thread_add_read(zclient->master, lm_zclient_read, NULL, + zclient->sock, &zclient->t_read); return ret; } -- 2.39.5