Hi,

With only the new patch to hlua_applet_tcp_fct, I've altered my msleep call to 
200 and use apachebench to confirm close to 5 requests per second.

Requests per second:    4.88 [#/sec] (mean)

So, new patch works for me.

B.


> On 20 Feb 2016, at 17:10, Thierry FOURNIER <tfourn...@arpalert.org> wrote:
> 
> Hi,
> 
> Thank you Robert for the bug repport, I reproduced the bug perfectly.
> Thank you Cyril for the analysis.
> 
> For information, the flag CTRLYIELD indicates that the yield is
> required by lua automatic interrupt system and not by some function. So
> the core must give back the hand to the haproxy core and resume
> immediately the Lua execution.
> 
> This system allow the execution time control, and allow the haproxy
> core to accept connections or forward data.
> 
> This explain why your patch doesn't run perfectly, it resume the Lua
> code, but immediately.
> 
> I join anothe fix. Can you test it ?
> 
> Thierry
> 
> 
> On Sat, 20 Feb 2016 15:54:49 +0000
> Robert Samuel Newson <rnew...@apache.org> wrote:
> 
>> with those changes, and altering my sleep to 1200;
>> 
>> time curl localhost:6000
>> hello
>> curl localhost:6000  0.01s user 0.00s system 0% cpu 1.215 total
>> 
>> I'd say you're on to something :)
>> 
>> 
>>> On 19 Feb 2016, at 23:25, Cyril Bonté <cyril.bo...@free.fr> wrote:
>>> 
>>> Hi Robert,
>>> 
>>> I add Thierry to the discussion (see below for the details).
>>> 
>>> Le 19/02/2016 20:15, Robert Samuel Newson a écrit :
>>>> Hi,
>>>> 
>>>> I think I've found a bug in core.msleep (and core.sleep);
>>>> 
>>>> foo.lua;
>>>> 
>>>> core.register_service("foo", "http", function(applet)
>>>>  core.msleep(1)
>>>>  local body = "hello"
>>>>  applet:set_status(200)
>>>>  applet:add_header("Content-Length", string.len(body))
>>>>  applet:start_response()
>>>>  applet:send(body)
>>>> end)
>>>> 
>>>> haproxy.cfg
>>>> 
>>>> global
>>>>  lua-load foo.lua
>>>> 
>>>> defaults
>>>>  mode http
>>>>  timeout client 150000
>>>>  timeout server 3600000
>>>>  timeout connect 5000
>>>>  timeout queue 5000
>>>> 
>>>> listen l
>>>>  bind 127.0.0.1:6000
>>>>  http-request use-service lua.foo
>>>> 
>>>> --
>>>> 
>>>> steps to reproduce;
>>>> 
>>>> curl 127.0.0.1:6000
>>>> 
>>>> this will not respond at all.
>>>> 
>>>> If you comment out the core.msleep(1) line, you get the expected 200 
>>>> response.
>>>> 
>>>> This seems to occurs wherever core.msleep is used but I've only confirmed 
>>>> this behaviour in register_service and register_action functions.
>>> 
>>> I'm not expert in the lua code area, but after some tests, I wonder if the 
>>> calls to hlua_yieldk() shoudln't provide the HLUA_CTRLYIELD flag in this 
>>> functions :
>>> - hlua_sleep_yield
>>> - hlua_sleep
>>> - hlua_msleep
>>> 
>>> Giving something like :
>>> diff --git a/src/hlua.c b/src/hlua.c
>>> index 5cf2320..022c107 100644
>>> --- a/src/hlua.c
>>> +++ b/src/hlua.c
>>> @@ -4983,7 +4983,7 @@ __LJMP static int hlua_sleep_yield(lua_State *L, int 
>>> status, lua_KContext ctx)
>>> {
>>>     int wakeup_ms = lua_tointeger(L, -1);
>>>     if (now_ms < wakeup_ms)
>>> -           WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_sleep_yield, wakeup_ms, 0));
>>> +           WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_sleep_yield, wakeup_ms, 
>>> HLUA_CTRLYIELD));
>>>     return 0;
>>> }
>>> 
>>> @@ -4998,7 +4998,7 @@ __LJMP static int hlua_sleep(lua_State *L)
>>>     wakeup_ms = tick_add(now_ms, delay);
>>>     lua_pushinteger(L, wakeup_ms);
>>> 
>>> -   WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_sleep_yield, wakeup_ms, 0));
>>> +   WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_sleep_yield, wakeup_ms, 
>>> HLUA_CTRLYIELD));
>>>     return 0;
>>> }
>>> 
>>> @@ -5013,7 +5013,7 @@ __LJMP static int hlua_msleep(lua_State *L)
>>>     wakeup_ms = tick_add(now_ms, delay);
>>>     lua_pushinteger(L, wakeup_ms);
>>> 
>>> -   WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_sleep_yield, wakeup_ms, 0));
>>> +   WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_sleep_yield, wakeup_ms, 
>>> HLUA_CTRLYIELD));
>>>     return 0;
>>> }
>>> 
>>> Also, I'm not sure about the wake_time type in "struct lua" : shouldn't it 
>>> be declared as an unsigned int ?
>>> Which then implies some type changes in other parts of the code, for 
>>> example :
>>> - in hlua_sleep_yield() : unsigned int wakeup_ms
>>> - or in hlua_yieldk() : shouldn't "int timeout" be declared as an unsigned 
>>> int also ?
>>> 
>>> Sorry, I can't have a more longer look on this tonight.
>>> 
>>> -- 
>>> Cyril Bonté
>> 
> 
> 
> -- 
> 
> <0001-BUG-MAJOR-lua-applets-can-t-sleep.patch>


Reply via email to