diff options
| author | F. Aragon <paco@voltanet.io> | 2019-04-05 15:26:14 +0200 |
|---|---|---|
| committer | F. Aragon <paco@voltanet.io> | 2019-04-09 15:04:12 +0200 |
| commit | 6920fd019038bb31bda11b6acd0c855f9547df71 (patch) | |
| tree | c4a07a321b68fb4466dd4e314e84739aca8a4342 | |
| parent | fe09938b2b38e091bef84ca8798f55d5544105f6 (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.c | 8 |
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; } |
