From: Leonid Vasiliev <lvasiliev@tarantool.org> To: i.kosarev@tarantool.org, alexander.turenko@tarantool.org Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH V2] socket: fix error while closing socket.tcp_server Date: Tue, 19 May 2020 23:05:25 +0300 [thread overview] Message-ID: <5f4f3b47886fa74ab4c8fa19cbe77d80ed67b4b6.1589918392.git.lvasiliev@tarantool.org> (raw) 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. A "socket is close" check has been added at server's fiber and now server's fiber terminates correctly. Fixes: #4087 --- https://github.com/tarantool/tarantool/issues/4087 https://github.com/tarantool/tarantool/tree/lvasiliev/gh-4087-fix-socket-stuff @Changelog fix error while closing socket.tcp_server socket(gh-4087) For a "socket is close" check, fd < 0 is used instead of an additional flag. src/lua/socket.lua | 14 +++++++++++--- test/app/socket.result | 14 ++++++++++++++ test/app/socket.test.lua | 7 ++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/lua/socket.lua b/src/lua/socket.lua index a334ad4..bbdef01 100644 --- a/src/lua/socket.lua +++ b/src/lua/socket.lua @@ -73,12 +73,17 @@ local gc_socket_t = ffi.metatype(ffi.typeof('struct gc_socket'), { local socket_mt +local function socket_is_closed(socket) + -- The type of 'socket' is not checked because the function + -- is internal and the type must be checked outside if needed. + return socket._gc_socket.fd < 0 +end + local function check_socket(socket) local gc_socket = type(socket) == 'table' and socket._gc_socket if ffi.istype(gc_socket_t, gc_socket) then - local fd = gc_socket.fd - if fd >= 0 then - return fd + if not socket_is_closed(socket) then + return gc_socket.fd else error("attempt to use closed socket") end @@ -1082,6 +1087,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 socket_is_closed(s) then + break + end local sc, from = socket_accept(s) if sc == nil then local errno = s._errno 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
next reply other threads:[~2020-05-19 20:05 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-05-19 20:05 Leonid Vasiliev [this message] 2020-05-29 12:41 ` Alexander Turenko 2020-06-01 15:11 ` Ilya Kosarev 2020-06-02 14:54 ` Kirill Yukhin
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=5f4f3b47886fa74ab4c8fa19cbe77d80ed67b4b6.1589918392.git.lvasiliev@tarantool.org \ --to=lvasiliev@tarantool.org \ --cc=alexander.turenko@tarantool.org \ --cc=i.kosarev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH V2] 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