From 088c9b73cab9a1958dceaa1ce6f8a76541f8d344 Mon Sep 17 00:00:00 2001 From: Emeric Brun Date: Fri, 1 Dec 2017 11:37:36 +0100 Subject: [PATCH] BUG/MAJOR: thread/peers: fix deadlock on peers sync. Table lock was not released on an error path (if there is no enough room to write table switch message). [wt: needs to be backported to 1.8] --- src/peers.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/peers.c b/src/peers.c index 7580742f7..155f3342a 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1474,6 +1474,7 @@ incomplete: msglen = peer_prepare_switchmsg(st, trash.str, trash.size); if (!msglen) { + HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); /* internal error: message does not fit in trash */ appctx->st0 = PEER_SESS_ST_END; goto switchstate; @@ -1482,6 +1483,7 @@ incomplete: /* message to buffer */ repl = ci_putblk(si_ic(si), trash.str, msglen); if (repl <= 0) { + HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); /* no more write possible */ if (repl == -1) { goto full;