From 7e4ee47accdb93925ddfc18cf6f181ff334abcdc Mon Sep 17 00:00:00 2001 From: Thierry FOURNIER Date: Fri, 25 May 2018 15:03:50 +0200 Subject: [PATCH] BUG/MAJOR: lua: Dead lock with sockets In some cases, when we are waiting for data and the socket timeout expires, we have a dead lock. The Lua socket locks the applet socket, and call for a notify. The notify immediately executes code and try to acquire the same lock, so ... dead lock. stream_int_notify() cant be used because it wakeup the applet task only if the stream have changes. The changes are forces by Lua, but not repported on the stream. stream_int_update_applet() cant be used because the deadlock. So, I inconditionnaly wakeup the applet. This wake is performed asynchronously, and will call a stream_int_notify(). This patch must be backported in 1.6, 1.7 and 1.8 --- src/hlua.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hlua.c b/src/hlua.c index 03e961c37..48de5cba5 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -1766,8 +1766,7 @@ __LJMP static int hlua_socket_receive_yield(struct lua_State *L, int status, lua co_skip(oc, len + skip_at_end); /* Don't wait anything. */ - stream_int_notify(&s->si[0]); - stream_int_update_applet(&s->si[0]); + appctx_wakeup(appctx); /* If the pattern reclaim to read all the data * in the connection, got out.