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]
diff --git a/src/peers.c b/src/peers.c
index 7580742..155f334 100644
--- a/src/peers.c
+++ b/src/peers.c
@@ -1474,6 +1474,7 @@
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 @@
/* 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;