Hi Cyril,
Thankyou for the response.
Please ignore the second timeout setting, I was testing different things.
I have changed the lua code as you suggested - thanks for the hint there.
function get_from_gds(key)
local sock = core.tcp()
-- Connect timeout after patch
sock:settimeout(3)
local result = DOMAIN_NOT_FOUND
local status, error = sock:connect(gds_host, gds_port)
if not status then
core.Alert("Error in connecting:" .. key .. ":" .. error)
return "Error", "Error: " .. error
end
sock:send(key .. "\r\n")
while true do
local s, status, partial = sock:receive("*l")
if not s then
core.Alert("Error reading:" .. status)
return "Error", status
end
if s == "END" then break end
result = s
end
sock:close()
core.Alert("Returning from GDS:" .. key .. ":" .. result)
return result
end
but the receive still does not timeout in 3 seconds.
On Mon, Aug 13, 2018 at 2:19 AM, Cyril Bonté <[email protected]> wrote:
> Le 12/08/2018 à 18:21, Sachin Shetty a écrit :
>
>> Hi Cyril,
>>
>> I have created a very simple config to reproduce this. This config always
>> read timesout in 9 seconds.
>>
>
> I think there are 3 issues.
>
> [...]
>> function get_from_gds(key)
>> [...] local sock = core.tcp()
>> -- Connect timeout after patch
>> sock:settimeout(3)
>> local result = DOMAIN_NOT_FOUND
>> local status, error = sock:connect(gds_host, gds_port)
>> if not status then
>> core.Alert("Error in connecting:" .. key .. ":" .. error)
>> return "Error", "Error: " .. error
>> end
>> sock:settimeout(2)
>> sock:send(key .. "\r\n")
>> while true do
>> local s, status, partial = sock:receive("*l")
>>
>
> 1. The first one is in the LUA code, where you don't check the return code
> after calling sock:receive(). In this case, you enter in an "infinite"
> loop, adding an extra time to the response almost equal to
> tune.lua.session-timeout (4s by default).
> You may want to add this :
> if not s then
> core.Alert("Error reading:" .. status)
> return "Error", status
> end
>
> Now, 2 other issues seems to be in haproxy, but I'm not sure if it's the
> right way to fix this (I add Willy and Thierry to the thread) :
> 2. hlua_socket_settimeout() initializes rto/wto values, maybe it should
> also compute the rex/wex values :
> socket->s->req.rex = tick_add_ifset(now_ms, tmout);
> socket->s->req.wex = tick_add_ifset(now_ms, tmout);
> socket->s->res.rex = tick_add_ifset(now_ms, tmout);
> socket->s->res.wex = tick_add_ifset(now_ms, tmout);
> 3. It may require to wake up the task if a new timeout is set after a
> first one was already set (in your case the task doesn't wake up after 2
> secondes because a first timeout was set to 3 seconds) :
> task_wakeup(socket->s->task, TASK_WOKEN_OTHER);
>
> At least, it seems to fix the issue but before sending a patch, I want to
> be sure that's how we should fix this.
>
> --
> Cyril Bonté
>