From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 3823728A13 for ; Mon, 27 Aug 2018 02:43:56 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id uiDSlBQ_XZuK for ; Mon, 27 Aug 2018 02:43:56 -0400 (EDT) Received: from smtp62.i.mail.ru (smtp62.i.mail.ru [217.69.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 8247E288BA for ; Mon, 27 Aug 2018 02:43:55 -0400 (EDT) From: Georgy Kirichenko Subject: [tarantool-patches] [PATCH v2] Don't throw an exception in a replication handler Date: Mon, 27 Aug 2018 09:43:46 +0300 Message-Id: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: tarantool-patches@freelists.org Cc: Georgy Kirichenko It is an error to throw an error out of a cbus message handler because it breaks cbus message delivery. In case of replication throwing an error prevents iproto against replication socket closing. Fixes 3642 --- Changes in v2: - Test fixes (setrlimit, formating) - Test result file included https://github.com/tarantool/tarantool/issues/3642 https://github.com/tarantool/tarantool/tree/g.kirichenko/gh-3642-fix-replication-socket-leak src/box/iproto.cc | 2 +- test/replication/misc.result | 98 ++++++++++++++++++++++++++++++++++ test/replication/misc.test.lua | 45 ++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) diff --git a/src/box/iproto.cc b/src/box/iproto.cc index ab7b42169..984c6df44 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -1424,7 +1424,7 @@ tx_process_join_subscribe(struct cmsg *m) unreachable(); } } catch (SocketError *e) { - throw; /* don't write error response to prevent SIGPIPE */ + return; /* don't write error response to prevent SIGPIPE */ } catch (Exception *e) { iproto_write_error(con->input.fd, e, ::schema_version, msg->header.sync); diff --git a/test/replication/misc.result b/test/replication/misc.result index 76e7fd5ee..fecdb495c 100644 --- a/test/replication/misc.result +++ b/test/replication/misc.result @@ -229,6 +229,104 @@ test_run:cmd("switch default") test_run:drop_cluster(SERVERS) --- ... +ffi = require('ffi') +--- +... +test_run:cmd("setopt delimiter ';;'") +--- +- true +... +ffi.cdef([[ +typedef long rlim_t; +struct rlimit { + rlim_t rlim_cur; /* Soft limit */ + rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */ +}; +int getrlimit(int resource, struct rlimit *rlim); +int setrlimit(int resource, const struct rlimit *rlim); +]]);; +--- +... +test_run:cmd("setopt delimiter ''");; +--- +- true +... +rlim = ffi.new('struct rlimit') +--- +... +ffi.C.getrlimit(7 --[[RLIMIT_NOFILE]], rlim) +--- +- 0 +... +old_rlim = rlim.rlim_cur +--- +... +rlim.rlim_cur = 64 +--- +... +ffi.C.setrlimit(7 --[[RLIMIT_NOFILE]], rlim) +--- +- 0 +... +test_run:cmd('create server sock with rpl_master=default, script="replication/replica.lua"') +--- +- true +... +test_run:cmd(string.format('start server sock')) +--- +- true +... +test_run:cmd('switch sock') +--- +- true +... +test_run = require('test_run').new() +--- +... +fiber = require('fiber') +--- +... +test_run:cmd("setopt delimiter ';'") +--- +- true +... +for i = 1, 64 do + local replication = box.cfg.replication + box.cfg{replication = {}} + box.cfg{replication = replication} + while box.info.replication[1].upstream.status ~= 'follow' do + fiber.sleep(0.0001) + end +end; +--- +... +test_run:cmd("setopt delimiter ''"); +--- +- true +... +box.info.replication[1].upstream.status +--- +- follow +... +test_run:cmd('switch default') +--- +- true +... +rlim.rlim_cur = old_rlim +--- +... +ffi.C.setrlimit(7 --[[RLIMIT_NOFILE]], rlim) +--- +- 0 +... +test_run:cmd('stop server sock') +--- +- true +... +test_run:cmd('cleanup server sock') +--- +- true +... box.schema.user.revoke('guest', 'replication') --- ... diff --git a/test/replication/misc.test.lua b/test/replication/misc.test.lua index c60adf5a5..e72ae7cda 100644 --- a/test/replication/misc.test.lua +++ b/test/replication/misc.test.lua @@ -90,6 +90,51 @@ box.space.space1:drop() test_run:cmd("switch default") test_run:drop_cluster(SERVERS) +ffi = require('ffi') +test_run:cmd("setopt delimiter ';;'") +ffi.cdef([[ +typedef long rlim_t; +struct rlimit { + rlim_t rlim_cur; /* Soft limit */ + rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */ +}; +int getrlimit(int resource, struct rlimit *rlim); +int setrlimit(int resource, const struct rlimit *rlim); +]]);; +test_run:cmd("setopt delimiter ''");; + +rlim = ffi.new('struct rlimit') +ffi.C.getrlimit(7 --[[RLIMIT_NOFILE]], rlim) +old_rlim = rlim.rlim_cur +rlim.rlim_cur = 64 +ffi.C.setrlimit(7 --[[RLIMIT_NOFILE]], rlim) + +test_run:cmd('create server sock with rpl_master=default, script="replication/replica.lua"') +test_run:cmd(string.format('start server sock')) +test_run:cmd('switch sock') +test_run = require('test_run').new() +fiber = require('fiber') +test_run:cmd("setopt delimiter ';'") +for i = 1, 64 do + local replication = box.cfg.replication + box.cfg{replication = {}} + box.cfg{replication = replication} + while box.info.replication[1].upstream.status ~= 'follow' do + fiber.sleep(0.0001) + end +end; +test_run:cmd("setopt delimiter ''"); + +box.info.replication[1].upstream.status + +test_run:cmd('switch default') + +rlim.rlim_cur = old_rlim +ffi.C.setrlimit(7 --[[RLIMIT_NOFILE]], rlim) + +test_run:cmd('stop server sock') +test_run:cmd('cleanup server sock') + box.schema.user.revoke('guest', 'replication') -- -- 2.18.0