* [Tarantool-patches] [PATCH rfc 0/2] Lua 5.2 compatibility @ 2019-11-07 14:03 Olga Arkhangelskaia 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 1/2] lua: turn on lua " Olga Arkhangelskaia 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 2/2] box: raise on raw modifications of box.cfg values Olga Arkhangelskaia 0 siblings, 2 replies; 6+ messages in thread From: Olga Arkhangelskaia @ 2019-11-07 14:03 UTC (permalink / raw) To: tarantool-patches We add support of Lua 5.2, this means we can use __pair, __ipairs, etc. However, the interface of some functions has changed (os.execute, file:read, etc), so we need to be careful. The support of this feature gives as good way to protect box.cfg from raw modification. Olga Arkhangelskaia (2): lua: turn on lua 5.2 compatibility box: raise on raw modifications of box.cfg values cmake/luajit.cmake | 1 + extra/dist/tarantoolctl.in | 2 +- src/box/lua/load_cfg.lua | 18 +- test/app-tap/debug.test.lua | 4 +- test/app-tap/tarantoolctl.test.lua | 80 ++--- test/box-tap/cfg.test.lua | 60 ++-- test/box/cfg.result | 55 ++++ test/box/cfg.test.lua | 3 + test/wal_off/rtree_benchmark.result | 255 +++++++++------- test/wal_off/rtree_benchmark.test.lua | 20 +- test/wal_off/snapshot_stress.result | 415 ++++++++++++++------------ test/wal_off/snapshot_stress.test.lua | 4 +- 12 files changed, 537 insertions(+), 380 deletions(-) -- 2.20.1 (Apple Git-117) ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Tarantool-patches] [PATCH 1/2] lua: turn on lua 5.2 compatibility 2019-11-07 14:03 [Tarantool-patches] [PATCH rfc 0/2] Lua 5.2 compatibility Olga Arkhangelskaia @ 2019-11-07 14:03 ` Olga Arkhangelskaia 2019-11-16 13:47 ` Igor Munkin 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 2/2] box: raise on raw modifications of box.cfg values Olga Arkhangelskaia 1 sibling, 1 reply; 6+ messages in thread From: Olga Arkhangelskaia @ 2019-11-07 14:03 UTC (permalink / raw) To: tarantool-patches Enabling features that might slightly break existing code (os.execute, etc). Done via -DLUAJIT_ENABLE_LUA52COMPAT flag. Now we need to be more attentive with returning values, methametods and etc. --- cmake/luajit.cmake | 1 + extra/dist/tarantoolctl.in | 2 +- test/app-tap/debug.test.lua | 4 +- test/app-tap/tarantoolctl.test.lua | 80 ++--- test/box-tap/cfg.test.lua | 46 +-- test/wal_off/rtree_benchmark.result | 255 +++++++++------- test/wal_off/rtree_benchmark.test.lua | 20 +- test/wal_off/snapshot_stress.result | 415 ++++++++++++++------------ test/wal_off/snapshot_stress.test.lua | 4 +- 9 files changed, 450 insertions(+), 377 deletions(-) diff --git a/cmake/luajit.cmake b/cmake/luajit.cmake index 10df633d5..3157c35ac 100644 --- a/cmake/luajit.cmake +++ b/cmake/luajit.cmake @@ -217,6 +217,7 @@ macro(luajit_build) add_definitions(-DLUAJIT_USE_ASAN=1) set (luajit_ldflags ${luajit_ldflags} -fsanitize=address) endif() + add_definitions(-DLUAJIT_ENABLE_LUA52COMPAT=1) add_definitions(-DLUAJIT_SMART_STRINGS=1) # Add all COMPILE_DEFINITIONS to xcflags get_property(defs DIRECTORY PROPERTY COMPILE_DEFINITIONS) diff --git a/extra/dist/tarantoolctl.in b/extra/dist/tarantoolctl.in index 6daf866ac..e8c9ff164 100755 --- a/extra/dist/tarantoolctl.in +++ b/extra/dist/tarantoolctl.in @@ -309,7 +309,7 @@ local function under_systemd() if not usermode then local rv = os.execute("systemctl 2>/dev/null | grep '\\-\\.mount' " .. "1>/dev/null 2>/dev/null") - if rv == 0 then + if rv == true then return true end end diff --git a/test/app-tap/debug.test.lua b/test/app-tap/debug.test.lua index 0d199e55b..eee932acc 100755 --- a/test/app-tap/debug.test.lua +++ b/test/app-tap/debug.test.lua @@ -61,7 +61,7 @@ for _, test in ipairs(tests) do local cmd = string.format('%s -e "%s; os.exit(0)"', TNTBIN, test) print('Exec: '..cmd) io.flush() - assert(os.execute(cmd) == 0, string.format('cmd: "%s" must execute successfully', cmd)) + assert(os.execute(cmd) == true, string.format('cmd: "%s" must execute successfully', cmd)) end local fio = require('fio') @@ -87,7 +87,7 @@ for _, test in ipairs(tests) do file:close() print('Source: '..test) io.flush() - assert(os.execute(cmd) == 0, string.format('cmd: "%s" must execute successfully', cmd)) + assert(os.execute(cmd) == true, string.format('cmd: "%s" must execute successfully', cmd)) end os.remove(filename) diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua index f38820805..ea780fe07 100755 --- a/test/app-tap/tarantoolctl.test.lua +++ b/test/app-tap/tarantoolctl.test.lua @@ -84,10 +84,10 @@ local function run_command(dir, command) local fstderr = fio.pathjoin(dir, 'stderr-' .. suffix) local line = [[/bin/sh -c 'cd "%s" && %s >"%s" 2>"%s"']] line = line:format(dir, command, fstdout, fstderr) - local res = os.execute(line) + local res, exit, status = os.execute(line) local fstdout_e, fstderr_e = io.open(fstdout):read('*a'), io.open(fstderr):read('*a') fio.unlink(fstdout); fio.unlink(fstderr); - return res/256, fstdout_e, fstderr_e + return res, status, fstdout_e, fstderr_e end local function tctl_wait_start(dir, name) @@ -133,13 +133,19 @@ local function tctl_command(dir, cmd, args, name) return run_command(dir, command) end -local function check_ok(test, dir, cmd, args, e_res, e_stdout, e_stderr) - local res, stdout, stderr = tctl_command(dir, cmd, args) +local FAIL = nil +local SUCCESS = true + +local function check_ok(test, dir, cmd, args, e_res, e_status, e_stdout, e_stderr) + local res, status, stdout, stderr = tctl_command(dir, cmd, args) stdout, stderr = stdout or '', stderr or '' local ares = true if (e_res ~= nil) then local val = test:is(res, e_res, ("check '%s' command status for '%s'"):format(cmd,args)) ares = ares and val + else + local val = test:is(status, e_status, ("check '%s' command status for '%s'"):format(cmd,args)) + ares = ares and val end if e_stdout ~= nil then local val = test:is(res, e_res, ("check '%s' stdout for '%s'"):format(cmd,args)) @@ -190,17 +196,17 @@ do local status, err = pcall(function() test:test("basic test", function(test_i) test_i:plan(18) - check_ok(test_i, dir, 'start', 'delayed_box_cfg', 0, nil, "Starting instance") - check_ok(test_i, dir, 'start', 'script', 0, nil, "Starting instance") + check_ok(test_i, dir, 'start', 'delayed_box_cfg', SUCCESS, 0, nil, "Starting instance") + check_ok(test_i, dir, 'start', 'script', SUCCESS, 0, nil, "Starting instance") tctl_wait_start(dir, 'script') - check_ok(test_i, dir, 'status', 'script', 0, nil, "is running") - check_ok(test_i, dir, 'start', 'script', 1, nil, "is already running") - check_ok(test_i, dir, 'status', 'script', 0, nil, "is running") - check_ok(test_i, dir, 'stop', 'script', 0, nil, "Stopping") + check_ok(test_i, dir, 'status', 'script', SUCCESS, 0, nil, "is running") + check_ok(test_i, dir, 'start', 'script', FAIL, 1, nil, "is already running") + check_ok(test_i, dir, 'status', 'script', SUCCESS, 0, nil, "is running") + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0, nil, "Stopping") tctl_wait_stop(dir, 'script') - check_ok(test_i, dir, 'status', 'script', 1, nil, "is stopped") - check_ok(test_i, dir, 'stop', 'script', 0, nil, "is not running") - check_ok(test_i, dir, 'status', 'script', 1, nil, "is stopped" ) + check_ok(test_i, dir, 'status', 'script', FAIL, 1, nil, "is stopped") + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0, nil, "is not running") + check_ok(test_i, dir, 'status', 'script', FAIL, 1, nil, "is stopped" ) end) end) @@ -225,16 +231,16 @@ do local status, err = pcall(function() test:test("basic test for bad script", function(test_i) test_i:plan(7) - check_ok(test_i, dir, 'start', 'script', 1, nil, + check_ok(test_i, dir, 'start', 'script', FAIL, 1, nil, 'Instance script is not found') - check_ok(test_i, dir, 'start', 'bad_script', 1, nil, + check_ok(test_i, dir, 'start', 'bad_script', FAIL,1, nil, 'unexpected symbol near') - check_ok(test_i, dir, 'start', 'good_script', 0) + check_ok(test_i, dir, 'start', 'good_script', SUCCESS, 0) tctl_wait_start(dir, 'good_script') -- wait here - check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', 3, + check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', FAIL, 3, nil, nil) - check_ok(test_i, dir, 'stop', 'good_script', 0) + check_ok(test_i, dir, 'stop', 'good_script', SUCCESS, 0) end) end) @@ -261,13 +267,13 @@ do local status, err = pcall(function() test:test("check answers in case of call", function(test_i) test_i:plan(5) - check_ok(test_i, dir, 'start', 'good_script', 0) + check_ok(test_i, dir, 'start', 'good_script', SUCCESS, 0) tctl_wait_start(dir, 'good_script') - check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', 3, + check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', FAIL, 3, nil, nil) - check_ok(test_i, dir, 'eval', 'good_script ok_script.lua', 0, + check_ok(test_i, dir, 'eval', 'good_script ok_script.lua', SUCCESS, 0, '---\n- 1\n...', nil) - check_ok(test_i, dir, 'stop', 'good_script', 0) + check_ok(test_i, dir, 'stop', 'good_script', SUCCESS, 0) end) end) @@ -290,21 +296,21 @@ do 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") + check_ok(test_i, dir, 'enter', 'script', FAIL, 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) + check_ok(test_i, dir, 'start', 'script', SUCCESS, 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) + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0) tctl_wait_stop(dir, 'script') 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") + check_ok(test_i, dir, 'enter', 'script', FAIL, 1, nil, "Can't connect to") fio.unlink(console_sock) end) end) @@ -325,7 +331,7 @@ do local function test_help(test, dir, cmd, e_stderr) local desc = dir and 'with config' or 'without config' dir = dir or './' - local res, stdout, stderr = run_command(dir, cmd) + local res, status, stdout, stderr = run_command(dir, cmd) if e_stderr ~= nil then if not test:ok(stderr:find(e_stderr), ("check stderr of '%s' %s"):format(cmd, desc)) then print(("Expected to find '%s' in '%s'"):format(e_stderr, stderr)) @@ -380,8 +386,8 @@ do local command_base = 'tarantoolctl cat filler/00000000000000000000.xlog' local desc = args and "cat + " .. args or "cat" args = args and " " .. args or "" - local res, stdout, stderr = run_command(dir, command_base .. args) - test:is(res, 0, desc .. " result") + local res, status, stdout, stderr = run_command(dir, command_base .. args) + test:is(res, SUCCESS, desc .. " result") test:is(select(2, stdout:gsub(delim, delim)), lc, desc .. " line count") end @@ -389,15 +395,15 @@ do local command_base = 'tarantoolctl cat filler/00000000000000000000.snap' local desc = args and "cat + " .. args or "cat" args = args and " " .. args or "" - local res, stdout, stderr = run_command(dir, command_base .. args) - test:is(res, 0, desc .. " result") + local res, status, stdout, stderr = run_command(dir, command_base .. args) + test:is(res, SUCCESS, desc .. " result") test:is(select(2, stdout:gsub(delim, delim)), lc, desc .. " line count") end local status, err = pcall(function() test:test("fill and test cat output", function(test_i) test_i:plan(29) - check_ok(test_i, dir, 'start', 'filler', 0) + check_ok(test_i, dir, 'start', 'filler', SUCCESS, 0) check_ctlcat_xlog(test_i, dir, nil, "---\n", 7) check_ctlcat_xlog(test_i, dir, "--space=512", "---\n", 6) check_ctlcat_xlog(test_i, dir, "--space=666", "---\n", 0) @@ -470,14 +476,14 @@ else local status, err = pcall(function() test:test("fill and test play output", function(test_i) test_i:plan(6) - check_ok(test_i, dir, 'start', 'filler', 0) + check_ok(test_i, dir, 'start', 'filler', SUCCESS, 0) local lsn_before = test_run:get_lsn("remote", 1) test_i:is(lsn_before, 4, "check lsn before") - local res, stdout, stderr = run_command(dir, command_base) - test_i:is(res, 0, "execution result") + local res, status, stdout, stderr = run_command(dir, command_base) + test_i:is(res, SUCCESS, "execution result") test_i:is(test_run:get_lsn("remote", 1), 10, "check lsn after") - local res, stdout, stderr = run_command(dir, command_base) - test_i:is(res, 0, "execution result") + local res, status, stdout, stderr = run_command(dir, command_base) + test_i:is(res, SUCCESS, "execution result") test_i:is(test_run:get_lsn("remote", 1), 16, "check lsn after") end) end) diff --git a/test/box-tap/cfg.test.lua b/test/box-tap/cfg.test.lua index d529447bb..b61073438 100755 --- a/test/box-tap/cfg.test.lua +++ b/test/box-tap/cfg.test.lua @@ -162,7 +162,7 @@ box.cfg({ worker_pool_threads = 1}) test:is(box.cfg.worker_pool_threads, 1, 'worker_pool_threads') local tarantool_bin = arg[-1] -local PANIC = 256 +local PANIC = nil function run_script(code) local dir = fio.tempdir() local script_path = fio.pathjoin(dir, 'script.lua') @@ -182,14 +182,14 @@ code =[[ box.cfg{vinyl_memory=0} os.exit(box.cfg.vinyl_memory == 0 and 0 or 1) ]] -test:is(run_script(code), 0, "actually set vinyl_memory to 0") +test:is(run_script(code), true, "actually set vinyl_memory to 0") -- gh-715: Cannot switch to/from 'fsync' code = [[ box.cfg{ log="tarantool.log", log_nonblock = false, wal_mode = 'fsync' }; ]] -test:is(run_script(code), 0, 'wal_mode fsync') +test:is(run_script(code), true, 'wal_mode fsync') code = [[ box.cfg{ wal_mode = 'fsync' }; box.cfg { wal_mode = 'fsync' }; ]] -test:is(run_script(code), 0, 'wal_mode fsync -> fsync') +test:is(run_script(code), true, 'wal_mode fsync -> fsync') code = [[ box.cfg{ wal_mode = 'fsync' }; box.cfg { wal_mode = 'none'} ]] test:is(run_script(code), PANIC, 'wal_mode fsync -> write is not supported') @@ -204,7 +204,7 @@ test:is(run_script(code), PANIC, 'work_dir is invalid') -- gh-2664: vinyl_dir is checked on the first use code = [[ box.cfg{ vinyl_dir='invalid' } ]] -test:is(run_script(code), 0, 'vinyl_dir is invalid') +test:is(run_script(code), true, 'vinyl_dir is invalid') code = [[ box.cfg{ memtx_dir='invalid' } ]] test:is(run_script(code), PANIC, 'snap_dir is invalid') @@ -217,7 +217,7 @@ code = [[ box.cfg{log_nonblock = false } os.exit(box.cfg.log_nonblock == false and 0 or 1) ]] -test:is(run_script(code), 0, "log_nonblock new value") +test:is(run_script(code), true, "log_nonblock new value") -- gh-3048: box.cfg must not crash on invalid log configuration code = [[ box.cfg{ log = '/' } ]] @@ -265,7 +265,7 @@ local conn = require('net.box').connect('unix/:./tarantool.sock', if not conn:ping() then os.exit(1) end os.exit(0) ]] -test:is(run_script(code), 0, "wal_mode none and ER_LOADING") +test:is(run_script(code), true, "wal_mode none and ER_LOADING") -- -- gh-1962: incorrect replication source @@ -286,13 +286,13 @@ code = [[ box.cfg{vinyl_page_size = 1 * 1024 * 1024, vinyl_range_size = 2 * 1024 * 1024} os.exit(0) ]] -test:is(run_script(code), 0, "page size less than range") +test:is(run_script(code), true, "page size less than range") code = [[ box.cfg{vinyl_page_size = 2 * 1024 * 1024, vinyl_range_size = 2 * 1024 * 1024} os.exit(0) ]] -test:is(run_script(code), 0, "page size equal with range") +test:is(run_script(code), true, "page size equal with range") -- test memtx options upgrade code = [[ @@ -303,7 +303,7 @@ os.exit(box.cfg.memtx_memory == 214748364 and box.cfg.memtx_max_tuple_size == 64 * 1024 and 0 or 1) ]] -test:is(run_script(code), 0, "upgrade memtx memory options") +test:is(run_script(code), true, "upgrade memtx memory options") code = [[ box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 * 1024, @@ -311,7 +311,7 @@ box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 memtx_max_tuple_size = 64 * 1024} os.exit(0) ]] -test:is(run_script(code), 0, "equal new and old memtx options") +test:is(run_script(code), true, "equal new and old memtx options") code = [[ box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 * 1024, @@ -339,20 +339,20 @@ code = [[ box.cfg{panic_on_wal_error = true} os.exit(box.cfg.force_recovery == false and 0 or 1) ]] -test:is(run_script(code), 0, "panic_on_wal_error") +test:is(run_script(code), true, "panic_on_wal_error") code = [[ box.cfg{panic_on_snap_error = false} os.exit(box.cfg.force_recovery == true and 0 or 1) ]] -test:is(run_script(code), 0, "panic_on_snap_error") +test:is(run_script(code), true, "panic_on_snap_error") code = [[ box.cfg{snapshot_period = 100, snapshot_count = 4} os.exit(box.cfg.checkpoint_interval == 100 and box.cfg.checkpoint_count == 4 and 0 or 1) ]] -test:is(run_script(code), 0, "setup checkpoint params") +test:is(run_script(code), true, "setup checkpoint params") code = [[ box.cfg{snapshot_period = 100, snapshot_count = 4} @@ -360,7 +360,7 @@ box.cfg{snapshot_period = 150, snapshot_count = 8} os.exit(box.cfg.checkpoint_interval == 150 and box.cfg.checkpoint_count == 8 and 0 or 1) ]] -test:is(run_script(code), 0, "update checkpoint params") +test:is(run_script(code), true, "update checkpoint params") -- -- test wal_max_size option @@ -378,7 +378,7 @@ end cnt2 = #fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog')) os.exit(cnt1 < cnt2 - 8 and 0 or 1) ]] -test:is(run_script(code), 0, "wal_max_size xlog rotation") +test:is(run_script(code), true, "wal_max_size xlog rotation") -- -- gh-2872 bootstrap is aborted if vinyl_dir contains vylog files @@ -422,7 +422,7 @@ ok = ok and not pcall(s.insert, s, {1}) ok = ok and pcall(s.select, s) os.exit(ok and 0 or 1) ]], cfg) -test:is(run_script(code), 0, "wal_mode none -> vinyl DDL/DML is not supported") +test:is(run_script(code), true, "wal_mode none -> vinyl DDL/DML is not supported") fio.rmtree(dir) -- @@ -441,13 +441,13 @@ instance_uuid = tostring(require('uuid').new()) box.cfg{instance_uuid = instance_uuid} os.exit(instance_uuid == box.info.uuid and 0 or 1) ]] -test:is(run_script(code), 0, "check instance_uuid") +test:is(run_script(code), true, "check instance_uuid") code = [[ replicaset_uuid = tostring(require('uuid').new()) box.cfg{replicaset_uuid = replicaset_uuid} os.exit(replicaset_uuid == box.info.cluster.uuid and 0 or 1) ]] -test:is(run_script(code), 0, "check replicaset_uuid") +test:is(run_script(code), true, "check replicaset_uuid") -- -- Configuration fails on instance or replica set UUID mismatch. @@ -498,7 +498,7 @@ unix_socket:close() os.remove(path) os.exit(res) ]] -test:is(run_script(code), 0, "unix socket syslog log configuration") +test:is(run_script(code), true, "unix socket syslog log configuration") -- -- Check syslog remote configuration @@ -540,7 +540,7 @@ end sc:close() os.exit(res) ]] -test:is(run_script(code), 0, "remote syslog log configuration") +test:is(run_script(code), true, "remote syslog log configuration") -- -- gh-3615: check that log_nonblock is not lost @@ -563,7 +563,7 @@ unix_socket:close() os.remove(path) os.exit(0) ]] -test:is(run_script(code), 0, "log_nonblock") +test:is(run_script(code), true, "log_nonblock") -- -- Crash (instead of panic) when trying to recover a huge tuple. @@ -580,7 +580,7 @@ code2 = string.format([[ box.cfg{wal_dir = '%s', memtx_dir = '%s', memtx_max_tuple_size = 10 * 1024} os.exit(0) ]], dir, dir) -test:is(run_script(code1), 0, "create huge tuple") +test:is(run_script(code1), true, "create huge tuple") test:is(run_script(code2), PANIC, "panic on huge tuple recovery") fio.rmtree(dir) diff --git a/test/wal_off/rtree_benchmark.result b/test/wal_off/rtree_benchmark.result index 8e01c9f2a..bdcf98b5d 100644 --- a/test/wal_off/rtree_benchmark.result +++ b/test/wal_off/rtree_benchmark.result @@ -1,59 +1,67 @@ +-- test-run result file version 2 n_records = 10000 ---- -... + | --- + | ... n_iterations = 10000 ---- -... + | --- + | ... n_neighbors = 10 ---- -... + | --- + | ... env = require('test_run') ---- -... + | --- + | ... test_run = env.new() ---- -... + | --- + | ... + file = io.open("rtree_benchmark.res", "w") ---- -... + | --- + | ... + s = box.schema.space.create('rtreebench') ---- -... + | --- + | ... _ = s:create_index('primary') ---- -... + | --- + | ... _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}}) ---- -... -file:write(" *** 2D *** \n") ---- -- true -... + | --- + | ... + +file:write(" *** 2D *** \n") ~= nil; + | --- + | - true + | ... rect_width = 180 / math.pow(n_records, 1 / 2) ---- -... + | --- + | ... + start = os.time() ---- -... + | --- + | ... + test_run:cmd("setopt delimiter ';'") ---- -- true -... + | --- + | - true + | ... for i = 1, n_records do s:insert{i,{180*math.random(),180*math.random()}} end; ---- -... -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); ---- -- true -... + | --- + | ... + +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; + | --- + | - true + | ... + start = os.time(); ---- -... + | --- + | ... n = 0; ---- -... + | --- + | ... for i = 1, n_iterations do x = (180 - rect_width) * math.random() y = (180 - rect_width) * math.random() @@ -61,15 +69,16 @@ for i = 1, n_iterations do n = n + 1 end end; ---- -... -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); ---- -- true -... + | --- + | ... +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; + | --- + | - true + | ... + start = os.time(); ---- -... + | --- + | ... n = 0 for i = 1, n_iterations do x = 180 * math.random() @@ -78,45 +87,54 @@ for i = 1, n_iterations do n = n + 1 end end; ---- -... -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); ---- -- true -... + | --- + | ... +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; + | --- + | - true + | ... + start = os.time(); ---- -... + | --- + | ... for i = 1, n_records do s:delete{i} end; ---- -... -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); ---- -- true -... + | --- + | ... +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; + | --- + | - true + | ... + s:drop(); ---- -... + | --- + | ... + dimension = 8; ---- -... + | --- + | ... + s = box.schema.space.create('rtreebench'); ---- -... + | --- + | ... _ = s:create_index('primary'); ---- -... + | --- + | ... _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}, dimension = dimension}); ---- -... -file:write(" *** 8D *** \n") + | --- + | ... + +file:write(" *** 8D *** \n") ~= nil; + | --- + | - true + | ... rect_width = 180 / math.pow(n_records, 1 / dimension) start = os.time(); ---- -... + | --- + | ... + for i = 1, n_records do local record = {} for j = 1, dimension do @@ -124,18 +142,20 @@ for i = 1, n_records do end s:insert{i,record} end; ---- -... -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); ---- -- true -... + | --- + | ... + +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; + | --- + | - true + | ... + start = os.time(); ---- -... + | --- + | ... n = 0; ---- -... + | --- + | ... for i = 1, n_iterations do local rect = {} for j = 1, dimension do @@ -148,15 +168,16 @@ for i = 1, n_iterations do n = n + 1 end end; ---- -... -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); ---- -- true -... + | --- + | ... +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; + | --- + | - true + | ... + start = os.time(); ---- -... + | --- + | ... n = 0 for i = 1, 0 do local rect = {} @@ -167,32 +188,38 @@ for i = 1, 0 do n = n + 1 end end; ---- -... -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); ---- -- true -... + | --- + | ... +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; + | --- + | - true + | ... + start = os.time(); ---- -... + | --- + | ... for i = 1, n_records do s:delete{i} end; ---- -... -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); ---- -- true -... + | --- + | ... +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; + | --- + | - true + | ... + s:drop(); ---- -... + | --- + | ... + file:close(); ---- -- true -... + | --- + | - true + | ... + test_run:cmd("setopt delimiter ''"); ---- -- true -... + | --- + | - true + | ... + + diff --git a/test/wal_off/rtree_benchmark.test.lua b/test/wal_off/rtree_benchmark.test.lua index 6fae977c9..aa58624d1 100644 --- a/test/wal_off/rtree_benchmark.test.lua +++ b/test/wal_off/rtree_benchmark.test.lua @@ -10,7 +10,7 @@ s = box.schema.space.create('rtreebench') _ = s:create_index('primary') _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}}) -file:write(" *** 2D *** \n") +file:write(" *** 2D *** \n") ~= nil; rect_width = 180 / math.pow(n_records, 1 / 2) start = os.time() @@ -20,7 +20,7 @@ for i = 1, n_records do s:insert{i,{180*math.random(),180*math.random()}} end; -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; start = os.time(); n = 0; @@ -31,7 +31,7 @@ for i = 1, n_iterations do n = n + 1 end end; -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; start = os.time(); n = 0 @@ -42,13 +42,13 @@ for i = 1, n_iterations do n = n + 1 end end; -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; start = os.time(); for i = 1, n_records do s:delete{i} end; -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; s:drop(); @@ -58,7 +58,7 @@ s = box.schema.space.create('rtreebench'); _ = s:create_index('primary'); _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}, dimension = dimension}); -file:write(" *** 8D *** \n") +file:write(" *** 8D *** \n") ~= nil; rect_width = 180 / math.pow(n_records, 1 / dimension) start = os.time(); @@ -71,7 +71,7 @@ for i = 1, n_records do s:insert{i,record} end; -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; start = os.time(); n = 0; @@ -87,7 +87,7 @@ for i = 1, n_iterations do n = n + 1 end end; -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; start = os.time(); n = 0 @@ -100,13 +100,13 @@ for i = 1, 0 do n = n + 1 end end; -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; start = os.time(); for i = 1, n_records do s:delete{i} end; -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; s:drop(); diff --git a/test/wal_off/snapshot_stress.result b/test/wal_off/snapshot_stress.result index 29cea8c04..f9f17441d 100644 --- a/test/wal_off/snapshot_stress.result +++ b/test/wal_off/snapshot_stress.result @@ -1,174 +1,186 @@ +-- test-run result file version 2 -- The test emulates account system. There are increasing number or accounts -- and a lot of double entry transactions are made that moving random -- ammount from random account to another random accont. -- Snapshots are made every snapshot_interval seconds and then checked for consistency env = require('test_run') ---- -... + | --- + | ... test_run = env.new() ---- -... + | --- + | ... -- Settings: You may increase theese value to make test longer -- number of worker fibers: workers_count = 80 ---- -... + | --- + | ... -- number of iterations per fiber (operations + add new account + add space) iteration_count = 8 ---- -... + | --- + | ... -- number of operations per iterations operation_count = 8 ---- -... + | --- + | ... -- limit of random string length in every account string_max_size = 128 ---- -... + | --- + | ... -- initial number of accounts accounts_start = 5 ---- -... + | --- + | ... -- delay between snapshots snapshot_interval = 0.005 ---- -... + | --- + | ... + fiber = require('fiber') ---- -... + | --- + | ... fio = require('fio') ---- -... + | --- + | ... log = require('log') ---- -... + | --- + | ... + tarantool_bin_path = arg[-1] ---- -... + | --- + | ... work_dir = fio.cwd() ---- -... + | --- + | ... script_path = fio.pathjoin(work_dir, 'snap_script.lua') ---- -... + | --- + | ... cmd_template = [[/bin/sh -c 'cd "%s" && "%s" ./snap_script.lua 2> /dev/null']] ---- -... + | --- + | ... cmd = string.format(cmd_template, work_dir, tarantool_bin_path) ---- -... + | --- + | ... + open_flags = {'O_CREAT', 'O_WRONLY', 'O_TRUNC'} ---- -... + | --- + | ... script = fio.open(script_path, open_flags, tonumber('0777', 8)) ---- -... + | --- + | ... script:write("os.exit(-1)") ---- -- true -... + | --- + | - true + | ... script:close() ---- -- true -... + | --- + | - true + | ... res = os.execute(cmd) ---- -... + | --- + | ... str_res = 'precheck ' .. (res ~= 0 and ' ok(1)' or 'failed(1)') ---- -... + | --- + | ... str_res ---- -- precheck ok(1) -... + | --- + | - precheck ok(1) + | ... + script = fio.open(script_path, open_flags, tonumber('0777', 8)) ---- -... + | --- + | ... script:write("os.exit(0)") ---- -- true -... + | --- + | - true + | ... script:close() ---- -- true -... + | --- + | - true + | ... res = os.execute(cmd) ---- -... -str_res = 'precheck ' .. (res == 0 and ' ok(2)' or 'failed(2)') ---- -... + | --- + | ... +str_res = 'precheck ' .. (res == true and ' ok(2)' or 'failed(2)') + | --- + | ... str_res ---- -- precheck ok(2) -... + | --- + | - precheck ok(2) + | ... + snap_search_wildcard = fio.pathjoin(box.cfg.memtx_dir, '*.snap'); ---- -... + | --- + | ... snaps = fio.glob(snap_search_wildcard); ---- -... + | --- + | ... initial_snap_count = #snaps ---- -... + | --- + | ... + if box.space.accounts then box.space.accounts:drop() end ---- -... + | --- + | ... if box.space.operations then box.space.operations:drop() end ---- -... + | --- + | ... if box.space.deleting then box.space.deleting:drop() end ---- -... + | --- + | ... + s1 = box.schema.create_space("accounts") ---- -... + | --- + | ... i1 = s1:create_index('primary', { type = 'HASH', parts = {1, 'unsigned'} }) ---- -... + | --- + | ... s2 = box.schema.create_space("operations") ---- -... + | --- + | ... i2 = s2:create_index('primary', { type = 'HASH', parts = {1, 'unsigned'} }) ---- -... + | --- + | ... s3 = box.schema.create_space("deleting") ---- -... + | --- + | ... i3 = s3:create_index('primary', { type = 'TREE', parts = {1, 'unsigned'} }) ---- -... + | --- + | ... + n_accs = 0 ---- -... + | --- + | ... n_ops = 0 ---- -... + | --- + | ... n_spaces = 0 ---- -... + | --- + | ... workers_done = 0 ---- -... + | --- + | ... + test_run:cmd("setopt delimiter ';'") ---- -- true -... + | --- + | - true + | ... garbage = {}; ---- -... + | --- + | ... str = "" for i = 1,string_max_size do str = str .. '-' garbage[i - 1] = str end; ---- -... + | --- + | ... + function get_new_space_name() n_spaces = n_spaces + 1 return "test" .. tostring(n_spaces - 1) end; ---- -... + | --- + | ... + tmp = get_new_space_name() if box.space[tmp] then box.space[tmp]:drop() tmp = get_new_space_name() end tmp = nil @@ -177,45 +189,53 @@ n_spaces = 0 function get_rnd_acc() return math.floor(math.random() * n_accs) end; ---- -... + | --- + | ... + function get_rnd_val() return math.floor(math.random() * 10) end; ---- -... + | --- + | ... + function get_rnd_str() return garbage[math.floor(math.random() * string_max_size)] end; ---- -... + | --- + | ... + additional_spaces = { }; ---- -... + | --- + | ... + function add_space() local tmp_space = box.schema.create_space(get_new_space_name()) table.insert(additional_spaces, tmp_space) tmp_space:create_index('test') n_spaces = n_spaces + 1 end; ---- -... + | --- + | ... + function add_acc() s1:insert{n_accs, 0} n_accs = n_accs + 1 end; ---- -... + | --- + | ... + function add_op(n1, n2, v) s2:insert{n_ops, n1, n2, v} n_ops = n_ops + 1 end; ---- -... + | --- + | ... + function acc_add(n, v) s1:update({n}, {{'+', 2, v}, {'=', 3, get_rnd_str()}}) end; ---- -... + | --- + | ... + function do_op(n1, n2, v) box.begin() add_op(n1, n2, v) @@ -223,18 +243,21 @@ function do_op(n1, n2, v) acc_add(n2, -v) box.commit() end; ---- -... + | --- + | ... + function do_rand_op() do_op(get_rnd_acc(), get_rnd_acc(), get_rnd_val()) end; ---- -... + | --- + | ... + function remove_smth() s3:delete{i3:min()[1]} end; ---- -... + | --- + | ... + function init() for i = 1,accounts_start do add_acc() @@ -243,8 +266,9 @@ function init() s3:auto_increment{"I hate dentists!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"} end end; ---- -... + | --- + | ... + function work_itr() for j = 1,operation_count do do_rand_op() @@ -254,8 +278,9 @@ function work_itr() remove_smth() add_space() end; ---- -... + | --- + | ... + function work() for i = 1,iteration_count do if not pcall(work_itr) then @@ -265,11 +290,12 @@ function work() end workers_done = workers_done + 1 end; ---- -... + | --- + | ... + snaps_done = false; ---- -... + | --- + | ... function snaps() while (workers_done ~= workers_count) do pcall(box.snapshot) @@ -277,55 +303,63 @@ function snaps() end snaps_done = true end; ---- -... + | --- + | ... + function wait() while (not snaps_done) do fiber.sleep(0.01) end end; ---- -... + | --- + | ... + init(); ---- -... + | --- + | ... + log.info('Part I: creating snapshot start'); ---- -... + | --- + | ... + for i = 1,workers_count do fiber.create(work) end; ---- -... + | --- + | ... local tmp_fib = fiber.create(snaps); ---- -... + | --- + | ... wait(); ---- -... + | --- + | ... + log.info('Part I: creating snapshot done'); ---- -... + | --- + | ... + #s1:select{}; ---- -- 645 -... + | --- + | - 645 + | ... #s2:select{}; ---- -- 5120 -... + | --- + | - 5120 + | ... + s1:drop(); ---- -... + | --- + | ... s2:drop(); ---- -... + | --- + | ... for k,v in pairs(additional_spaces) do v:drop() end; ---- -... + | --- + | ... s1 = nil s2 = nil additional_spaces = nil; ---- -... + | --- + | ... + script_code = [[ fio = require'fio' new_snap_dir = "]] .. fio.pathjoin(box.cfg.memtx_dir, "snap_test") .. [[" @@ -358,28 +392,29 @@ log.info('success: snapshot is ok') os.execute("rm -r " .. new_snap_dir) os.exit(0) ]]; ---- -... + | --- + | ... script = fio.open(script_path, open_flags, tonumber('0777', 8)) script:write(script_code) script:close() log.info('Part II: checking snapshot start'); ---- -... + | --- + | ... + snaps = fio.glob(snap_search_wildcard); ---- -... + | --- + | ... snaps_find_status = #snaps <= initial_snap_count and 'where are my snapshots?' or 'snaps found'; ---- -... + | --- + | ... snaps_find_status; ---- -- snaps found -... + | --- + | - snaps found + | ... snapshot_check_failed = false while #snaps > initial_snap_count do - if not snapshot_check_failed and os.execute(cmd) ~= 0 then + if not snapshot_check_failed and os.execute(cmd) == nil then snapshot_check_failed = true end max_snap = nil @@ -398,16 +433,20 @@ while #snaps > initial_snap_count do fio.unlink(max_vylog) snaps[max_snap_k] = nil end; ---- -... + | --- + | ... snapshot_check_failed; ---- -- false -... + | --- + | - false + | ... + log.info('Part II: checking snapshot done'); ---- -... + | --- + | ... + test_run:cmd("setopt delimiter ''"); ---- -- true -... + | --- + | - true + | ... + + diff --git a/test/wal_off/snapshot_stress.test.lua b/test/wal_off/snapshot_stress.test.lua index 34b3e7b78..715da9eca 100644 --- a/test/wal_off/snapshot_stress.test.lua +++ b/test/wal_off/snapshot_stress.test.lua @@ -40,7 +40,7 @@ script = fio.open(script_path, open_flags, tonumber('0777', 8)) script:write("os.exit(0)") script:close() res = os.execute(cmd) -str_res = 'precheck ' .. (res == 0 and ' ok(2)' or 'failed(2)') +str_res = 'precheck ' .. (res == true and ' ok(2)' or 'failed(2)') str_res snap_search_wildcard = fio.pathjoin(box.cfg.memtx_dir, '*.snap'); @@ -237,7 +237,7 @@ snaps_find_status = #snaps <= initial_snap_count and 'where are my snapshots?' o snaps_find_status; snapshot_check_failed = false while #snaps > initial_snap_count do - if not snapshot_check_failed and os.execute(cmd) ~= 0 then + if not snapshot_check_failed and os.execute(cmd) == nil then snapshot_check_failed = true end max_snap = nil -- 2.20.1 (Apple Git-117) ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Tarantool-patches] [PATCH 1/2] lua: turn on lua 5.2 compatibility 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 1/2] lua: turn on lua " Olga Arkhangelskaia @ 2019-11-16 13:47 ` Igor Munkin 2019-11-19 9:33 ` Olga Arkhangelskaia 0 siblings, 1 reply; 6+ messages in thread From: Igor Munkin @ 2019-11-16 13:47 UTC (permalink / raw) To: Olga Arkhangelskaia; +Cc: tarantool-patches Olya, Thanks for the patch. It proves once again, that we can't just build Tarantool with enabled LUAJIT_ENABLE_LUA52COMPAT. Thereby we can't apply these changes to 1.10.x / 2.x due to possible users code breakage. As discussed offline, let's introduce a specific build flag to our LJ fork. LUAJIT_ENABLE_PAIRSMM flag is designed to enable only __pairs and __ipairs metamethods. There are also several related issues in our Github queue (tarantool gh-4560 is the most recent one), thus this flag will help us to deliver the frequently requested feature. On 07.11.19, Olga Arkhangelskaia wrote: > Enabling features that might slightly break existing code (os.execute, > etc). Done via -DLUAJIT_ENABLE_LUA52COMPAT flag. Now we need to be more > attentive with returning values, methametods and etc. > --- > cmake/luajit.cmake | 1 + > extra/dist/tarantoolctl.in | 2 +- > test/app-tap/debug.test.lua | 4 +- > test/app-tap/tarantoolctl.test.lua | 80 ++--- > test/box-tap/cfg.test.lua | 46 +-- > test/wal_off/rtree_benchmark.result | 255 +++++++++------- > test/wal_off/rtree_benchmark.test.lua | 20 +- > test/wal_off/snapshot_stress.result | 415 ++++++++++++++------------ > test/wal_off/snapshot_stress.test.lua | 4 +- > 9 files changed, 450 insertions(+), 377 deletions(-) > > diff --git a/cmake/luajit.cmake b/cmake/luajit.cmake > index 10df633d5..3157c35ac 100644 > --- a/cmake/luajit.cmake > +++ b/cmake/luajit.cmake > @@ -217,6 +217,7 @@ macro(luajit_build) > add_definitions(-DLUAJIT_USE_ASAN=1) > set (luajit_ldflags ${luajit_ldflags} -fsanitize=address) > endif() > + add_definitions(-DLUAJIT_ENABLE_LUA52COMPAT=1) > add_definitions(-DLUAJIT_SMART_STRINGS=1) > # Add all COMPILE_DEFINITIONS to xcflags > get_property(defs DIRECTORY PROPERTY COMPILE_DEFINITIONS) > diff --git a/extra/dist/tarantoolctl.in b/extra/dist/tarantoolctl.in > index 6daf866ac..e8c9ff164 100755 > --- a/extra/dist/tarantoolctl.in > +++ b/extra/dist/tarantoolctl.in > @@ -309,7 +309,7 @@ local function under_systemd() > if not usermode then > local rv = os.execute("systemctl 2>/dev/null | grep '\\-\\.mount' " .. > "1>/dev/null 2>/dev/null") > - if rv == 0 then > + if rv == true then > return true > end > end > diff --git a/test/app-tap/debug.test.lua b/test/app-tap/debug.test.lua > index 0d199e55b..eee932acc 100755 > --- a/test/app-tap/debug.test.lua > +++ b/test/app-tap/debug.test.lua > @@ -61,7 +61,7 @@ for _, test in ipairs(tests) do > local cmd = string.format('%s -e "%s; os.exit(0)"', TNTBIN, test) > print('Exec: '..cmd) > io.flush() > - assert(os.execute(cmd) == 0, string.format('cmd: "%s" must execute successfully', cmd)) > + assert(os.execute(cmd) == true, string.format('cmd: "%s" must execute successfully', cmd)) > end > > local fio = require('fio') > @@ -87,7 +87,7 @@ for _, test in ipairs(tests) do > file:close() > print('Source: '..test) > io.flush() > - assert(os.execute(cmd) == 0, string.format('cmd: "%s" must execute successfully', cmd)) > + assert(os.execute(cmd) == true, string.format('cmd: "%s" must execute successfully', cmd)) > end > > os.remove(filename) > diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua > index f38820805..ea780fe07 100755 > --- a/test/app-tap/tarantoolctl.test.lua > +++ b/test/app-tap/tarantoolctl.test.lua > @@ -84,10 +84,10 @@ local function run_command(dir, command) > local fstderr = fio.pathjoin(dir, 'stderr-' .. suffix) > local line = [[/bin/sh -c 'cd "%s" && %s >"%s" 2>"%s"']] > line = line:format(dir, command, fstdout, fstderr) > - local res = os.execute(line) > + local res, exit, status = os.execute(line) > local fstdout_e, fstderr_e = io.open(fstdout):read('*a'), io.open(fstderr):read('*a') > fio.unlink(fstdout); fio.unlink(fstderr); > - return res/256, fstdout_e, fstderr_e > + return res, status, fstdout_e, fstderr_e > end > > local function tctl_wait_start(dir, name) > @@ -133,13 +133,19 @@ local function tctl_command(dir, cmd, args, name) > return run_command(dir, command) > end > > -local function check_ok(test, dir, cmd, args, e_res, e_stdout, e_stderr) > - local res, stdout, stderr = tctl_command(dir, cmd, args) > +local FAIL = nil > +local SUCCESS = true > + > +local function check_ok(test, dir, cmd, args, e_res, e_status, e_stdout, e_stderr) > + local res, status, stdout, stderr = tctl_command(dir, cmd, args) > stdout, stderr = stdout or '', stderr or '' > local ares = true > if (e_res ~= nil) then > local val = test:is(res, e_res, ("check '%s' command status for '%s'"):format(cmd,args)) > ares = ares and val > + else > + local val = test:is(status, e_status, ("check '%s' command status for '%s'"):format(cmd,args)) > + ares = ares and val > end > if e_stdout ~= nil then > local val = test:is(res, e_res, ("check '%s' stdout for '%s'"):format(cmd,args)) > @@ -190,17 +196,17 @@ do > local status, err = pcall(function() > test:test("basic test", function(test_i) > test_i:plan(18) > - check_ok(test_i, dir, 'start', 'delayed_box_cfg', 0, nil, "Starting instance") > - check_ok(test_i, dir, 'start', 'script', 0, nil, "Starting instance") > + check_ok(test_i, dir, 'start', 'delayed_box_cfg', SUCCESS, 0, nil, "Starting instance") > + check_ok(test_i, dir, 'start', 'script', SUCCESS, 0, nil, "Starting instance") > tctl_wait_start(dir, 'script') > - check_ok(test_i, dir, 'status', 'script', 0, nil, "is running") > - check_ok(test_i, dir, 'start', 'script', 1, nil, "is already running") > - check_ok(test_i, dir, 'status', 'script', 0, nil, "is running") > - check_ok(test_i, dir, 'stop', 'script', 0, nil, "Stopping") > + check_ok(test_i, dir, 'status', 'script', SUCCESS, 0, nil, "is running") > + check_ok(test_i, dir, 'start', 'script', FAIL, 1, nil, "is already running") > + check_ok(test_i, dir, 'status', 'script', SUCCESS, 0, nil, "is running") > + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0, nil, "Stopping") > tctl_wait_stop(dir, 'script') > - check_ok(test_i, dir, 'status', 'script', 1, nil, "is stopped") > - check_ok(test_i, dir, 'stop', 'script', 0, nil, "is not running") > - check_ok(test_i, dir, 'status', 'script', 1, nil, "is stopped" ) > + check_ok(test_i, dir, 'status', 'script', FAIL, 1, nil, "is stopped") > + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0, nil, "is not running") > + check_ok(test_i, dir, 'status', 'script', FAIL, 1, nil, "is stopped" ) > end) > end) > > @@ -225,16 +231,16 @@ do > local status, err = pcall(function() > test:test("basic test for bad script", function(test_i) > test_i:plan(7) > - check_ok(test_i, dir, 'start', 'script', 1, nil, > + check_ok(test_i, dir, 'start', 'script', FAIL, 1, nil, > 'Instance script is not found') > - check_ok(test_i, dir, 'start', 'bad_script', 1, nil, > + check_ok(test_i, dir, 'start', 'bad_script', FAIL,1, nil, > 'unexpected symbol near') > - check_ok(test_i, dir, 'start', 'good_script', 0) > + check_ok(test_i, dir, 'start', 'good_script', SUCCESS, 0) > tctl_wait_start(dir, 'good_script') > -- wait here > - check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', 3, > + check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', FAIL, 3, > nil, nil) > - check_ok(test_i, dir, 'stop', 'good_script', 0) > + check_ok(test_i, dir, 'stop', 'good_script', SUCCESS, 0) > end) > end) > > @@ -261,13 +267,13 @@ do > local status, err = pcall(function() > test:test("check answers in case of call", function(test_i) > test_i:plan(5) > - check_ok(test_i, dir, 'start', 'good_script', 0) > + check_ok(test_i, dir, 'start', 'good_script', SUCCESS, 0) > tctl_wait_start(dir, 'good_script') > - check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', 3, > + check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', FAIL, 3, > nil, nil) > - check_ok(test_i, dir, 'eval', 'good_script ok_script.lua', 0, > + check_ok(test_i, dir, 'eval', 'good_script ok_script.lua', SUCCESS, 0, > '---\n- 1\n...', nil) > - check_ok(test_i, dir, 'stop', 'good_script', 0) > + check_ok(test_i, dir, 'stop', 'good_script', SUCCESS, 0) > end) > end) > > @@ -290,21 +296,21 @@ do > 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") > + check_ok(test_i, dir, 'enter', 'script', FAIL, 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) > + check_ok(test_i, dir, 'start', 'script', SUCCESS, 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) > + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0) > tctl_wait_stop(dir, 'script') > 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") > + check_ok(test_i, dir, 'enter', 'script', FAIL, 1, nil, "Can't connect to") > fio.unlink(console_sock) > end) > end) > @@ -325,7 +331,7 @@ do > local function test_help(test, dir, cmd, e_stderr) > local desc = dir and 'with config' or 'without config' > dir = dir or './' > - local res, stdout, stderr = run_command(dir, cmd) > + local res, status, stdout, stderr = run_command(dir, cmd) > if e_stderr ~= nil then > if not test:ok(stderr:find(e_stderr), ("check stderr of '%s' %s"):format(cmd, desc)) then > print(("Expected to find '%s' in '%s'"):format(e_stderr, stderr)) > @@ -380,8 +386,8 @@ do > local command_base = 'tarantoolctl cat filler/00000000000000000000.xlog' > local desc = args and "cat + " .. args or "cat" > args = args and " " .. args or "" > - local res, stdout, stderr = run_command(dir, command_base .. args) > - test:is(res, 0, desc .. " result") > + local res, status, stdout, stderr = run_command(dir, command_base .. args) > + test:is(res, SUCCESS, desc .. " result") > test:is(select(2, stdout:gsub(delim, delim)), lc, desc .. " line count") > end > > @@ -389,15 +395,15 @@ do > local command_base = 'tarantoolctl cat filler/00000000000000000000.snap' > local desc = args and "cat + " .. args or "cat" > args = args and " " .. args or "" > - local res, stdout, stderr = run_command(dir, command_base .. args) > - test:is(res, 0, desc .. " result") > + local res, status, stdout, stderr = run_command(dir, command_base .. args) > + test:is(res, SUCCESS, desc .. " result") > test:is(select(2, stdout:gsub(delim, delim)), lc, desc .. " line count") > end > > local status, err = pcall(function() > test:test("fill and test cat output", function(test_i) > test_i:plan(29) > - check_ok(test_i, dir, 'start', 'filler', 0) > + check_ok(test_i, dir, 'start', 'filler', SUCCESS, 0) > check_ctlcat_xlog(test_i, dir, nil, "---\n", 7) > check_ctlcat_xlog(test_i, dir, "--space=512", "---\n", 6) > check_ctlcat_xlog(test_i, dir, "--space=666", "---\n", 0) > @@ -470,14 +476,14 @@ else > local status, err = pcall(function() > test:test("fill and test play output", function(test_i) > test_i:plan(6) > - check_ok(test_i, dir, 'start', 'filler', 0) > + check_ok(test_i, dir, 'start', 'filler', SUCCESS, 0) > local lsn_before = test_run:get_lsn("remote", 1) > test_i:is(lsn_before, 4, "check lsn before") > - local res, stdout, stderr = run_command(dir, command_base) > - test_i:is(res, 0, "execution result") > + local res, status, stdout, stderr = run_command(dir, command_base) > + test_i:is(res, SUCCESS, "execution result") > test_i:is(test_run:get_lsn("remote", 1), 10, "check lsn after") > - local res, stdout, stderr = run_command(dir, command_base) > - test_i:is(res, 0, "execution result") > + local res, status, stdout, stderr = run_command(dir, command_base) > + test_i:is(res, SUCCESS, "execution result") > test_i:is(test_run:get_lsn("remote", 1), 16, "check lsn after") > end) > end) > diff --git a/test/box-tap/cfg.test.lua b/test/box-tap/cfg.test.lua > index d529447bb..b61073438 100755 > --- a/test/box-tap/cfg.test.lua > +++ b/test/box-tap/cfg.test.lua > @@ -162,7 +162,7 @@ box.cfg({ worker_pool_threads = 1}) > test:is(box.cfg.worker_pool_threads, 1, 'worker_pool_threads') > > local tarantool_bin = arg[-1] > -local PANIC = 256 > +local PANIC = nil > function run_script(code) > local dir = fio.tempdir() > local script_path = fio.pathjoin(dir, 'script.lua') > @@ -182,14 +182,14 @@ code =[[ > box.cfg{vinyl_memory=0} > os.exit(box.cfg.vinyl_memory == 0 and 0 or 1) > ]] > -test:is(run_script(code), 0, "actually set vinyl_memory to 0") > +test:is(run_script(code), true, "actually set vinyl_memory to 0") > > -- gh-715: Cannot switch to/from 'fsync' > code = [[ box.cfg{ log="tarantool.log", log_nonblock = false, wal_mode = 'fsync' }; ]] > -test:is(run_script(code), 0, 'wal_mode fsync') > +test:is(run_script(code), true, 'wal_mode fsync') > > code = [[ box.cfg{ wal_mode = 'fsync' }; box.cfg { wal_mode = 'fsync' }; ]] > -test:is(run_script(code), 0, 'wal_mode fsync -> fsync') > +test:is(run_script(code), true, 'wal_mode fsync -> fsync') > > code = [[ box.cfg{ wal_mode = 'fsync' }; box.cfg { wal_mode = 'none'} ]] > test:is(run_script(code), PANIC, 'wal_mode fsync -> write is not supported') > @@ -204,7 +204,7 @@ test:is(run_script(code), PANIC, 'work_dir is invalid') > > -- gh-2664: vinyl_dir is checked on the first use > code = [[ box.cfg{ vinyl_dir='invalid' } ]] > -test:is(run_script(code), 0, 'vinyl_dir is invalid') > +test:is(run_script(code), true, 'vinyl_dir is invalid') > > code = [[ box.cfg{ memtx_dir='invalid' } ]] > test:is(run_script(code), PANIC, 'snap_dir is invalid') > @@ -217,7 +217,7 @@ code = [[ > box.cfg{log_nonblock = false } > os.exit(box.cfg.log_nonblock == false and 0 or 1) > ]] > -test:is(run_script(code), 0, "log_nonblock new value") > +test:is(run_script(code), true, "log_nonblock new value") > > -- gh-3048: box.cfg must not crash on invalid log configuration > code = [[ box.cfg{ log = '/' } ]] > @@ -265,7 +265,7 @@ local conn = require('net.box').connect('unix/:./tarantool.sock', > if not conn:ping() then os.exit(1) end > os.exit(0) > ]] > -test:is(run_script(code), 0, "wal_mode none and ER_LOADING") > +test:is(run_script(code), true, "wal_mode none and ER_LOADING") > > -- > -- gh-1962: incorrect replication source > @@ -286,13 +286,13 @@ code = [[ > box.cfg{vinyl_page_size = 1 * 1024 * 1024, vinyl_range_size = 2 * 1024 * 1024} > os.exit(0) > ]] > -test:is(run_script(code), 0, "page size less than range") > +test:is(run_script(code), true, "page size less than range") > > code = [[ > box.cfg{vinyl_page_size = 2 * 1024 * 1024, vinyl_range_size = 2 * 1024 * 1024} > os.exit(0) > ]] > -test:is(run_script(code), 0, "page size equal with range") > +test:is(run_script(code), true, "page size equal with range") > > -- test memtx options upgrade > code = [[ > @@ -303,7 +303,7 @@ os.exit(box.cfg.memtx_memory == 214748364 > and box.cfg.memtx_max_tuple_size == 64 * 1024 > and 0 or 1) > ]] > -test:is(run_script(code), 0, "upgrade memtx memory options") > +test:is(run_script(code), true, "upgrade memtx memory options") > > code = [[ > box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 * 1024, > @@ -311,7 +311,7 @@ box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 > memtx_max_tuple_size = 64 * 1024} > os.exit(0) > ]] > -test:is(run_script(code), 0, "equal new and old memtx options") > +test:is(run_script(code), true, "equal new and old memtx options") > > code = [[ > box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 * 1024, > @@ -339,20 +339,20 @@ code = [[ > box.cfg{panic_on_wal_error = true} > os.exit(box.cfg.force_recovery == false and 0 or 1) > ]] > -test:is(run_script(code), 0, "panic_on_wal_error") > +test:is(run_script(code), true, "panic_on_wal_error") > > code = [[ > box.cfg{panic_on_snap_error = false} > os.exit(box.cfg.force_recovery == true and 0 or 1) > ]] > -test:is(run_script(code), 0, "panic_on_snap_error") > +test:is(run_script(code), true, "panic_on_snap_error") > > code = [[ > box.cfg{snapshot_period = 100, snapshot_count = 4} > os.exit(box.cfg.checkpoint_interval == 100 > and box.cfg.checkpoint_count == 4 and 0 or 1) > ]] > -test:is(run_script(code), 0, "setup checkpoint params") > +test:is(run_script(code), true, "setup checkpoint params") > > code = [[ > box.cfg{snapshot_period = 100, snapshot_count = 4} > @@ -360,7 +360,7 @@ box.cfg{snapshot_period = 150, snapshot_count = 8} > os.exit(box.cfg.checkpoint_interval == 150 > and box.cfg.checkpoint_count == 8 and 0 or 1) > ]] > -test:is(run_script(code), 0, "update checkpoint params") > +test:is(run_script(code), true, "update checkpoint params") > > -- > -- test wal_max_size option > @@ -378,7 +378,7 @@ end > cnt2 = #fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog')) > os.exit(cnt1 < cnt2 - 8 and 0 or 1) > ]] > -test:is(run_script(code), 0, "wal_max_size xlog rotation") > +test:is(run_script(code), true, "wal_max_size xlog rotation") > > -- > -- gh-2872 bootstrap is aborted if vinyl_dir contains vylog files > @@ -422,7 +422,7 @@ ok = ok and not pcall(s.insert, s, {1}) > ok = ok and pcall(s.select, s) > os.exit(ok and 0 or 1) > ]], cfg) > -test:is(run_script(code), 0, "wal_mode none -> vinyl DDL/DML is not supported") > +test:is(run_script(code), true, "wal_mode none -> vinyl DDL/DML is not supported") > fio.rmtree(dir) > > -- > @@ -441,13 +441,13 @@ instance_uuid = tostring(require('uuid').new()) > box.cfg{instance_uuid = instance_uuid} > os.exit(instance_uuid == box.info.uuid and 0 or 1) > ]] > -test:is(run_script(code), 0, "check instance_uuid") > +test:is(run_script(code), true, "check instance_uuid") > code = [[ > replicaset_uuid = tostring(require('uuid').new()) > box.cfg{replicaset_uuid = replicaset_uuid} > os.exit(replicaset_uuid == box.info.cluster.uuid and 0 or 1) > ]] > -test:is(run_script(code), 0, "check replicaset_uuid") > +test:is(run_script(code), true, "check replicaset_uuid") > > -- > -- Configuration fails on instance or replica set UUID mismatch. > @@ -498,7 +498,7 @@ unix_socket:close() > os.remove(path) > os.exit(res) > ]] > -test:is(run_script(code), 0, "unix socket syslog log configuration") > +test:is(run_script(code), true, "unix socket syslog log configuration") > > -- > -- Check syslog remote configuration > @@ -540,7 +540,7 @@ end > sc:close() > os.exit(res) > ]] > -test:is(run_script(code), 0, "remote syslog log configuration") > +test:is(run_script(code), true, "remote syslog log configuration") > > -- > -- gh-3615: check that log_nonblock is not lost > @@ -563,7 +563,7 @@ unix_socket:close() > os.remove(path) > os.exit(0) > ]] > -test:is(run_script(code), 0, "log_nonblock") > +test:is(run_script(code), true, "log_nonblock") > > -- > -- Crash (instead of panic) when trying to recover a huge tuple. > @@ -580,7 +580,7 @@ code2 = string.format([[ > box.cfg{wal_dir = '%s', memtx_dir = '%s', memtx_max_tuple_size = 10 * 1024} > os.exit(0) > ]], dir, dir) > -test:is(run_script(code1), 0, "create huge tuple") > +test:is(run_script(code1), true, "create huge tuple") > test:is(run_script(code2), PANIC, "panic on huge tuple recovery") > fio.rmtree(dir) > > diff --git a/test/wal_off/rtree_benchmark.result b/test/wal_off/rtree_benchmark.result > index 8e01c9f2a..bdcf98b5d 100644 > --- a/test/wal_off/rtree_benchmark.result > +++ b/test/wal_off/rtree_benchmark.result > @@ -1,59 +1,67 @@ > +-- test-run result file version 2 > n_records = 10000 > ---- > -... > + | --- > + | ... > n_iterations = 10000 > ---- > -... > + | --- > + | ... > n_neighbors = 10 > ---- > -... > + | --- > + | ... > env = require('test_run') > ---- > -... > + | --- > + | ... > test_run = env.new() > ---- > -... > + | --- > + | ... > + > file = io.open("rtree_benchmark.res", "w") > ---- > -... > + | --- > + | ... > + > s = box.schema.space.create('rtreebench') > ---- > -... > + | --- > + | ... > _ = s:create_index('primary') > ---- > -... > + | --- > + | ... > _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}}) > ---- > -... > -file:write(" *** 2D *** \n") > ---- > -- true > -... > + | --- > + | ... > + > +file:write(" *** 2D *** \n") ~= nil; > + | --- > + | - true > + | ... > rect_width = 180 / math.pow(n_records, 1 / 2) > ---- > -... > + | --- > + | ... > + > start = os.time() > ---- > -... > + | --- > + | ... > + > test_run:cmd("setopt delimiter ';'") > ---- > -- true > -... > + | --- > + | - true > + | ... > for i = 1, n_records do > s:insert{i,{180*math.random(),180*math.random()}} > end; > ---- > -... > -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > + > +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > start = os.time(); > ---- > -... > + | --- > + | ... > n = 0; > ---- > -... > + | --- > + | ... > for i = 1, n_iterations do > x = (180 - rect_width) * math.random() > y = (180 - rect_width) * math.random() > @@ -61,15 +69,16 @@ for i = 1, n_iterations do > n = n + 1 > end > end; > ---- > -... > -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > start = os.time(); > ---- > -... > + | --- > + | ... > n = 0 > for i = 1, n_iterations do > x = 180 * math.random() > @@ -78,45 +87,54 @@ for i = 1, n_iterations do > n = n + 1 > end > end; > ---- > -... > -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > start = os.time(); > ---- > -... > + | --- > + | ... > for i = 1, n_records do > s:delete{i} > end; > ---- > -... > -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > s:drop(); > ---- > -... > + | --- > + | ... > + > dimension = 8; > ---- > -... > + | --- > + | ... > + > s = box.schema.space.create('rtreebench'); > ---- > -... > + | --- > + | ... > _ = s:create_index('primary'); > ---- > -... > + | --- > + | ... > _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}, dimension = dimension}); > ---- > -... > -file:write(" *** 8D *** \n") > + | --- > + | ... > + > +file:write(" *** 8D *** \n") ~= nil; > + | --- > + | - true > + | ... > rect_width = 180 / math.pow(n_records, 1 / dimension) > > start = os.time(); > ---- > -... > + | --- > + | ... > + > for i = 1, n_records do > local record = {} > for j = 1, dimension do > @@ -124,18 +142,20 @@ for i = 1, n_records do > end > s:insert{i,record} > end; > ---- > -... > -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > + > +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > start = os.time(); > ---- > -... > + | --- > + | ... > n = 0; > ---- > -... > + | --- > + | ... > for i = 1, n_iterations do > local rect = {} > for j = 1, dimension do > @@ -148,15 +168,16 @@ for i = 1, n_iterations do > n = n + 1 > end > end; > ---- > -... > -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > start = os.time(); > ---- > -... > + | --- > + | ... > n = 0 > for i = 1, 0 do > local rect = {} > @@ -167,32 +188,38 @@ for i = 1, 0 do > n = n + 1 > end > end; > ---- > -... > -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > start = os.time(); > ---- > -... > + | --- > + | ... > for i = 1, n_records do > s:delete{i} > end; > ---- > -... > -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); > ---- > -- true > -... > + | --- > + | ... > +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; > + | --- > + | - true > + | ... > + > s:drop(); > ---- > -... > + | --- > + | ... > + > file:close(); > ---- > -- true > -... > + | --- > + | - true > + | ... > + > test_run:cmd("setopt delimiter ''"); > ---- > -- true > -... > + | --- > + | - true > + | ... > + > + > diff --git a/test/wal_off/rtree_benchmark.test.lua b/test/wal_off/rtree_benchmark.test.lua > index 6fae977c9..aa58624d1 100644 > --- a/test/wal_off/rtree_benchmark.test.lua > +++ b/test/wal_off/rtree_benchmark.test.lua > @@ -10,7 +10,7 @@ s = box.schema.space.create('rtreebench') > _ = s:create_index('primary') > _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}}) > > -file:write(" *** 2D *** \n") > +file:write(" *** 2D *** \n") ~= nil; > rect_width = 180 / math.pow(n_records, 1 / 2) > > start = os.time() > @@ -20,7 +20,7 @@ for i = 1, n_records do > s:insert{i,{180*math.random(),180*math.random()}} > end; > > -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); > +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; > > start = os.time(); > n = 0; > @@ -31,7 +31,7 @@ for i = 1, n_iterations do > n = n + 1 > end > end; > -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); > +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; > > start = os.time(); > n = 0 > @@ -42,13 +42,13 @@ for i = 1, n_iterations do > n = n + 1 > end > end; > -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); > +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; > > start = os.time(); > for i = 1, n_records do > s:delete{i} > end; > -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); > +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; > > s:drop(); > > @@ -58,7 +58,7 @@ s = box.schema.space.create('rtreebench'); > _ = s:create_index('primary'); > _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}, dimension = dimension}); > > -file:write(" *** 8D *** \n") > +file:write(" *** 8D *** \n") ~= nil; > rect_width = 180 / math.pow(n_records, 1 / dimension) > > start = os.time(); > @@ -71,7 +71,7 @@ for i = 1, n_records do > s:insert{i,record} > end; > > -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); > +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; > > start = os.time(); > n = 0; > @@ -87,7 +87,7 @@ for i = 1, n_iterations do > n = n + 1 > end > end; > -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); > +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; > > start = os.time(); > n = 0 > @@ -100,13 +100,13 @@ for i = 1, 0 do > n = n + 1 > end > end; > -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); > +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; > > start = os.time(); > for i = 1, n_records do > s:delete{i} > end; > -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); > +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; > > s:drop(); > > diff --git a/test/wal_off/snapshot_stress.result b/test/wal_off/snapshot_stress.result > index 29cea8c04..f9f17441d 100644 > --- a/test/wal_off/snapshot_stress.result > +++ b/test/wal_off/snapshot_stress.result > @@ -1,174 +1,186 @@ > +-- test-run result file version 2 > -- The test emulates account system. There are increasing number or accounts > -- and a lot of double entry transactions are made that moving random > -- ammount from random account to another random accont. > -- Snapshots are made every snapshot_interval seconds and then checked for consistency > env = require('test_run') > ---- > -... > + | --- > + | ... > test_run = env.new() > ---- > -... > + | --- > + | ... > -- Settings: You may increase theese value to make test longer > -- number of worker fibers: > workers_count = 80 > ---- > -... > + | --- > + | ... > -- number of iterations per fiber (operations + add new account + add space) > iteration_count = 8 > ---- > -... > + | --- > + | ... > -- number of operations per iterations > operation_count = 8 > ---- > -... > + | --- > + | ... > -- limit of random string length in every account > string_max_size = 128 > ---- > -... > + | --- > + | ... > -- initial number of accounts > accounts_start = 5 > ---- > -... > + | --- > + | ... > -- delay between snapshots > snapshot_interval = 0.005 > ---- > -... > + | --- > + | ... > + > fiber = require('fiber') > ---- > -... > + | --- > + | ... > fio = require('fio') > ---- > -... > + | --- > + | ... > log = require('log') > ---- > -... > + | --- > + | ... > + > tarantool_bin_path = arg[-1] > ---- > -... > + | --- > + | ... > work_dir = fio.cwd() > ---- > -... > + | --- > + | ... > script_path = fio.pathjoin(work_dir, 'snap_script.lua') > ---- > -... > + | --- > + | ... > cmd_template = [[/bin/sh -c 'cd "%s" && "%s" ./snap_script.lua 2> /dev/null']] > ---- > -... > + | --- > + | ... > cmd = string.format(cmd_template, work_dir, tarantool_bin_path) > ---- > -... > + | --- > + | ... > + > open_flags = {'O_CREAT', 'O_WRONLY', 'O_TRUNC'} > ---- > -... > + | --- > + | ... > script = fio.open(script_path, open_flags, tonumber('0777', 8)) > ---- > -... > + | --- > + | ... > script:write("os.exit(-1)") > ---- > -- true > -... > + | --- > + | - true > + | ... > script:close() > ---- > -- true > -... > + | --- > + | - true > + | ... > res = os.execute(cmd) > ---- > -... > + | --- > + | ... > str_res = 'precheck ' .. (res ~= 0 and ' ok(1)' or 'failed(1)') > ---- > -... > + | --- > + | ... > str_res > ---- > -- precheck ok(1) > -... > + | --- > + | - precheck ok(1) > + | ... > + > script = fio.open(script_path, open_flags, tonumber('0777', 8)) > ---- > -... > + | --- > + | ... > script:write("os.exit(0)") > ---- > -- true > -... > + | --- > + | - true > + | ... > script:close() > ---- > -- true > -... > + | --- > + | - true > + | ... > res = os.execute(cmd) > ---- > -... > -str_res = 'precheck ' .. (res == 0 and ' ok(2)' or 'failed(2)') > ---- > -... > + | --- > + | ... > +str_res = 'precheck ' .. (res == true and ' ok(2)' or 'failed(2)') > + | --- > + | ... > str_res > ---- > -- precheck ok(2) > -... > + | --- > + | - precheck ok(2) > + | ... > + > snap_search_wildcard = fio.pathjoin(box.cfg.memtx_dir, '*.snap'); > ---- > -... > + | --- > + | ... > snaps = fio.glob(snap_search_wildcard); > ---- > -... > + | --- > + | ... > initial_snap_count = #snaps > ---- > -... > + | --- > + | ... > + > if box.space.accounts then box.space.accounts:drop() end > ---- > -... > + | --- > + | ... > if box.space.operations then box.space.operations:drop() end > ---- > -... > + | --- > + | ... > if box.space.deleting then box.space.deleting:drop() end > ---- > -... > + | --- > + | ... > + > s1 = box.schema.create_space("accounts") > ---- > -... > + | --- > + | ... > i1 = s1:create_index('primary', { type = 'HASH', parts = {1, 'unsigned'} }) > ---- > -... > + | --- > + | ... > s2 = box.schema.create_space("operations") > ---- > -... > + | --- > + | ... > i2 = s2:create_index('primary', { type = 'HASH', parts = {1, 'unsigned'} }) > ---- > -... > + | --- > + | ... > s3 = box.schema.create_space("deleting") > ---- > -... > + | --- > + | ... > i3 = s3:create_index('primary', { type = 'TREE', parts = {1, 'unsigned'} }) > ---- > -... > + | --- > + | ... > + > n_accs = 0 > ---- > -... > + | --- > + | ... > n_ops = 0 > ---- > -... > + | --- > + | ... > n_spaces = 0 > ---- > -... > + | --- > + | ... > workers_done = 0 > ---- > -... > + | --- > + | ... > + > test_run:cmd("setopt delimiter ';'") > ---- > -- true > -... > + | --- > + | - true > + | ... > garbage = {}; > ---- > -... > + | --- > + | ... > str = "" > for i = 1,string_max_size do > str = str .. '-' garbage[i - 1] = str > end; > ---- > -... > + | --- > + | ... > + > function get_new_space_name() > n_spaces = n_spaces + 1 > return "test" .. tostring(n_spaces - 1) > end; > ---- > -... > + | --- > + | ... > + > tmp = get_new_space_name() > if box.space[tmp] then box.space[tmp]:drop() tmp = get_new_space_name() end > tmp = nil > @@ -177,45 +189,53 @@ n_spaces = 0 > function get_rnd_acc() > return math.floor(math.random() * n_accs) > end; > ---- > -... > + | --- > + | ... > + > function get_rnd_val() > return math.floor(math.random() * 10) > end; > ---- > -... > + | --- > + | ... > + > function get_rnd_str() > return garbage[math.floor(math.random() * string_max_size)] > end; > ---- > -... > + | --- > + | ... > + > additional_spaces = { }; > ---- > -... > + | --- > + | ... > + > function add_space() > local tmp_space = box.schema.create_space(get_new_space_name()) > table.insert(additional_spaces, tmp_space) > tmp_space:create_index('test') > n_spaces = n_spaces + 1 > end; > ---- > -... > + | --- > + | ... > + > function add_acc() > s1:insert{n_accs, 0} n_accs = n_accs + 1 > end; > ---- > -... > + | --- > + | ... > + > function add_op(n1, n2, v) > s2:insert{n_ops, n1, n2, v} > n_ops = n_ops + 1 > end; > ---- > -... > + | --- > + | ... > + > function acc_add(n, v) > s1:update({n}, {{'+', 2, v}, {'=', 3, get_rnd_str()}}) > end; > ---- > -... > + | --- > + | ... > + > function do_op(n1, n2, v) > box.begin() > add_op(n1, n2, v) > @@ -223,18 +243,21 @@ function do_op(n1, n2, v) > acc_add(n2, -v) > box.commit() > end; > ---- > -... > + | --- > + | ... > + > function do_rand_op() > do_op(get_rnd_acc(), get_rnd_acc(), get_rnd_val()) > end; > ---- > -... > + | --- > + | ... > + > function remove_smth() > s3:delete{i3:min()[1]} > end; > ---- > -... > + | --- > + | ... > + > function init() > for i = 1,accounts_start do > add_acc() > @@ -243,8 +266,9 @@ function init() > s3:auto_increment{"I hate dentists!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"} > end > end; > ---- > -... > + | --- > + | ... > + > function work_itr() > for j = 1,operation_count do > do_rand_op() > @@ -254,8 +278,9 @@ function work_itr() > remove_smth() > add_space() > end; > ---- > -... > + | --- > + | ... > + > function work() > for i = 1,iteration_count do > if not pcall(work_itr) then > @@ -265,11 +290,12 @@ function work() > end > workers_done = workers_done + 1 > end; > ---- > -... > + | --- > + | ... > + > snaps_done = false; > ---- > -... > + | --- > + | ... > function snaps() > while (workers_done ~= workers_count) do > pcall(box.snapshot) > @@ -277,55 +303,63 @@ function snaps() > end > snaps_done = true > end; > ---- > -... > + | --- > + | ... > + > function wait() > while (not snaps_done) do > fiber.sleep(0.01) > end > end; > ---- > -... > + | --- > + | ... > + > init(); > ---- > -... > + | --- > + | ... > + > log.info('Part I: creating snapshot start'); > ---- > -... > + | --- > + | ... > + > for i = 1,workers_count do > fiber.create(work) > end; > ---- > -... > + | --- > + | ... > local tmp_fib = fiber.create(snaps); > ---- > -... > + | --- > + | ... > wait(); > ---- > -... > + | --- > + | ... > + > log.info('Part I: creating snapshot done'); > ---- > -... > + | --- > + | ... > + > #s1:select{}; > ---- > -- 645 > -... > + | --- > + | - 645 > + | ... > #s2:select{}; > ---- > -- 5120 > -... > + | --- > + | - 5120 > + | ... > + > s1:drop(); > ---- > -... > + | --- > + | ... > s2:drop(); > ---- > -... > + | --- > + | ... > for k,v in pairs(additional_spaces) do v:drop() end; > ---- > -... > + | --- > + | ... > s1 = nil s2 = nil additional_spaces = nil; > ---- > -... > + | --- > + | ... > + > script_code = [[ > fio = require'fio' > new_snap_dir = "]] .. fio.pathjoin(box.cfg.memtx_dir, "snap_test") .. [[" > @@ -358,28 +392,29 @@ log.info('success: snapshot is ok') > os.execute("rm -r " .. new_snap_dir) > os.exit(0) > ]]; > ---- > -... > + | --- > + | ... > script = fio.open(script_path, open_flags, tonumber('0777', 8)) > script:write(script_code) > script:close() > > log.info('Part II: checking snapshot start'); > ---- > -... > + | --- > + | ... > + > snaps = fio.glob(snap_search_wildcard); > ---- > -... > + | --- > + | ... > snaps_find_status = #snaps <= initial_snap_count and 'where are my snapshots?' or 'snaps found'; > ---- > -... > + | --- > + | ... > snaps_find_status; > ---- > -- snaps found > -... > + | --- > + | - snaps found > + | ... > snapshot_check_failed = false > while #snaps > initial_snap_count do > - if not snapshot_check_failed and os.execute(cmd) ~= 0 then > + if not snapshot_check_failed and os.execute(cmd) == nil then > snapshot_check_failed = true > end > max_snap = nil > @@ -398,16 +433,20 @@ while #snaps > initial_snap_count do > fio.unlink(max_vylog) > snaps[max_snap_k] = nil > end; > ---- > -... > + | --- > + | ... > snapshot_check_failed; > ---- > -- false > -... > + | --- > + | - false > + | ... > + > log.info('Part II: checking snapshot done'); > ---- > -... > + | --- > + | ... > + > test_run:cmd("setopt delimiter ''"); > ---- > -- true > -... > + | --- > + | - true > + | ... > + > + > diff --git a/test/wal_off/snapshot_stress.test.lua b/test/wal_off/snapshot_stress.test.lua > index 34b3e7b78..715da9eca 100644 > --- a/test/wal_off/snapshot_stress.test.lua > +++ b/test/wal_off/snapshot_stress.test.lua > @@ -40,7 +40,7 @@ script = fio.open(script_path, open_flags, tonumber('0777', 8)) > script:write("os.exit(0)") > script:close() > res = os.execute(cmd) > -str_res = 'precheck ' .. (res == 0 and ' ok(2)' or 'failed(2)') > +str_res = 'precheck ' .. (res == true and ' ok(2)' or 'failed(2)') > str_res > > snap_search_wildcard = fio.pathjoin(box.cfg.memtx_dir, '*.snap'); > @@ -237,7 +237,7 @@ snaps_find_status = #snaps <= initial_snap_count and 'where are my snapshots?' o > snaps_find_status; > snapshot_check_failed = false > while #snaps > initial_snap_count do > - if not snapshot_check_failed and os.execute(cmd) ~= 0 then > + if not snapshot_check_failed and os.execute(cmd) == nil then > snapshot_check_failed = true > end > max_snap = nil > -- > 2.20.1 (Apple Git-117) > -- Best regards, IM ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Tarantool-patches] [PATCH 1/2] lua: turn on lua 5.2 compatibility 2019-11-16 13:47 ` Igor Munkin @ 2019-11-19 9:33 ` Olga Arkhangelskaia 0 siblings, 0 replies; 6+ messages in thread From: Olga Arkhangelskaia @ 2019-11-19 9:33 UTC (permalink / raw) To: Igor Munkin; +Cc: tarantool-patches Thanks for the review! I will introduce searate flag to enable some 5.2 feautures that we strongly need. 16.11.2019 16:47, Igor Munkin пишет: > Olya, > > Thanks for the patch. It proves once again, that we can't just build > Tarantool with enabled LUAJIT_ENABLE_LUA52COMPAT. Thereby we can't apply > these changes to 1.10.x / 2.x due to possible users code breakage. > > As discussed offline, let's introduce a specific build flag to our LJ > fork. LUAJIT_ENABLE_PAIRSMM flag is designed to enable only __pairs and > __ipairs metamethods. There are also several related issues in our > Github queue (tarantool gh-4560 is the most recent one), thus this flag > will help us to deliver the frequently requested feature. > > On 07.11.19, Olga Arkhangelskaia wrote: >> Enabling features that might slightly break existing code (os.execute, >> etc). Done via -DLUAJIT_ENABLE_LUA52COMPAT flag. Now we need to be more >> attentive with returning values, methametods and etc. >> --- >> cmake/luajit.cmake | 1 + >> extra/dist/tarantoolctl.in | 2 +- >> test/app-tap/debug.test.lua | 4 +- >> test/app-tap/tarantoolctl.test.lua | 80 ++--- >> test/box-tap/cfg.test.lua | 46 +-- >> test/wal_off/rtree_benchmark.result | 255 +++++++++------- >> test/wal_off/rtree_benchmark.test.lua | 20 +- >> test/wal_off/snapshot_stress.result | 415 ++++++++++++++------------ >> test/wal_off/snapshot_stress.test.lua | 4 +- >> 9 files changed, 450 insertions(+), 377 deletions(-) >> >> diff --git a/cmake/luajit.cmake b/cmake/luajit.cmake >> index 10df633d5..3157c35ac 100644 >> --- a/cmake/luajit.cmake >> +++ b/cmake/luajit.cmake >> @@ -217,6 +217,7 @@ macro(luajit_build) >> add_definitions(-DLUAJIT_USE_ASAN=1) >> set (luajit_ldflags ${luajit_ldflags} -fsanitize=address) >> endif() >> + add_definitions(-DLUAJIT_ENABLE_LUA52COMPAT=1) >> add_definitions(-DLUAJIT_SMART_STRINGS=1) >> # Add all COMPILE_DEFINITIONS to xcflags >> get_property(defs DIRECTORY PROPERTY COMPILE_DEFINITIONS) >> diff --git a/extra/dist/tarantoolctl.in b/extra/dist/tarantoolctl.in >> index 6daf866ac..e8c9ff164 100755 >> --- a/extra/dist/tarantoolctl.in >> +++ b/extra/dist/tarantoolctl.in >> @@ -309,7 +309,7 @@ local function under_systemd() >> if not usermode then >> local rv = os.execute("systemctl 2>/dev/null | grep '\\-\\.mount' " .. >> "1>/dev/null 2>/dev/null") >> - if rv == 0 then >> + if rv == true then >> return true >> end >> end >> diff --git a/test/app-tap/debug.test.lua b/test/app-tap/debug.test.lua >> index 0d199e55b..eee932acc 100755 >> --- a/test/app-tap/debug.test.lua >> +++ b/test/app-tap/debug.test.lua >> @@ -61,7 +61,7 @@ for _, test in ipairs(tests) do >> local cmd = string.format('%s -e "%s; os.exit(0)"', TNTBIN, test) >> print('Exec: '..cmd) >> io.flush() >> - assert(os.execute(cmd) == 0, string.format('cmd: "%s" must execute successfully', cmd)) >> + assert(os.execute(cmd) == true, string.format('cmd: "%s" must execute successfully', cmd)) >> end >> >> local fio = require('fio') >> @@ -87,7 +87,7 @@ for _, test in ipairs(tests) do >> file:close() >> print('Source: '..test) >> io.flush() >> - assert(os.execute(cmd) == 0, string.format('cmd: "%s" must execute successfully', cmd)) >> + assert(os.execute(cmd) == true, string.format('cmd: "%s" must execute successfully', cmd)) >> end >> >> os.remove(filename) >> diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua >> index f38820805..ea780fe07 100755 >> --- a/test/app-tap/tarantoolctl.test.lua >> +++ b/test/app-tap/tarantoolctl.test.lua >> @@ -84,10 +84,10 @@ local function run_command(dir, command) >> local fstderr = fio.pathjoin(dir, 'stderr-' .. suffix) >> local line = [[/bin/sh -c 'cd "%s" && %s >"%s" 2>"%s"']] >> line = line:format(dir, command, fstdout, fstderr) >> - local res = os.execute(line) >> + local res, exit, status = os.execute(line) >> local fstdout_e, fstderr_e = io.open(fstdout):read('*a'), io.open(fstderr):read('*a') >> fio.unlink(fstdout); fio.unlink(fstderr); >> - return res/256, fstdout_e, fstderr_e >> + return res, status, fstdout_e, fstderr_e >> end >> >> local function tctl_wait_start(dir, name) >> @@ -133,13 +133,19 @@ local function tctl_command(dir, cmd, args, name) >> return run_command(dir, command) >> end >> >> -local function check_ok(test, dir, cmd, args, e_res, e_stdout, e_stderr) >> - local res, stdout, stderr = tctl_command(dir, cmd, args) >> +local FAIL = nil >> +local SUCCESS = true >> + >> +local function check_ok(test, dir, cmd, args, e_res, e_status, e_stdout, e_stderr) >> + local res, status, stdout, stderr = tctl_command(dir, cmd, args) >> stdout, stderr = stdout or '', stderr or '' >> local ares = true >> if (e_res ~= nil) then >> local val = test:is(res, e_res, ("check '%s' command status for '%s'"):format(cmd,args)) >> ares = ares and val >> + else >> + local val = test:is(status, e_status, ("check '%s' command status for '%s'"):format(cmd,args)) >> + ares = ares and val >> end >> if e_stdout ~= nil then >> local val = test:is(res, e_res, ("check '%s' stdout for '%s'"):format(cmd,args)) >> @@ -190,17 +196,17 @@ do >> local status, err = pcall(function() >> test:test("basic test", function(test_i) >> test_i:plan(18) >> - check_ok(test_i, dir, 'start', 'delayed_box_cfg', 0, nil, "Starting instance") >> - check_ok(test_i, dir, 'start', 'script', 0, nil, "Starting instance") >> + check_ok(test_i, dir, 'start', 'delayed_box_cfg', SUCCESS, 0, nil, "Starting instance") >> + check_ok(test_i, dir, 'start', 'script', SUCCESS, 0, nil, "Starting instance") >> tctl_wait_start(dir, 'script') >> - check_ok(test_i, dir, 'status', 'script', 0, nil, "is running") >> - check_ok(test_i, dir, 'start', 'script', 1, nil, "is already running") >> - check_ok(test_i, dir, 'status', 'script', 0, nil, "is running") >> - check_ok(test_i, dir, 'stop', 'script', 0, nil, "Stopping") >> + check_ok(test_i, dir, 'status', 'script', SUCCESS, 0, nil, "is running") >> + check_ok(test_i, dir, 'start', 'script', FAIL, 1, nil, "is already running") >> + check_ok(test_i, dir, 'status', 'script', SUCCESS, 0, nil, "is running") >> + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0, nil, "Stopping") >> tctl_wait_stop(dir, 'script') >> - check_ok(test_i, dir, 'status', 'script', 1, nil, "is stopped") >> - check_ok(test_i, dir, 'stop', 'script', 0, nil, "is not running") >> - check_ok(test_i, dir, 'status', 'script', 1, nil, "is stopped" ) >> + check_ok(test_i, dir, 'status', 'script', FAIL, 1, nil, "is stopped") >> + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0, nil, "is not running") >> + check_ok(test_i, dir, 'status', 'script', FAIL, 1, nil, "is stopped" ) >> end) >> end) >> >> @@ -225,16 +231,16 @@ do >> local status, err = pcall(function() >> test:test("basic test for bad script", function(test_i) >> test_i:plan(7) >> - check_ok(test_i, dir, 'start', 'script', 1, nil, >> + check_ok(test_i, dir, 'start', 'script', FAIL, 1, nil, >> 'Instance script is not found') >> - check_ok(test_i, dir, 'start', 'bad_script', 1, nil, >> + check_ok(test_i, dir, 'start', 'bad_script', FAIL,1, nil, >> 'unexpected symbol near') >> - check_ok(test_i, dir, 'start', 'good_script', 0) >> + check_ok(test_i, dir, 'start', 'good_script', SUCCESS, 0) >> tctl_wait_start(dir, 'good_script') >> -- wait here >> - check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', 3, >> + check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', FAIL, 3, >> nil, nil) >> - check_ok(test_i, dir, 'stop', 'good_script', 0) >> + check_ok(test_i, dir, 'stop', 'good_script', SUCCESS, 0) >> end) >> end) >> >> @@ -261,13 +267,13 @@ do >> local status, err = pcall(function() >> test:test("check answers in case of call", function(test_i) >> test_i:plan(5) >> - check_ok(test_i, dir, 'start', 'good_script', 0) >> + check_ok(test_i, dir, 'start', 'good_script', SUCCESS, 0) >> tctl_wait_start(dir, 'good_script') >> - check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', 3, >> + check_ok(test_i, dir, 'eval', 'good_script bad_script.lua', FAIL, 3, >> nil, nil) >> - check_ok(test_i, dir, 'eval', 'good_script ok_script.lua', 0, >> + check_ok(test_i, dir, 'eval', 'good_script ok_script.lua', SUCCESS, 0, >> '---\n- 1\n...', nil) >> - check_ok(test_i, dir, 'stop', 'good_script', 0) >> + check_ok(test_i, dir, 'stop', 'good_script', SUCCESS, 0) >> end) >> end) >> >> @@ -290,21 +296,21 @@ do >> 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") >> + check_ok(test_i, dir, 'enter', 'script', FAIL, 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) >> + check_ok(test_i, dir, 'start', 'script', SUCCESS, 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) >> + check_ok(test_i, dir, 'stop', 'script', SUCCESS, 0) >> tctl_wait_stop(dir, 'script') >> 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") >> + check_ok(test_i, dir, 'enter', 'script', FAIL, 1, nil, "Can't connect to") >> fio.unlink(console_sock) >> end) >> end) >> @@ -325,7 +331,7 @@ do >> local function test_help(test, dir, cmd, e_stderr) >> local desc = dir and 'with config' or 'without config' >> dir = dir or './' >> - local res, stdout, stderr = run_command(dir, cmd) >> + local res, status, stdout, stderr = run_command(dir, cmd) >> if e_stderr ~= nil then >> if not test:ok(stderr:find(e_stderr), ("check stderr of '%s' %s"):format(cmd, desc)) then >> print(("Expected to find '%s' in '%s'"):format(e_stderr, stderr)) >> @@ -380,8 +386,8 @@ do >> local command_base = 'tarantoolctl cat filler/00000000000000000000.xlog' >> local desc = args and "cat + " .. args or "cat" >> args = args and " " .. args or "" >> - local res, stdout, stderr = run_command(dir, command_base .. args) >> - test:is(res, 0, desc .. " result") >> + local res, status, stdout, stderr = run_command(dir, command_base .. args) >> + test:is(res, SUCCESS, desc .. " result") >> test:is(select(2, stdout:gsub(delim, delim)), lc, desc .. " line count") >> end >> >> @@ -389,15 +395,15 @@ do >> local command_base = 'tarantoolctl cat filler/00000000000000000000.snap' >> local desc = args and "cat + " .. args or "cat" >> args = args and " " .. args or "" >> - local res, stdout, stderr = run_command(dir, command_base .. args) >> - test:is(res, 0, desc .. " result") >> + local res, status, stdout, stderr = run_command(dir, command_base .. args) >> + test:is(res, SUCCESS, desc .. " result") >> test:is(select(2, stdout:gsub(delim, delim)), lc, desc .. " line count") >> end >> >> local status, err = pcall(function() >> test:test("fill and test cat output", function(test_i) >> test_i:plan(29) >> - check_ok(test_i, dir, 'start', 'filler', 0) >> + check_ok(test_i, dir, 'start', 'filler', SUCCESS, 0) >> check_ctlcat_xlog(test_i, dir, nil, "---\n", 7) >> check_ctlcat_xlog(test_i, dir, "--space=512", "---\n", 6) >> check_ctlcat_xlog(test_i, dir, "--space=666", "---\n", 0) >> @@ -470,14 +476,14 @@ else >> local status, err = pcall(function() >> test:test("fill and test play output", function(test_i) >> test_i:plan(6) >> - check_ok(test_i, dir, 'start', 'filler', 0) >> + check_ok(test_i, dir, 'start', 'filler', SUCCESS, 0) >> local lsn_before = test_run:get_lsn("remote", 1) >> test_i:is(lsn_before, 4, "check lsn before") >> - local res, stdout, stderr = run_command(dir, command_base) >> - test_i:is(res, 0, "execution result") >> + local res, status, stdout, stderr = run_command(dir, command_base) >> + test_i:is(res, SUCCESS, "execution result") >> test_i:is(test_run:get_lsn("remote", 1), 10, "check lsn after") >> - local res, stdout, stderr = run_command(dir, command_base) >> - test_i:is(res, 0, "execution result") >> + local res, status, stdout, stderr = run_command(dir, command_base) >> + test_i:is(res, SUCCESS, "execution result") >> test_i:is(test_run:get_lsn("remote", 1), 16, "check lsn after") >> end) >> end) >> diff --git a/test/box-tap/cfg.test.lua b/test/box-tap/cfg.test.lua >> index d529447bb..b61073438 100755 >> --- a/test/box-tap/cfg.test.lua >> +++ b/test/box-tap/cfg.test.lua >> @@ -162,7 +162,7 @@ box.cfg({ worker_pool_threads = 1}) >> test:is(box.cfg.worker_pool_threads, 1, 'worker_pool_threads') >> >> local tarantool_bin = arg[-1] >> -local PANIC = 256 >> +local PANIC = nil >> function run_script(code) >> local dir = fio.tempdir() >> local script_path = fio.pathjoin(dir, 'script.lua') >> @@ -182,14 +182,14 @@ code =[[ >> box.cfg{vinyl_memory=0} >> os.exit(box.cfg.vinyl_memory == 0 and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "actually set vinyl_memory to 0") >> +test:is(run_script(code), true, "actually set vinyl_memory to 0") >> >> -- gh-715: Cannot switch to/from 'fsync' >> code = [[ box.cfg{ log="tarantool.log", log_nonblock = false, wal_mode = 'fsync' }; ]] >> -test:is(run_script(code), 0, 'wal_mode fsync') >> +test:is(run_script(code), true, 'wal_mode fsync') >> >> code = [[ box.cfg{ wal_mode = 'fsync' }; box.cfg { wal_mode = 'fsync' }; ]] >> -test:is(run_script(code), 0, 'wal_mode fsync -> fsync') >> +test:is(run_script(code), true, 'wal_mode fsync -> fsync') >> >> code = [[ box.cfg{ wal_mode = 'fsync' }; box.cfg { wal_mode = 'none'} ]] >> test:is(run_script(code), PANIC, 'wal_mode fsync -> write is not supported') >> @@ -204,7 +204,7 @@ test:is(run_script(code), PANIC, 'work_dir is invalid') >> >> -- gh-2664: vinyl_dir is checked on the first use >> code = [[ box.cfg{ vinyl_dir='invalid' } ]] >> -test:is(run_script(code), 0, 'vinyl_dir is invalid') >> +test:is(run_script(code), true, 'vinyl_dir is invalid') >> >> code = [[ box.cfg{ memtx_dir='invalid' } ]] >> test:is(run_script(code), PANIC, 'snap_dir is invalid') >> @@ -217,7 +217,7 @@ code = [[ >> box.cfg{log_nonblock = false } >> os.exit(box.cfg.log_nonblock == false and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "log_nonblock new value") >> +test:is(run_script(code), true, "log_nonblock new value") >> >> -- gh-3048: box.cfg must not crash on invalid log configuration >> code = [[ box.cfg{ log = '/' } ]] >> @@ -265,7 +265,7 @@ local conn = require('net.box').connect('unix/:./tarantool.sock', >> if not conn:ping() then os.exit(1) end >> os.exit(0) >> ]] >> -test:is(run_script(code), 0, "wal_mode none and ER_LOADING") >> +test:is(run_script(code), true, "wal_mode none and ER_LOADING") >> >> -- >> -- gh-1962: incorrect replication source >> @@ -286,13 +286,13 @@ code = [[ >> box.cfg{vinyl_page_size = 1 * 1024 * 1024, vinyl_range_size = 2 * 1024 * 1024} >> os.exit(0) >> ]] >> -test:is(run_script(code), 0, "page size less than range") >> +test:is(run_script(code), true, "page size less than range") >> >> code = [[ >> box.cfg{vinyl_page_size = 2 * 1024 * 1024, vinyl_range_size = 2 * 1024 * 1024} >> os.exit(0) >> ]] >> -test:is(run_script(code), 0, "page size equal with range") >> +test:is(run_script(code), true, "page size equal with range") >> >> -- test memtx options upgrade >> code = [[ >> @@ -303,7 +303,7 @@ os.exit(box.cfg.memtx_memory == 214748364 >> and box.cfg.memtx_max_tuple_size == 64 * 1024 >> and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "upgrade memtx memory options") >> +test:is(run_script(code), true, "upgrade memtx memory options") >> >> code = [[ >> box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 * 1024, >> @@ -311,7 +311,7 @@ box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 >> memtx_max_tuple_size = 64 * 1024} >> os.exit(0) >> ]] >> -test:is(run_script(code), 0, "equal new and old memtx options") >> +test:is(run_script(code), true, "equal new and old memtx options") >> >> code = [[ >> box.cfg{slab_alloc_arena = 0.2, slab_alloc_minimal = 16, slab_alloc_maximal = 64 * 1024, >> @@ -339,20 +339,20 @@ code = [[ >> box.cfg{panic_on_wal_error = true} >> os.exit(box.cfg.force_recovery == false and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "panic_on_wal_error") >> +test:is(run_script(code), true, "panic_on_wal_error") >> >> code = [[ >> box.cfg{panic_on_snap_error = false} >> os.exit(box.cfg.force_recovery == true and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "panic_on_snap_error") >> +test:is(run_script(code), true, "panic_on_snap_error") >> >> code = [[ >> box.cfg{snapshot_period = 100, snapshot_count = 4} >> os.exit(box.cfg.checkpoint_interval == 100 >> and box.cfg.checkpoint_count == 4 and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "setup checkpoint params") >> +test:is(run_script(code), true, "setup checkpoint params") >> >> code = [[ >> box.cfg{snapshot_period = 100, snapshot_count = 4} >> @@ -360,7 +360,7 @@ box.cfg{snapshot_period = 150, snapshot_count = 8} >> os.exit(box.cfg.checkpoint_interval == 150 >> and box.cfg.checkpoint_count == 8 and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "update checkpoint params") >> +test:is(run_script(code), true, "update checkpoint params") >> >> -- >> -- test wal_max_size option >> @@ -378,7 +378,7 @@ end >> cnt2 = #fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog')) >> os.exit(cnt1 < cnt2 - 8 and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "wal_max_size xlog rotation") >> +test:is(run_script(code), true, "wal_max_size xlog rotation") >> >> -- >> -- gh-2872 bootstrap is aborted if vinyl_dir contains vylog files >> @@ -422,7 +422,7 @@ ok = ok and not pcall(s.insert, s, {1}) >> ok = ok and pcall(s.select, s) >> os.exit(ok and 0 or 1) >> ]], cfg) >> -test:is(run_script(code), 0, "wal_mode none -> vinyl DDL/DML is not supported") >> +test:is(run_script(code), true, "wal_mode none -> vinyl DDL/DML is not supported") >> fio.rmtree(dir) >> >> -- >> @@ -441,13 +441,13 @@ instance_uuid = tostring(require('uuid').new()) >> box.cfg{instance_uuid = instance_uuid} >> os.exit(instance_uuid == box.info.uuid and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "check instance_uuid") >> +test:is(run_script(code), true, "check instance_uuid") >> code = [[ >> replicaset_uuid = tostring(require('uuid').new()) >> box.cfg{replicaset_uuid = replicaset_uuid} >> os.exit(replicaset_uuid == box.info.cluster.uuid and 0 or 1) >> ]] >> -test:is(run_script(code), 0, "check replicaset_uuid") >> +test:is(run_script(code), true, "check replicaset_uuid") >> >> -- >> -- Configuration fails on instance or replica set UUID mismatch. >> @@ -498,7 +498,7 @@ unix_socket:close() >> os.remove(path) >> os.exit(res) >> ]] >> -test:is(run_script(code), 0, "unix socket syslog log configuration") >> +test:is(run_script(code), true, "unix socket syslog log configuration") >> >> -- >> -- Check syslog remote configuration >> @@ -540,7 +540,7 @@ end >> sc:close() >> os.exit(res) >> ]] >> -test:is(run_script(code), 0, "remote syslog log configuration") >> +test:is(run_script(code), true, "remote syslog log configuration") >> >> -- >> -- gh-3615: check that log_nonblock is not lost >> @@ -563,7 +563,7 @@ unix_socket:close() >> os.remove(path) >> os.exit(0) >> ]] >> -test:is(run_script(code), 0, "log_nonblock") >> +test:is(run_script(code), true, "log_nonblock") >> >> -- >> -- Crash (instead of panic) when trying to recover a huge tuple. >> @@ -580,7 +580,7 @@ code2 = string.format([[ >> box.cfg{wal_dir = '%s', memtx_dir = '%s', memtx_max_tuple_size = 10 * 1024} >> os.exit(0) >> ]], dir, dir) >> -test:is(run_script(code1), 0, "create huge tuple") >> +test:is(run_script(code1), true, "create huge tuple") >> test:is(run_script(code2), PANIC, "panic on huge tuple recovery") >> fio.rmtree(dir) >> >> diff --git a/test/wal_off/rtree_benchmark.result b/test/wal_off/rtree_benchmark.result >> index 8e01c9f2a..bdcf98b5d 100644 >> --- a/test/wal_off/rtree_benchmark.result >> +++ b/test/wal_off/rtree_benchmark.result >> @@ -1,59 +1,67 @@ >> +-- test-run result file version 2 >> n_records = 10000 >> ---- >> -... >> + | --- >> + | ... >> n_iterations = 10000 >> ---- >> -... >> + | --- >> + | ... >> n_neighbors = 10 >> ---- >> -... >> + | --- >> + | ... >> env = require('test_run') >> ---- >> -... >> + | --- >> + | ... >> test_run = env.new() >> ---- >> -... >> + | --- >> + | ... >> + >> file = io.open("rtree_benchmark.res", "w") >> ---- >> -... >> + | --- >> + | ... >> + >> s = box.schema.space.create('rtreebench') >> ---- >> -... >> + | --- >> + | ... >> _ = s:create_index('primary') >> ---- >> -... >> + | --- >> + | ... >> _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}}) >> ---- >> -... >> -file:write(" *** 2D *** \n") >> ---- >> -- true >> -... >> + | --- >> + | ... >> + >> +file:write(" *** 2D *** \n") ~= nil; >> + | --- >> + | - true >> + | ... >> rect_width = 180 / math.pow(n_records, 1 / 2) >> ---- >> -... >> + | --- >> + | ... >> + >> start = os.time() >> ---- >> -... >> + | --- >> + | ... >> + >> test_run:cmd("setopt delimiter ';'") >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> for i = 1, n_records do >> s:insert{i,{180*math.random(),180*math.random()}} >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> + >> +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> start = os.time(); >> ---- >> -... >> + | --- >> + | ... >> n = 0; >> ---- >> -... >> + | --- >> + | ... >> for i = 1, n_iterations do >> x = (180 - rect_width) * math.random() >> y = (180 - rect_width) * math.random() >> @@ -61,15 +69,16 @@ for i = 1, n_iterations do >> n = n + 1 >> end >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> start = os.time(); >> ---- >> -... >> + | --- >> + | ... >> n = 0 >> for i = 1, n_iterations do >> x = 180 * math.random() >> @@ -78,45 +87,54 @@ for i = 1, n_iterations do >> n = n + 1 >> end >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> start = os.time(); >> ---- >> -... >> + | --- >> + | ... >> for i = 1, n_records do >> s:delete{i} >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> s:drop(); >> ---- >> -... >> + | --- >> + | ... >> + >> dimension = 8; >> ---- >> -... >> + | --- >> + | ... >> + >> s = box.schema.space.create('rtreebench'); >> ---- >> -... >> + | --- >> + | ... >> _ = s:create_index('primary'); >> ---- >> -... >> + | --- >> + | ... >> _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}, dimension = dimension}); >> ---- >> -... >> -file:write(" *** 8D *** \n") >> + | --- >> + | ... >> + >> +file:write(" *** 8D *** \n") ~= nil; >> + | --- >> + | - true >> + | ... >> rect_width = 180 / math.pow(n_records, 1 / dimension) >> >> start = os.time(); >> ---- >> -... >> + | --- >> + | ... >> + >> for i = 1, n_records do >> local record = {} >> for j = 1, dimension do >> @@ -124,18 +142,20 @@ for i = 1, n_records do >> end >> s:insert{i,record} >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> + >> +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> start = os.time(); >> ---- >> -... >> + | --- >> + | ... >> n = 0; >> ---- >> -... >> + | --- >> + | ... >> for i = 1, n_iterations do >> local rect = {} >> for j = 1, dimension do >> @@ -148,15 +168,16 @@ for i = 1, n_iterations do >> n = n + 1 >> end >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> start = os.time(); >> ---- >> -... >> + | --- >> + | ... >> n = 0 >> for i = 1, 0 do >> local rect = {} >> @@ -167,32 +188,38 @@ for i = 1, 0 do >> n = n + 1 >> end >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> start = os.time(); >> ---- >> -... >> + | --- >> + | ... >> for i = 1, n_records do >> s:delete{i} >> end; >> ---- >> -... >> -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); >> ---- >> -- true >> -... >> + | --- >> + | ... >> +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> + | --- >> + | - true >> + | ... >> + >> s:drop(); >> ---- >> -... >> + | --- >> + | ... >> + >> file:close(); >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> + >> test_run:cmd("setopt delimiter ''"); >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> + >> + >> diff --git a/test/wal_off/rtree_benchmark.test.lua b/test/wal_off/rtree_benchmark.test.lua >> index 6fae977c9..aa58624d1 100644 >> --- a/test/wal_off/rtree_benchmark.test.lua >> +++ b/test/wal_off/rtree_benchmark.test.lua >> @@ -10,7 +10,7 @@ s = box.schema.space.create('rtreebench') >> _ = s:create_index('primary') >> _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}}) >> >> -file:write(" *** 2D *** \n") >> +file:write(" *** 2D *** \n") ~= nil; >> rect_width = 180 / math.pow(n_records, 1 / 2) >> >> start = os.time() >> @@ -20,7 +20,7 @@ for i = 1, n_records do >> s:insert{i,{180*math.random(),180*math.random()}} >> end; >> >> -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); >> +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> >> start = os.time(); >> n = 0; >> @@ -31,7 +31,7 @@ for i = 1, n_iterations do >> n = n + 1 >> end >> end; >> -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); >> +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; >> >> start = os.time(); >> n = 0 >> @@ -42,13 +42,13 @@ for i = 1, n_iterations do >> n = n + 1 >> end >> end; >> -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); >> +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; >> >> start = os.time(); >> for i = 1, n_records do >> s:delete{i} >> end; >> -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); >> +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> >> s:drop(); >> >> @@ -58,7 +58,7 @@ s = box.schema.space.create('rtreebench'); >> _ = s:create_index('primary'); >> _ = s:create_index('spatial', { type = 'rtree', unique = false, parts = {2, 'array'}, dimension = dimension}); >> >> -file:write(" *** 8D *** \n") >> +file:write(" *** 8D *** \n") ~= nil; >> rect_width = 180 / math.pow(n_records, 1 / dimension) >> >> start = os.time(); >> @@ -71,7 +71,7 @@ for i = 1, n_records do >> s:insert{i,record} >> end; >> >> -file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)); >> +file:write(string.format("Elapsed time for inserting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> >> start = os.time(); >> n = 0; >> @@ -87,7 +87,7 @@ for i = 1, n_iterations do >> n = n + 1 >> end >> end; >> -file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)); >> +file:write(string.format("Elapsed time for %d belongs searches selecting %d records: %d\n", n_iterations, n, os.time() - start)) ~= nil; >> >> start = os.time(); >> n = 0 >> @@ -100,13 +100,13 @@ for i = 1, 0 do >> n = n + 1 >> end >> end; >> -file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)); >> +file:write(string.format("Elapsed time for %d nearest %d neighbors searches selecting %d records: %d\n", n_iterations, n_neighbors, n, os.time() - start)) ~= nil; >> >> start = os.time(); >> for i = 1, n_records do >> s:delete{i} >> end; >> -file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)); >> +file:write(string.format("Elapsed time for deleting %d records: %d\n", n_records, os.time() - start)) ~= nil; >> >> s:drop(); >> >> diff --git a/test/wal_off/snapshot_stress.result b/test/wal_off/snapshot_stress.result >> index 29cea8c04..f9f17441d 100644 >> --- a/test/wal_off/snapshot_stress.result >> +++ b/test/wal_off/snapshot_stress.result >> @@ -1,174 +1,186 @@ >> +-- test-run result file version 2 >> -- The test emulates account system. There are increasing number or accounts >> -- and a lot of double entry transactions are made that moving random >> -- ammount from random account to another random accont. >> -- Snapshots are made every snapshot_interval seconds and then checked for consistency >> env = require('test_run') >> ---- >> -... >> + | --- >> + | ... >> test_run = env.new() >> ---- >> -... >> + | --- >> + | ... >> -- Settings: You may increase theese value to make test longer >> -- number of worker fibers: >> workers_count = 80 >> ---- >> -... >> + | --- >> + | ... >> -- number of iterations per fiber (operations + add new account + add space) >> iteration_count = 8 >> ---- >> -... >> + | --- >> + | ... >> -- number of operations per iterations >> operation_count = 8 >> ---- >> -... >> + | --- >> + | ... >> -- limit of random string length in every account >> string_max_size = 128 >> ---- >> -... >> + | --- >> + | ... >> -- initial number of accounts >> accounts_start = 5 >> ---- >> -... >> + | --- >> + | ... >> -- delay between snapshots >> snapshot_interval = 0.005 >> ---- >> -... >> + | --- >> + | ... >> + >> fiber = require('fiber') >> ---- >> -... >> + | --- >> + | ... >> fio = require('fio') >> ---- >> -... >> + | --- >> + | ... >> log = require('log') >> ---- >> -... >> + | --- >> + | ... >> + >> tarantool_bin_path = arg[-1] >> ---- >> -... >> + | --- >> + | ... >> work_dir = fio.cwd() >> ---- >> -... >> + | --- >> + | ... >> script_path = fio.pathjoin(work_dir, 'snap_script.lua') >> ---- >> -... >> + | --- >> + | ... >> cmd_template = [[/bin/sh -c 'cd "%s" && "%s" ./snap_script.lua 2> /dev/null']] >> ---- >> -... >> + | --- >> + | ... >> cmd = string.format(cmd_template, work_dir, tarantool_bin_path) >> ---- >> -... >> + | --- >> + | ... >> + >> open_flags = {'O_CREAT', 'O_WRONLY', 'O_TRUNC'} >> ---- >> -... >> + | --- >> + | ... >> script = fio.open(script_path, open_flags, tonumber('0777', 8)) >> ---- >> -... >> + | --- >> + | ... >> script:write("os.exit(-1)") >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> script:close() >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> res = os.execute(cmd) >> ---- >> -... >> + | --- >> + | ... >> str_res = 'precheck ' .. (res ~= 0 and ' ok(1)' or 'failed(1)') >> ---- >> -... >> + | --- >> + | ... >> str_res >> ---- >> -- precheck ok(1) >> -... >> + | --- >> + | - precheck ok(1) >> + | ... >> + >> script = fio.open(script_path, open_flags, tonumber('0777', 8)) >> ---- >> -... >> + | --- >> + | ... >> script:write("os.exit(0)") >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> script:close() >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> res = os.execute(cmd) >> ---- >> -... >> -str_res = 'precheck ' .. (res == 0 and ' ok(2)' or 'failed(2)') >> ---- >> -... >> + | --- >> + | ... >> +str_res = 'precheck ' .. (res == true and ' ok(2)' or 'failed(2)') >> + | --- >> + | ... >> str_res >> ---- >> -- precheck ok(2) >> -... >> + | --- >> + | - precheck ok(2) >> + | ... >> + >> snap_search_wildcard = fio.pathjoin(box.cfg.memtx_dir, '*.snap'); >> ---- >> -... >> + | --- >> + | ... >> snaps = fio.glob(snap_search_wildcard); >> ---- >> -... >> + | --- >> + | ... >> initial_snap_count = #snaps >> ---- >> -... >> + | --- >> + | ... >> + >> if box.space.accounts then box.space.accounts:drop() end >> ---- >> -... >> + | --- >> + | ... >> if box.space.operations then box.space.operations:drop() end >> ---- >> -... >> + | --- >> + | ... >> if box.space.deleting then box.space.deleting:drop() end >> ---- >> -... >> + | --- >> + | ... >> + >> s1 = box.schema.create_space("accounts") >> ---- >> -... >> + | --- >> + | ... >> i1 = s1:create_index('primary', { type = 'HASH', parts = {1, 'unsigned'} }) >> ---- >> -... >> + | --- >> + | ... >> s2 = box.schema.create_space("operations") >> ---- >> -... >> + | --- >> + | ... >> i2 = s2:create_index('primary', { type = 'HASH', parts = {1, 'unsigned'} }) >> ---- >> -... >> + | --- >> + | ... >> s3 = box.schema.create_space("deleting") >> ---- >> -... >> + | --- >> + | ... >> i3 = s3:create_index('primary', { type = 'TREE', parts = {1, 'unsigned'} }) >> ---- >> -... >> + | --- >> + | ... >> + >> n_accs = 0 >> ---- >> -... >> + | --- >> + | ... >> n_ops = 0 >> ---- >> -... >> + | --- >> + | ... >> n_spaces = 0 >> ---- >> -... >> + | --- >> + | ... >> workers_done = 0 >> ---- >> -... >> + | --- >> + | ... >> + >> test_run:cmd("setopt delimiter ';'") >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> garbage = {}; >> ---- >> -... >> + | --- >> + | ... >> str = "" >> for i = 1,string_max_size do >> str = str .. '-' garbage[i - 1] = str >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function get_new_space_name() >> n_spaces = n_spaces + 1 >> return "test" .. tostring(n_spaces - 1) >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> tmp = get_new_space_name() >> if box.space[tmp] then box.space[tmp]:drop() tmp = get_new_space_name() end >> tmp = nil >> @@ -177,45 +189,53 @@ n_spaces = 0 >> function get_rnd_acc() >> return math.floor(math.random() * n_accs) >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function get_rnd_val() >> return math.floor(math.random() * 10) >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function get_rnd_str() >> return garbage[math.floor(math.random() * string_max_size)] >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> additional_spaces = { }; >> ---- >> -... >> + | --- >> + | ... >> + >> function add_space() >> local tmp_space = box.schema.create_space(get_new_space_name()) >> table.insert(additional_spaces, tmp_space) >> tmp_space:create_index('test') >> n_spaces = n_spaces + 1 >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function add_acc() >> s1:insert{n_accs, 0} n_accs = n_accs + 1 >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function add_op(n1, n2, v) >> s2:insert{n_ops, n1, n2, v} >> n_ops = n_ops + 1 >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function acc_add(n, v) >> s1:update({n}, {{'+', 2, v}, {'=', 3, get_rnd_str()}}) >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function do_op(n1, n2, v) >> box.begin() >> add_op(n1, n2, v) >> @@ -223,18 +243,21 @@ function do_op(n1, n2, v) >> acc_add(n2, -v) >> box.commit() >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function do_rand_op() >> do_op(get_rnd_acc(), get_rnd_acc(), get_rnd_val()) >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function remove_smth() >> s3:delete{i3:min()[1]} >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function init() >> for i = 1,accounts_start do >> add_acc() >> @@ -243,8 +266,9 @@ function init() >> s3:auto_increment{"I hate dentists!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"} >> end >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function work_itr() >> for j = 1,operation_count do >> do_rand_op() >> @@ -254,8 +278,9 @@ function work_itr() >> remove_smth() >> add_space() >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function work() >> for i = 1,iteration_count do >> if not pcall(work_itr) then >> @@ -265,11 +290,12 @@ function work() >> end >> workers_done = workers_done + 1 >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> snaps_done = false; >> ---- >> -... >> + | --- >> + | ... >> function snaps() >> while (workers_done ~= workers_count) do >> pcall(box.snapshot) >> @@ -277,55 +303,63 @@ function snaps() >> end >> snaps_done = true >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> function wait() >> while (not snaps_done) do >> fiber.sleep(0.01) >> end >> end; >> ---- >> -... >> + | --- >> + | ... >> + >> init(); >> ---- >> -... >> + | --- >> + | ... >> + >> log.info('Part I: creating snapshot start'); >> ---- >> -... >> + | --- >> + | ... >> + >> for i = 1,workers_count do >> fiber.create(work) >> end; >> ---- >> -... >> + | --- >> + | ... >> local tmp_fib = fiber.create(snaps); >> ---- >> -... >> + | --- >> + | ... >> wait(); >> ---- >> -... >> + | --- >> + | ... >> + >> log.info('Part I: creating snapshot done'); >> ---- >> -... >> + | --- >> + | ... >> + >> #s1:select{}; >> ---- >> -- 645 >> -... >> + | --- >> + | - 645 >> + | ... >> #s2:select{}; >> ---- >> -- 5120 >> -... >> + | --- >> + | - 5120 >> + | ... >> + >> s1:drop(); >> ---- >> -... >> + | --- >> + | ... >> s2:drop(); >> ---- >> -... >> + | --- >> + | ... >> for k,v in pairs(additional_spaces) do v:drop() end; >> ---- >> -... >> + | --- >> + | ... >> s1 = nil s2 = nil additional_spaces = nil; >> ---- >> -... >> + | --- >> + | ... >> + >> script_code = [[ >> fio = require'fio' >> new_snap_dir = "]] .. fio.pathjoin(box.cfg.memtx_dir, "snap_test") .. [[" >> @@ -358,28 +392,29 @@ log.info('success: snapshot is ok') >> os.execute("rm -r " .. new_snap_dir) >> os.exit(0) >> ]]; >> ---- >> -... >> + | --- >> + | ... >> script = fio.open(script_path, open_flags, tonumber('0777', 8)) >> script:write(script_code) >> script:close() >> >> log.info('Part II: checking snapshot start'); >> ---- >> -... >> + | --- >> + | ... >> + >> snaps = fio.glob(snap_search_wildcard); >> ---- >> -... >> + | --- >> + | ... >> snaps_find_status = #snaps <= initial_snap_count and 'where are my snapshots?' or 'snaps found'; >> ---- >> -... >> + | --- >> + | ... >> snaps_find_status; >> ---- >> -- snaps found >> -... >> + | --- >> + | - snaps found >> + | ... >> snapshot_check_failed = false >> while #snaps > initial_snap_count do >> - if not snapshot_check_failed and os.execute(cmd) ~= 0 then >> + if not snapshot_check_failed and os.execute(cmd) == nil then >> snapshot_check_failed = true >> end >> max_snap = nil >> @@ -398,16 +433,20 @@ while #snaps > initial_snap_count do >> fio.unlink(max_vylog) >> snaps[max_snap_k] = nil >> end; >> ---- >> -... >> + | --- >> + | ... >> snapshot_check_failed; >> ---- >> -- false >> -... >> + | --- >> + | - false >> + | ... >> + >> log.info('Part II: checking snapshot done'); >> ---- >> -... >> + | --- >> + | ... >> + >> test_run:cmd("setopt delimiter ''"); >> ---- >> -- true >> -... >> + | --- >> + | - true >> + | ... >> + >> + >> diff --git a/test/wal_off/snapshot_stress.test.lua b/test/wal_off/snapshot_stress.test.lua >> index 34b3e7b78..715da9eca 100644 >> --- a/test/wal_off/snapshot_stress.test.lua >> +++ b/test/wal_off/snapshot_stress.test.lua >> @@ -40,7 +40,7 @@ script = fio.open(script_path, open_flags, tonumber('0777', 8)) >> script:write("os.exit(0)") >> script:close() >> res = os.execute(cmd) >> -str_res = 'precheck ' .. (res == 0 and ' ok(2)' or 'failed(2)') >> +str_res = 'precheck ' .. (res == true and ' ok(2)' or 'failed(2)') >> str_res >> >> snap_search_wildcard = fio.pathjoin(box.cfg.memtx_dir, '*.snap'); >> @@ -237,7 +237,7 @@ snaps_find_status = #snaps <= initial_snap_count and 'where are my snapshots?' o >> snaps_find_status; >> snapshot_check_failed = false >> while #snaps > initial_snap_count do >> - if not snapshot_check_failed and os.execute(cmd) ~= 0 then >> + if not snapshot_check_failed and os.execute(cmd) == nil then >> snapshot_check_failed = true >> end >> max_snap = nil >> -- >> 2.20.1 (Apple Git-117) >> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Tarantool-patches] [PATCH 2/2] box: raise on raw modifications of box.cfg values 2019-11-07 14:03 [Tarantool-patches] [PATCH rfc 0/2] Lua 5.2 compatibility Olga Arkhangelskaia 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 1/2] lua: turn on lua " Olga Arkhangelskaia @ 2019-11-07 14:03 ` Olga Arkhangelskaia 2019-11-17 18:56 ` Igor Munkin 1 sibling, 1 reply; 6+ messages in thread From: Olga Arkhangelskaia @ 2019-11-07 14:03 UTC (permalink / raw) To: tarantool-patches Prior this patch there was a possibility to change values throw the raw table modification, like box.cfg.log_level = , or box.cfg["log_level"] = . Now we store cfg values in separate table, how ever the behaviour stays the same. Closes #2867 --- src/box/lua/load_cfg.lua | 18 +++++++++++-- test/box-tap/cfg.test.lua | 14 +++++++++- test/box/cfg.result | 55 +++++++++++++++++++++++++++++++++++++++ test/box/cfg.test.lua | 3 +++ 4 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua index 85617c8f0..602bf92c5 100644 --- a/src/box/lua/load_cfg.lua +++ b/src/box/lua/load_cfg.lua @@ -533,13 +533,27 @@ local function load_cfg(cfg) end setmetatable(box, nil) box_configured = nil - box.cfg = setmetatable(cfg, + box.cfg = {} + local actual = cfg + box.cfg = setmetatable({}, { __newindex = function(table, index) error('Attempt to modify a read-only table') end, __call = locked(reload_cfg), - }) + __index = function (self, k) + return actual[k] + end, + __serialize = function() return actual end, + + __pairs = function(self) + local function iter(actual, k) + local v + return next(actual, k) + end + return iter, actual, nil + end + }) private.cfg_load() for key, fun in pairs(dynamic_cfg) do local val = cfg[key] diff --git a/test/box-tap/cfg.test.lua b/test/box-tap/cfg.test.lua index b61073438..b76f28893 100755 --- a/test/box-tap/cfg.test.lua +++ b/test/box-tap/cfg.test.lua @@ -6,7 +6,7 @@ local socket = require('socket') local fio = require('fio') local uuid = require('uuid') local msgpack = require('msgpack') -test:plan(104) +test:plan(106) -------------------------------------------------------------------------------- -- Invalid values @@ -592,6 +592,18 @@ box.cfg{read_only=true} ]] test:is(run_script(code), PANIC, "panic on bootstrapping a read-only instance as master") +-- +-- gf-2867 raise on raw modifications of box.cfg values +-- +code = [[ +box.cfg{} +box.cfg.read_only = true +]] +test:is(run_script(code), PANIC, "attempt to modify a read-only table") +code = [[ +box.cfg["read_only"] = true +]] +test:is(run_script(code), PANIC, "attempt to modify a read-only table") test:check() os.exit(0) diff --git a/test/box/cfg.result b/test/box/cfg.result index 5370bb870..9031e1480 100644 --- a/test/box/cfg.result +++ b/test/box/cfg.result @@ -236,6 +236,61 @@ box.cfg{replication = {}} | --- | ... +cfg = {} + | --- + | ... +for k, v in pairs(box.cfg) do table.insert(cfg, k) end + | --- + | ... +cfg + | --- + | - - pid_file + | - checkpoint_count + | - feedback_host + | - readahead + | - log_level + | - checkpoint_interval + | - vinyl_page_size + | - coredump + | - replication_sync_lag + | - replication_timeout + | - wal_dir_rescan_delay + | - vinyl_memory + | - replication_skip_conflict + | - strip_core + | - feedback_enabled + | - wal_max_size + | - too_long_threshold + | - memtx_memory + | - log + | - background + | - vinyl_dir + | - vinyl_cache + | - vinyl_read_threads + | - vinyl_bloom_fpr + | - vinyl_timeout + | - net_msg_max + | - listen + | - force_recovery + | - vinyl_max_tuple_size + | - vinyl_run_count_per_level + | - hot_standby + | - log_format + | - memtx_max_tuple_size + | - memtx_min_tuple_size + | - feedback_interval + | - vinyl_write_threads + | - wal_mode + | - worker_pool_threads + | - vinyl_run_size_ratio + | - read_only + | - memtx_dir + | - wal_dir + | - slab_alloc_factor + | - checkpoint_wal_threshold + | - replication_connect_timeout + | - replication_sync_timeout + | ... -------------------------------------------------------------------------------- -- Test of hierarchical cfg type check -------------------------------------------------------------------------------- diff --git a/test/box/cfg.test.lua b/test/box/cfg.test.lua index 56ccb6767..275737e7a 100644 --- a/test/box/cfg.test.lua +++ b/test/box/cfg.test.lua @@ -19,6 +19,9 @@ box.cfg{coredump = 'true'} box.cfg{replication = {}} box.cfg{replication = {}} +cfg = {} +for k, v in pairs(box.cfg) do table.insert(cfg, k) end +cfg -------------------------------------------------------------------------------- -- Test of hierarchical cfg type check -------------------------------------------------------------------------------- -- 2.20.1 (Apple Git-117) ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Tarantool-patches] [PATCH 2/2] box: raise on raw modifications of box.cfg values 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 2/2] box: raise on raw modifications of box.cfg values Olga Arkhangelskaia @ 2019-11-17 18:56 ` Igor Munkin 0 siblings, 0 replies; 6+ messages in thread From: Igor Munkin @ 2019-11-17 18:56 UTC (permalink / raw) To: Olga Arkhangelskaia; +Cc: tarantool-patches Olya, Thanks for the patch, it looks similar to the one, proposed by Mons some time ago. However, I look forward to the patchset to be made within tarantool gh-4521 to see whether it can be applied here. Nevertheless, I left several comments below, please consider them. On 07.11.19, Olga Arkhangelskaia wrote: > Prior this patch there was a possibility to change values throw > the raw table modification, like box.cfg.log_level = , or > box.cfg["log_level"] = . Now we store cfg values in separate table, > how ever the behaviour stays the same. > > Closes #2867 > --- > src/box/lua/load_cfg.lua | 18 +++++++++++-- > test/box-tap/cfg.test.lua | 14 +++++++++- > test/box/cfg.result | 55 +++++++++++++++++++++++++++++++++++++++ > test/box/cfg.test.lua | 3 +++ > 4 files changed, 87 insertions(+), 3 deletions(-) > > diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua > index 85617c8f0..602bf92c5 100644 > --- a/src/box/lua/load_cfg.lua > +++ b/src/box/lua/load_cfg.lua > @@ -533,13 +533,27 @@ local function load_cfg(cfg) > end > setmetatable(box, nil) > box_configured = nil > - box.cfg = setmetatable(cfg, > + box.cfg = {} This assignment is an excess one, box.cfg is initialized with a new empty table few lines below via setmetatable. > + local actual = cfg > + box.cfg = setmetatable({}, > { > __newindex = function(table, index) > error('Attempt to modify a read-only table') > end, > __call = locked(reload_cfg), > - }) > + __index = function (self, k) > + return actual[k] > + end, > + __serialize = function() return actual end, > + > + __pairs = function(self) > + local function iter(actual, k) > + local v This variable is an excess one. > + return next(actual, k) > + end > + return iter, actual, nil > + end > + }) > private.cfg_load() > for key, fun in pairs(dynamic_cfg) do > local val = cfg[key] > diff --git a/test/box-tap/cfg.test.lua b/test/box-tap/cfg.test.lua > index b61073438..b76f28893 100755 > --- a/test/box-tap/cfg.test.lua > +++ b/test/box-tap/cfg.test.lua > @@ -6,7 +6,7 @@ local socket = require('socket') > local fio = require('fio') > local uuid = require('uuid') > local msgpack = require('msgpack') > -test:plan(104) > +test:plan(106) > > -------------------------------------------------------------------------------- > -- Invalid values > @@ -592,6 +592,18 @@ box.cfg{read_only=true} > ]] > test:is(run_script(code), PANIC, "panic on bootstrapping a read-only instance as master") > > +-- > +-- gf-2867 raise on raw modifications of box.cfg values > +-- > +code = [[ > +box.cfg{} > +box.cfg.read_only = true > +]] > +test:is(run_script(code), PANIC, "attempt to modify a read-only table") > > +code = [[ > +box.cfg["read_only"] = true > +]] > +test:is(run_script(code), PANIC, "attempt to modify a read-only table") This test is exactly the same as the prior one see Lua reference manual[1]: | The syntax var.Name is just syntactic sugar for var["Name"] > test:check() > os.exit(0) > diff --git a/test/box/cfg.result b/test/box/cfg.result > index 5370bb870..9031e1480 100644 > --- a/test/box/cfg.result > +++ b/test/box/cfg.result > @@ -236,6 +236,61 @@ box.cfg{replication = {}} > | --- > | ... > > +cfg = {} > + | --- > + | ... > +for k, v in pairs(box.cfg) do table.insert(cfg, k) end > + | --- > + | ... > +cfg > + | --- > + | - - pid_file > + | - checkpoint_count > + | - feedback_host > + | - readahead > + | - log_level > + | - checkpoint_interval > + | - vinyl_page_size > + | - coredump > + | - replication_sync_lag > + | - replication_timeout > + | - wal_dir_rescan_delay > + | - vinyl_memory > + | - replication_skip_conflict > + | - strip_core > + | - feedback_enabled > + | - wal_max_size > + | - too_long_threshold > + | - memtx_memory > + | - log > + | - background > + | - vinyl_dir > + | - vinyl_cache > + | - vinyl_read_threads > + | - vinyl_bloom_fpr > + | - vinyl_timeout > + | - net_msg_max > + | - listen > + | - force_recovery > + | - vinyl_max_tuple_size > + | - vinyl_run_count_per_level > + | - hot_standby > + | - log_format > + | - memtx_max_tuple_size > + | - memtx_min_tuple_size > + | - feedback_interval > + | - vinyl_write_threads > + | - wal_mode > + | - worker_pool_threads > + | - vinyl_run_size_ratio > + | - read_only > + | - memtx_dir > + | - wal_dir > + | - slab_alloc_factor > + | - checkpoint_wal_threshold > + | - replication_connect_timeout > + | - replication_sync_timeout > + | ... > -------------------------------------------------------------------------------- > -- Test of hierarchical cfg type check > -------------------------------------------------------------------------------- > diff --git a/test/box/cfg.test.lua b/test/box/cfg.test.lua > index 56ccb6767..275737e7a 100644 > --- a/test/box/cfg.test.lua > +++ b/test/box/cfg.test.lua > @@ -19,6 +19,9 @@ box.cfg{coredump = 'true'} > box.cfg{replication = {}} > box.cfg{replication = {}} > > +cfg = {} > +for k, v in pairs(box.cfg) do table.insert(cfg, k) end > +cfg > -------------------------------------------------------------------------------- > -- Test of hierarchical cfg type check > -------------------------------------------------------------------------------- > -- > 2.20.1 (Apple Git-117) > [1]: https://www.lua.org/manual/5.1/manual.html#2.3 -- Best regards, IM ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-11-19 9:33 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-11-07 14:03 [Tarantool-patches] [PATCH rfc 0/2] Lua 5.2 compatibility Olga Arkhangelskaia 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 1/2] lua: turn on lua " Olga Arkhangelskaia 2019-11-16 13:47 ` Igor Munkin 2019-11-19 9:33 ` Olga Arkhangelskaia 2019-11-07 14:03 ` [Tarantool-patches] [PATCH 2/2] box: raise on raw modifications of box.cfg values Olga Arkhangelskaia 2019-11-17 18:56 ` Igor Munkin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox