From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Serge Petrenko Subject: [PATCH v2] tarantoolctl: return an error on enter to a dead socket. Date: Tue, 21 Aug 2018 09:56:21 +0300 Message-Id: <20180821065621.27693-1-sergepetrenko@tarantool.org> To: vdavydov.dev@gmail.com Cc: kostja@tarantool.org, tarantool-patches@freelists.org, Serge Petrenko List-ID: Tarantoolctl enter didn't check whether connection to a socket was established if a socket file existed. It just executed a local console. Fix this by adding a check and an error, also add a test case. Closes #3364 --- https://github.com/tarantool/tarantool/issues/3364 https://github.com/tarantool/tarantool/tree/sergepetrenko/gh-3364-tarantoolctl-enter-fix Changes in v2: - alter testcase. - remove explicit deletion of unix socket from patch due to poor implementation. extra/dist/tarantoolctl.in | 19 +++++++++------ test/app-tap/tarantoolctl.test.lua | 48 +++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/extra/dist/tarantoolctl.in b/extra/dist/tarantoolctl.in index 70747bd0c..6b6e78cd2 100755 --- a/extra/dist/tarantoolctl.in +++ b/extra/dist/tarantoolctl.in @@ -638,15 +638,20 @@ local function enter() end return 1 end - - local cmd = string.format( - "require('console').connect('%s', { connect_timeout = %s })", - console_sock, TIMEOUT_INFINITY - ) - - console.on_start(function(self) self:eval(cmd) end) + local status, ret + console.on_start(function(self) + status, ret = pcall(console.connect, console_sock, + {connect_timeout = TIMEOUT_INFINITY}) + if not status then + log.error("Can't connect to %s (%s)", console_sock_path, ret) + self.running = false + end + end) console.on_client_disconnect(function(self) self.running = false end) console.start() + if not status then + return 1 + end return 0 end diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua index ac9a208ca..c37c8f365 100755 --- a/test/app-tap/tarantoolctl.test.lua +++ b/test/app-tap/tarantoolctl.test.lua @@ -120,6 +120,14 @@ local function tctl_wait_stop(dir, name) end end +local function wait_delete(path) + if path then + while fio.path.exists(path) do + fiber.sleep(0.001) + end + end +end + local function tctl_command(dir, cmd, args, name) local pid = nil if not fio.stat(fio.pathjoin(dir, '.tarantoolctl')) then @@ -157,7 +165,7 @@ local function check_ok(test, dir, cmd, args, e_res, e_stdout, e_stderr) end local test = tap.test('tarantoolctl') -test:plan(6) +test:plan(7) -- basic start/stop test -- must be stopped afterwards @@ -258,6 +266,44 @@ do end end +-- check enter +do + local dir = fio.tempdir() + + local code = [[ box.cfg{} ]] + create_script(dir, 'script.lua', code) + + local status, err = pcall(function() + test:test("check error codes in case of enter", function(test_i) + test_i:plan(10) + check_ok(test_i, dir, 'enter', 'script', 1, nil, "Can't connect to") + local console_sock = 'script.control' + console_sock = fio.pathjoin(dir, console_sock) + test_i:is(fio.path.exists(console_sock), false, "directory clean") + check_ok(test_i, dir, 'start', 'script', 0) + tctl_wait_start(dir, 'script') + test_i:is(fio.path.exists(console_sock), true, + "unix socket created") + check_ok(test_i, dir, 'stop', 'script', 0) + wait_delete(console_sock) + test_i:is(fio.path.exists(console_sock), false, + "remove unix socket upon exit") + fio.open(console_sock, 'O_CREAT') + test_i:is(fio.path.exists(console_sock), true, "file created") + check_ok(test_i, dir, 'enter', 'script', 1, nil, "Can't connect to") + fio.unlink(console_sock) + end) + end) + + cleanup_instance(dir, 'script') + recursive_rmdir(dir) + + if status == false then + print(("Error: %s"):format(err)) + os.exit() + end +end + -- check basic help do local dir = fio.tempdir() -- 2.15.2 (Apple Git-101.1)