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é