Tarantool development patches archive
 help / color / mirror / Atom feed
From: "Ilya Kosarev" <i.kosarev@tarantool.org>
To: "Leonid Vasiliev" <lvasiliev@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH] socket: fix error while closing socket.tcp_server
Date: Wed, 29 Apr 2020 15:12:01 +0300	[thread overview]
Message-ID: <1588162321.664592164@f301.i.mail.ru> (raw)
In-Reply-To: <d6933382eeb3c931d60fd5462b7dca17cf2b3767.1587731005.git.lvasiliev@tarantool.org>

[-- Attachment #1: Type: text/plain, Size: 3444 bytes --]


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

[-- Attachment #2: Type: text/html, Size: 5007 bytes --]

  parent reply	other threads:[~2020-04-29 12:12 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-24 12:26 Leonid Vasiliev
2020-04-24 14:03 ` lvasiliev
2020-04-29 12:12 ` Ilya Kosarev [this message]
2020-05-06  8:01   ` lvasiliev
2020-05-06  8:20     ` Ilya Kosarev
2020-05-06 15:38 ` Alexander Turenko
2020-05-07  7:29   ` lvasiliev
2020-05-13 14:21     ` Alexander Turenko
2020-05-19 19:52       ` lvasiliev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1588162321.664592164@f301.i.mail.ru \
    --to=i.kosarev@tarantool.org \
    --cc=lvasiliev@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH] socket: fix error while closing socket.tcp_server' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox