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]
This commit is contained in:
Emeric Brun 2017-12-01 11:37:36 +01:00 committed by Willy Tarreau
parent 0fed0b0a38
commit 088c9b73ca

View File

@ -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;