From 89484f5df095a4fb05afe40ce0328e33cf79e9aa Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 14 Nov 2024 17:13:58 +0100 Subject: [PATCH] Always close profiler output file. Reported by Guilherme Batalheiro. (cherry picked from commit fca66335d131669cf017420af6963a7565babb58) --- src/jit/p.lua | 4 +-- ...close-profile-dump-with-0-samples.test.lua | 25 +++++++++++++++++++ .../script.lua | 14 +++++++++++ test/tarantool-tests/utils/tools.lua | 4 +++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples.test.lua create mode 100644 test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples/script.lua diff --git a/src/jit/p.lua b/src/jit/p.lua index 4569d69e9b..89b49584c4 100644 --- a/src/jit/p.lua +++ b/src/jit/p.lua @@ -228,9 +228,7 @@ local function prof_finish() local samples = prof_samples if samples == 0 then if prof_raw ~= true then out:write("[No samples collected]\n") end - return - end - if prof_ann then + elseif prof_ann then prof_annotate(prof_count1, samples) else prof_top(prof_count1, prof_count2, samples, "") diff --git a/test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples.test.lua b/test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples.test.lua new file mode 100644 index 0000000000..bdee9f2647 --- /dev/null +++ b/test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples.test.lua @@ -0,0 +1,25 @@ +local tap = require('tap') +local test = tap.test('lj-1304-close-profile-dump-with-0-samples'):skipcond({ + ['Test requires /proc filesystem'] = jit.os == 'OSX', +}) +local utils = require('utils') + +test:plan(1) + +local p_filename = '/tmp/profile' + +-- runs %testname%/script.lua by +-- with the given environment, launch options and CLI arguments. +local script = utils.exec.makecmd(arg) +-- Execute a Lua script with start and stop LuaJIT profiler, +-- it is expected no samples found by profiler. The script's +-- output is suppressed, it is not interested. +local _ = script(p_filename) + +local p_content = io.open(p_filename):read('a*') +test:is(utils.tools.trim(p_content), '[No samples collected]', 'profile dump has no samples') + +-- Teardown. +os.remove(p_filename) + +test:done(true) diff --git a/test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples/script.lua b/test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples/script.lua new file mode 100644 index 0000000000..77335a0864 --- /dev/null +++ b/test/tarantool-tests/lj-1304-close-profile-dump-with-0-samples/script.lua @@ -0,0 +1,14 @@ +local p_options = 'ri1' +local p_filename = assert(arg[1], 'filename argument is missing') + +require('jit.p').start(p_options, p_filename) + +-- No code to generate profiling samples. + +-- Stop profiler to execute `jit/p.lua:prof_fmt()`. With zero +-- samples it triggers early return without closing the file. +require('jit.p').stop() + +-- Make sure LuaJIT profiler is close a file handle. +local ls_output = io.popen('ls -l /proc/$$/fd'):read('a*') +assert(ls_output:find(p_filename) == nil, 'file is open') diff --git a/test/tarantool-tests/utils/tools.lua b/test/tarantool-tests/utils/tools.lua index 33fcae7899..9cb65daf18 100644 --- a/test/tarantool-tests/utils/tools.lua +++ b/test/tarantool-tests/utils/tools.lua @@ -21,4 +21,8 @@ function M.read_file(path) return content end +function M.trim(str) + return (str:gsub('^%s*(.-)%s*$', '%1')) +end + return M