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
This commit is contained in:
Thierry FOURNIER 2018-05-25 15:03:50 +02:00 committed by Willy Tarreau
parent af4bd0867a
commit 7e4ee47acc

View File

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