summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorF. Aragon <paco@voltanet.io>2019-04-05 15:26:14 +0200
committerF. Aragon <paco@voltanet.io>2019-04-09 15:04:12 +0200
commit6920fd019038bb31bda11b6acd0c855f9547df71 (patch)
treec4a07a321b68fb4466dd4e314e84739aca8a4342
parentfe09938b2b38e091bef84ca8798f55d5544105f6 (diff)
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 <paco@voltanet.io>
-rw-r--r--zebra/label_manager.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/zebra/label_manager.c b/zebra/label_manager.c
index 65c85f7dee..1dba0a49f7 100644
--- a/zebra/label_manager.c
+++ b/zebra/label_manager.c
@@ -155,11 +155,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;
}