diff --git a/changelogs/unreleased/gh-7232-upgrade-script-work-dir.md b/changelogs/unreleased/gh-7232-upgrade-script-work-dir.md new file mode 100644 index 0000000000000000000000000000000000000000..dfaffd314dd7a72e30c589aff3e39e2e34d82eb7 --- /dev/null +++ b/changelogs/unreleased/gh-7232-upgrade-script-work-dir.md @@ -0,0 +1,4 @@ +## bugfix/core + +* Fixed Tarantool not being able to recover from old snapshots when + `box.cfg.work_dir` and `box.cfg.memtx_dir` were both set (gh-7232). diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua index cb4974d9f0565636a6e007c274760d5365e6c536..09d3d3b3baf1e603190dd5ba845a1a9c5cb02377 100644 --- a/src/box/lua/load_cfg.lua +++ b/src/box/lua/load_cfg.lua @@ -6,6 +6,7 @@ local private = require('box.internal') local urilib = require('uri') local math = require('math') local fiber = require('fiber') +local fio = require('fio') -- Function decorator that is used to prevent box.cfg() from -- being called concurrently by different fibers. @@ -806,7 +807,11 @@ local function load_cfg(cfg) -- When recovering from such an old snapshot, special recovery triggers on -- system spaces are needed in order to be able to recover and upgrade -- the schema then. + -- This code is executed before load_cfg, so work_dir is not yet set. local snap_dir = box.cfg.memtx_dir + if not snap_dir:startswith('/') and box.cfg.work_dir ~= nil then + snap_dir = fio.pathjoin(box.cfg.work_dir, snap_dir) + end local snap_version = private.get_snapshot_version(snap_dir) if snap_version then private.set_recovery_triggers(snap_version) diff --git a/test/xlog/gh-5894-pre-1.7.7-upgrade.result b/test/xlog/gh-5894-pre-1.7.7-upgrade.result index aba5a56abf7716395f45bd10dc0c1b50753216e2..cb1e3fe81c572e67f38bcf336578b96fa454831e 100644 --- a/test/xlog/gh-5894-pre-1.7.7-upgrade.result +++ b/test/xlog/gh-5894-pre-1.7.7-upgrade.result @@ -102,6 +102,46 @@ test_run:cmd('delete server upgrade') | - true | ... +-- Check that various combinations of box.cfg.work_dir and box.cfg.memtx_dir are +-- handled correctly. +-- work_dir - empty, memtx_dir - absolute tested above. +-- work_dir - relative, memtx_dir - absolute (set by test-run). +test_run:cmd('create server upgrade with script="xlog/upgrade.lua", \ + workdir="xlog/upgrade/1.6.8/gh-5894-pre-1.7.7-upgrade"') + | --- + | - true + | ... +test_run:cmd('start server upgrade with args="upgrade"') + | --- + | - true + | ... +test_run:cmd('stop server upgrade') + | --- + | - true + | ... +test_run:cmd('delete server upgrade') + | --- + | - true + | ... +-- work_dir - relative, memtx_dir - relative. +test_run:cmd('create server upgrade with script="xlog/upgrade.lua", \ + workdir="xlog/upgrade/1.6.8/gh-5894-pre-1.7.7-upgrade"') + | --- + | - true + | ... +test_run:cmd('start server upgrade with args="upgrade ."') + | --- + | - true + | ... +test_run:cmd('stop server upgrade') + | --- + | - true + | ... +test_run:cmd('delete server upgrade') + | --- + | - true + | ... + -- Upgrade from 1.7.1. test_run:cmd('create server upgrade with script="xlog/upgrade.lua", \ workdir="xlog/upgrade/1.7.1/gh-5894-pre-1.7.7-upgrade"') diff --git a/test/xlog/gh-5894-pre-1.7.7-upgrade.test.lua b/test/xlog/gh-5894-pre-1.7.7-upgrade.test.lua index 9096bcb7a159d8fe22c20eda055dea7b264c7bf2..a64c9c3453d2bb94af1358bb40090415af983ba2 100644 --- a/test/xlog/gh-5894-pre-1.7.7-upgrade.test.lua +++ b/test/xlog/gh-5894-pre-1.7.7-upgrade.test.lua @@ -19,6 +19,22 @@ test_run:switch('default') test_run:cmd('stop server upgrade') test_run:cmd('delete server upgrade') +-- Check that various combinations of box.cfg.work_dir and box.cfg.memtx_dir are +-- handled correctly. +-- work_dir - empty, memtx_dir - absolute tested above. +-- work_dir - relative, memtx_dir - absolute (set by test-run). +test_run:cmd('create server upgrade with script="xlog/upgrade.lua", \ + workdir="xlog/upgrade/1.6.8/gh-5894-pre-1.7.7-upgrade"') +test_run:cmd('start server upgrade with args="upgrade"') +test_run:cmd('stop server upgrade') +test_run:cmd('delete server upgrade') +-- work_dir - relative, memtx_dir - relative. +test_run:cmd('create server upgrade with script="xlog/upgrade.lua", \ + workdir="xlog/upgrade/1.6.8/gh-5894-pre-1.7.7-upgrade"') +test_run:cmd('start server upgrade with args="upgrade ."') +test_run:cmd('stop server upgrade') +test_run:cmd('delete server upgrade') + -- Upgrade from 1.7.1. test_run:cmd('create server upgrade with script="xlog/upgrade.lua", \ workdir="xlog/upgrade/1.7.1/gh-5894-pre-1.7.7-upgrade"') diff --git a/test/xlog/upgrade.lua b/test/xlog/upgrade.lua index dcf59e18e21d6998ac63948508c4331b20255885..7dbeef08788788bc51a9ebf52d903c42c66ca2a0 100644 --- a/test/xlog/upgrade.lua +++ b/test/xlog/upgrade.lua @@ -1,8 +1,20 @@ #!/usr/bin/env tarantool +local work_dir = nil +local memtx_dir = nil + +if arg[1] ~= nil then + -- When no args are passed to the script test-run fills args with + -- "nil upgrade.lua" for some reason. + work_dir = arg[1] + memtx_dir = arg[2] +end + box.cfg { listen = os.getenv("LISTEN"), - memtx_memory = 107374182 + memtx_memory = 107374182, + work_dir = work_dir, + memtx_dir = memtx_dir, } require('console').listen(os.getenv('ADMIN'))