Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: testing tarantool in background mode
Before a commit ec1af12 ("box: do not close xlog file descriptors in the atfork handler") there was a bug when Tarantool with enabled background mode via environment variable could lead a crash: NO_WRAP ``` $ TT_PID_FILE=tarantool.pid TT_LOG=tarantool.log TT_BACKGROUND=true TT_LISTEN=3301 tarantool -e 'box.cfg{}' $ tail -3 tarantool.log 2021-11-02 16:05:43.672 [2341202] main init.c:696 E> LuajitError: cannot read stdin: Resource temporarily unavailable 2021-11-02 16:05:43.672 [2341202] main F> fatal error, exiting the event loop 2021-11-02 16:05:43.672 [2341202] main F> fatal error, exiting the event loop ``` NO_WRAP With commit ec1af12 ("box: do not close xlog file descriptors in the atfork handler") described bug could not be reproduced. Proposed patch adds a test that starts Tarantool in background mode enabled via box.cfg option and via environment variable TT_BACKGROUND to make sure this behaviour will not be broken in a future. Closes #6128 NO_DOC=test (cherry picked from commit f676fb7)
- Loading branch information
1 parent
e999c31
commit 861f6bf
Showing
2 changed files
with
113 additions
and
0 deletions.
There are no files selected for viewing
5 changes: 5 additions & 0 deletions
5
changelogs/unreleased/gh-6128-fix-crash-with-background-env-option.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
## bugfix/core | ||
|
||
* Fixed a crash that could happen when Tarantool is started in the | ||
[background mode](https://www.tarantool.io/en/doc/latest/reference/configuration/#confval-background) | ||
(gh-6128). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
local t = require("luatest") | ||
local popen = require("popen") | ||
local fio = require("fio") | ||
local g = t.group() | ||
|
||
local msg_opt_processing = "entering the event loop" | ||
|
||
local function tarantool_path(arg) | ||
local index = -2 | ||
-- arg[-1] is guaranteed to be non-null | ||
while arg[index] do index = index - 1 end | ||
return arg[index + 1] | ||
end | ||
|
||
local function check_err_msg(file, msg) | ||
local f = io.open(file, "rb") | ||
t.assert_not_equals(f, nil) | ||
local content = f:read("*all") | ||
f:close() | ||
return (string.match(content, msg) and true) or false | ||
end | ||
|
||
local TARANTOOL_PATH = tarantool_path(arg) | ||
|
||
g.before_test("test_background_mode_box_cfg", function() | ||
g.work_dir = fio.tempdir() | ||
g.log_path = fio.pathjoin(g.work_dir, "tarantool.log") | ||
g.pid_path = fio.pathjoin(g.work_dir, "tarantool.pid") | ||
|
||
t.assert_equals(fio.path.exists(g.log_path), false) | ||
t.assert_equals(fio.path.exists(g.pid_path), false) | ||
|
||
local box_cfg = string.format([[-e box.cfg{ | ||
pid_file='%s', background=true, work_dir='%s', log='%s', log_level=7, | ||
}]], g.pid_path, g.work_dir, g.log_path) | ||
local cmd = { | ||
TARANTOOL_PATH, box_cfg, | ||
} | ||
g.ph = popen.new(cmd, { | ||
stderr = popen.opts.PIPE, | ||
stdin = popen.opts.PIPE, | ||
stdout = popen.opts.PIPE, | ||
}) | ||
|
||
-- Start Tarantool and check that at least a log file has been created. | ||
t.assert_is_not(g.ph, nil) | ||
t.helpers.retrying({timeout = 2, delay = 0.01}, function(path) | ||
assert(fio.path.exists(path) == true) | ||
end, g.log_path) | ||
end) | ||
|
||
g.after_test("test_background_mode_box_cfg", function(cg) | ||
cg.ph:terminate() | ||
cg.ph:wait() | ||
cg.ph:close() | ||
fio.unlink(cg.pid_path) | ||
fio.unlink(cg.log_path) | ||
os.remove("*.xlog") | ||
os.remove("*.snap") | ||
end) | ||
|
||
g.test_background_mode_box_cfg = function(cg) | ||
t.helpers.retrying({timeout = 2, delay = 0.01}, function() | ||
assert(check_err_msg(cg.log_path, msg_opt_processing) == true) | ||
end, cg.log_path, cg.ph) | ||
end | ||
|
||
g.before_test("test_background_mode_env_vars", function() | ||
local cmd = { TARANTOOL_PATH, "-e", "box.cfg{}" } | ||
g.work_dir = fio.tempdir() | ||
g.log_path = fio.pathjoin(g.work_dir, "tarantool.log") | ||
g.pid_path = fio.pathjoin(g.work_dir, "tarantool.pid") | ||
t.assert_equals(fio.path.exists(g.log_path), false) | ||
t.assert_equals(fio.path.exists(g.pid_path), false) | ||
|
||
local env = {} | ||
env["TT_PID_FILE"] = g.pid_path | ||
env["TT_LOG"] = g.log_path | ||
env["TT_BACKGROUND"] = "true" | ||
env["TT_WORK_DIR"] = g.work_dir | ||
g.ph = popen.new(cmd, { | ||
stderr = popen.opts.PIPE, | ||
stdin = popen.opts.PIPE, | ||
stdout = popen.opts.PIPE, | ||
env = env, | ||
}) | ||
t.assert_is_not(g.ph, nil) | ||
t.helpers.retrying({timeout = 2, delay = 0.01}, function(path) | ||
assert(fio.path.exists(path) == true) | ||
end, g.log_path) | ||
end) | ||
|
||
g.after_test("test_background_mode_env_vars", function(cg) | ||
cg.ph:terminate() | ||
cg.ph:wait() | ||
cg.ph:close() | ||
fio.unlink(cg.pid_path) | ||
fio.unlink(cg.log_path) | ||
os.remove("*.xlog") | ||
os.remove("*.snap") | ||
end) | ||
|
||
g.test_background_mode_env_vars = function(cg) | ||
t.helpers.retrying({timeout = 2, delay = 0.01}, function() | ||
assert(check_err_msg(cg.log_path, msg_opt_processing) == true) | ||
end, cg.log_path, cg.ph) | ||
check_err_msg(cg.log_path, msg_opt_processing) | ||
end |