[Tarantool-patches] [PATCH] socket: fix error while closing socket.tcp_server

lvasiliev lvasiliev at tarantool.org
Wed May 6 11:01:41 MSK 2020


Hi! Thanks for the review.

On 29.04.2020 15:12, Ilya Kosarev wrote:
> 
> Hi!
>   
> Thanks for the patch.
>   
> LGTM, see 2 nits below.
>   
>> The tcp server starts in a separate fiber and when
>> the socket closes from another fiber the server's
>> fiber fails with an attempt to validate the server
>> socket. For check the socket status at server's
>> fiber a flag has been added and now server's fiber
>> will terminate correctly if the socket was closed.
> 1. I think this way it might sound a bit better:
> The tcp server starts in a separate fiber and when
> it’s socket is being closed from another fiber,
> server's fiber used to fail with an attempt to validate
> the server socket. To check socket status at server's
> fiber a flag has been added and now server's fiber
> terminates correctly when the socket is being closed.

Updated description:

The tcp server starts in a separate fiber.
When server's socket is closed from another fiber,
an exception will be thrown in server's loop from
check_socket function.
To check socket status at server's fiber a flag has
been added and now server's fiber terminates correctly
when the socket is being closed.

>>
>> Fixes: #4087
>> ---
>> @Changelog fix error while closing socket.tcp_server socket(gh-4087)
>>
>>   src/lua/socket.lua | 9 +++++++++
>>   test/app/socket.result | 14 ++++++++++++++
>>   test/app/socket.test.lua | 7 ++++++-
>>   3 files changed, 29 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/lua/socket.lua b/src/lua/socket.lua
>> index a334ad4..e453a53 100644
>> --- a/src/lua/socket.lua
>> +++ b/src/lua/socket.lua
>> @@ -102,6 +102,9 @@ local gc_socket_sentinel = ffi.new(gc_socket_t, { fd = -1 })
>>   
>>   local function socket_close(socket)
>>       local fd = check_socket(socket)
>> + if socket._server_soc9ket_closed ~= nil then
>> + socket._server_socket_closed = true
>> + end
> 2. I think we have an option here to skip this check
> and simply always assign.
> socket._server_socket_closed = true
> In my opinion it looks a bit more obvious and breaks nothing.
 From the code correctness point of view, this really doesn't
break anything. But IMO this is a property of a subset of sockets
(tcp server sockets) not all. In other words, a server socket
can be used in the context of a "base" socket, but a "base" socket
can't be used in the context of a server socket
(like a "base" and an "inheritor").
>>       socket._errno = nil
>>       local r = ffi.C.coio_close(fd)
>>       -- .fd is const to prevent tampering
>> @@ -1082,6 +1085,9 @@ local function tcp_server_loop(server, s, addr)
>>       fiber.name(format("%s/%s:%s", server.name, addr.host, addr.port), {truncate = true})
>>       log.info("started")
>>       while socket_readable(s) do
>> + if s._server_socket_closed then
>> + break
>> + end
>>           local sc, from = socket_accept(s)
>>           if sc == nil then
>>               local errno = s._errno
>> @@ -1216,6 +1222,9 @@ local function tcp_server(host, port, opts, timeout)
>>           return nil
>>       end
>>       fiber.create(tcp_server_loop, server, s, addr)
>> + -- The _server_socket_closed flag is necessary for the server
>> + -- to stop correctly when closing the socket.
>> + s._server_socket_closed = false
>>       return s, addr
>>   end
>>   
>> diff --git a/test/app/socket.result b/test/app/socket.result
>> index 9f0ea0a..6206848 100644
>> --- a/test/app/socket.result
>> +++ b/test/app/socket.result
>> @@ -2914,3 +2914,17 @@ srv:close()
>>   ---
>>   - true
>>   ...
>> +--
>> +-- gh-4087: fix error while closing socket.tcp_server
>> +--
>> +srv = socket.tcp_server('127.0.0.1', 0, function() end)
>> +---
>> +...
>> +srv:close()
>> +---
>> +- true
>> +...
>> +test_run:wait_log('default', 'stopped', 1024, 0.01)
>> +---
>> +- stopped
>> +...
>> diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua
>> index d1fe7ad..a399fca 100644
>> --- a/test/app/socket.test.lua
>> +++ b/test/app/socket.test.lua
>> @@ -987,4 +987,9 @@ s:settimeout(1)
>>   s:receive('*a')
>>   s:close()
>>   srv:close()
>> -
>> +--
>> +-- gh-4087: fix error while closing socket.tcp_server
>> +--
>> +srv = socket.tcp_server('127.0.0.1', 0, function() end)
>> +srv:close()
>> +test_run:wait_log('default', 'stopped', 1024, 0.01)
>> --
>> 2.7.4
>>    
>   
>   
> --
> Ilya Kosarev
>   
> 


More information about the Tarantool-patches mailing list