Skip to content
Snippets Groups Projects
Commit 6f6a3040 authored by Alexander Turenko's avatar Alexander Turenko Committed by Vladimir Davydov
Browse files

test: rewrote xlog/checkpoint_daemon.test.lua

Updated the test case for #2780 to check a last snapshot file
modification time instead of search log messages.

The test was flaky, because of small timeouts on Linux, but now we
spinning on a condition check to achieve both stable results and fast
execution.

Follows up #2780.
Fixes #3684.
parent b4d24341
No related branches found
No related tags found
No related merge requests found
...@@ -19,10 +19,10 @@ test_run:cleanup_cluster() ...@@ -19,10 +19,10 @@ test_run:cleanup_cluster()
box.cfg{checkpoint_interval = 0} box.cfg{checkpoint_interval = 0}
--- ---
... ...
PERIOD = 0.03 PERIOD = jit.os == 'Linux' and 0.03 or 1.5
--- ---
... ...
if jit.os ~= 'Linux' then PERIOD = 1.5 end WAIT_COND_TIMEOUT = 10
--- ---
... ...
space = box.schema.space.create('checkpoint_daemon') space = box.schema.space.create('checkpoint_daemon')
...@@ -31,6 +31,50 @@ space = box.schema.space.create('checkpoint_daemon') ...@@ -31,6 +31,50 @@ space = box.schema.space.create('checkpoint_daemon')
index = space:create_index('pk', { type = 'tree', parts = { 1, 'unsigned' }}) index = space:create_index('pk', { type = 'tree', parts = { 1, 'unsigned' }})
--- ---
... ...
test_run:cmd("setopt delimiter ';'")
---
- true
...
-- wait_snapshot* functions update these variables.
snaps = {};
---
...
xlogs = {};
---
...
-- Wait until tarantool creates a snapshot containing current
-- data slice.
function wait_snapshot(timeout)
snaps = {}
xlogs = {}
local signature_str = tostring(box.info.signature)
signature_str = string.rjust(signature_str, 20, '0')
local exp_snap_filename = string.format('%s.snap', signature_str)
return test_run:wait_cond(function()
snaps = fio.glob(fio.pathjoin(box.cfg.memtx_dir, '*.snap'))
xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog'))
return fio.basename(snaps[#snaps]) == exp_snap_filename
end, timeout)
end;
---
...
-- Wait until snapshots count will be equal to the
-- checkpoint_count option.
function wait_snapshot_gc(timeout)
snaps = {}
xlogs = {}
return test_run:wait_cond(function()
snaps = fio.glob(fio.pathjoin(box.cfg.memtx_dir, '*.snap'))
xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog'))
return #snaps == box.cfg.checkpoint_count
end, timeout)
end;
---
...
test_run:cmd("setopt delimiter ''");
---
- true
...
box.cfg{checkpoint_interval = PERIOD, checkpoint_count = 2 } box.cfg{checkpoint_interval = PERIOD, checkpoint_count = 2 }
--- ---
... ...
...@@ -45,9 +89,9 @@ for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end ...@@ -45,9 +89,9 @@ for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
--- ---
... ...
-- wait for last snapshot wait_snapshot(WAIT_COND_TIMEOUT)
fiber.sleep(1.5 * PERIOD)
--- ---
- true
... ...
-- third xlog -- third xlog
for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
...@@ -57,23 +101,11 @@ for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end ...@@ -57,23 +101,11 @@ for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
--- ---
... ...
-- wait for last snapshot wait_snapshot(WAIT_COND_TIMEOUT)
test_run:cmd("setopt delimiter ';'")
--- ---
- true - true
... ...
for i = 1, 100 do wait_snapshot_gc(WAIT_COND_TIMEOUT)
fiber.sleep(PERIOD)
snaps = fio.glob(fio.pathjoin(box.cfg.memtx_dir, '*.snap'))
xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog'))
if #snaps == 2 then
break
end
end;
---
...
test_run:cmd("setopt delimiter ''");
--- ---
- true - true
... ...
...@@ -85,20 +117,30 @@ test_run:cmd("setopt delimiter ''"); ...@@ -85,20 +117,30 @@ test_run:cmd("setopt delimiter ''");
--- ---
- true - true
... ...
fio.basename(snaps[1], '.snap') >= fio.basename(xlogs[1], '.xlog') -- gh-2780: check that a last snapshot mtime will be changed at
-- least two times.
test_run:cmd("setopt delimiter ';'")
--- ---
- true - true
... ...
-- gh-2780 check that scheduled snapshots are performed last_mtime = fio.stat(snaps[#snaps]).mtime;
fiber.sleep(3 * PERIOD)
--- ---
... ...
-- check that it's not first snapshot mtime_changes_cnt = 0;
test_run:grep_log("default", "saving snapshot", 400) == nil ---
...
test_run:wait_cond(function()
local mtime = fio.stat(snaps[#snaps]).mtime
if mtime ~= last_mtime then
mtime_changes_cnt = mtime_changes_cnt + 1
last_mtime = mtime
end
return mtime_changes_cnt == 2
end, WAIT_COND_TIMEOUT);
--- ---
- true - true
... ...
test_run:grep_log("default", "making snapshot", 400) ~= nil test_run:cmd("setopt delimiter ''");
--- ---
- true - true
... ...
......
...@@ -8,13 +8,46 @@ test_run:cleanup_cluster() ...@@ -8,13 +8,46 @@ test_run:cleanup_cluster()
box.cfg{checkpoint_interval = 0} box.cfg{checkpoint_interval = 0}
PERIOD = 0.03 PERIOD = jit.os == 'Linux' and 0.03 or 1.5
if jit.os ~= 'Linux' then PERIOD = 1.5 end WAIT_COND_TIMEOUT = 10
space = box.schema.space.create('checkpoint_daemon') space = box.schema.space.create('checkpoint_daemon')
index = space:create_index('pk', { type = 'tree', parts = { 1, 'unsigned' }}) index = space:create_index('pk', { type = 'tree', parts = { 1, 'unsigned' }})
test_run:cmd("setopt delimiter ';'")
-- wait_snapshot* functions update these variables.
snaps = {};
xlogs = {};
-- Wait until tarantool creates a snapshot containing current
-- data slice.
function wait_snapshot(timeout)
snaps = {}
xlogs = {}
local signature_str = tostring(box.info.signature)
signature_str = string.rjust(signature_str, 20, '0')
local exp_snap_filename = string.format('%s.snap', signature_str)
return test_run:wait_cond(function()
snaps = fio.glob(fio.pathjoin(box.cfg.memtx_dir, '*.snap'))
xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog'))
return fio.basename(snaps[#snaps]) == exp_snap_filename
end, timeout)
end;
-- Wait until snapshots count will be equal to the
-- checkpoint_count option.
function wait_snapshot_gc(timeout)
snaps = {}
xlogs = {}
return test_run:wait_cond(function()
snaps = fio.glob(fio.pathjoin(box.cfg.memtx_dir, '*.snap'))
xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog'))
return #snaps == box.cfg.checkpoint_count
end, timeout)
end;
test_run:cmd("setopt delimiter ''");
box.cfg{checkpoint_interval = PERIOD, checkpoint_count = 2 } box.cfg{checkpoint_interval = PERIOD, checkpoint_count = 2 }
...@@ -23,41 +56,34 @@ no = 1 ...@@ -23,41 +56,34 @@ no = 1
for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
-- second xlog -- second xlog
for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
-- wait for last snapshot
fiber.sleep(1.5 * PERIOD) wait_snapshot(WAIT_COND_TIMEOUT)
-- third xlog -- third xlog
for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
-- fourth xlog -- fourth xlog
for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end
-- wait for last snapshot wait_snapshot(WAIT_COND_TIMEOUT)
wait_snapshot_gc(WAIT_COND_TIMEOUT)
test_run:cmd("setopt delimiter ';'")
for i = 1, 100 do
fiber.sleep(PERIOD)
snaps = fio.glob(fio.pathjoin(box.cfg.memtx_dir, '*.snap'))
xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog'))
if #snaps == 2 then
break
end
end;
test_run:cmd("setopt delimiter ''");
#snaps == 2 or snaps #snaps == 2 or snaps
#xlogs > 0 #xlogs > 0
fio.basename(snaps[1], '.snap') >= fio.basename(xlogs[1], '.xlog') -- gh-2780: check that a last snapshot mtime will be changed at
-- least two times.
-- gh-2780 check that scheduled snapshots are performed test_run:cmd("setopt delimiter ';'")
fiber.sleep(3 * PERIOD) last_mtime = fio.stat(snaps[#snaps]).mtime;
-- check that it's not first snapshot mtime_changes_cnt = 0;
test_run:grep_log("default", "saving snapshot", 400) == nil test_run:wait_cond(function()
test_run:grep_log("default", "making snapshot", 400) ~= nil local mtime = fio.stat(snaps[#snaps]).mtime
if mtime ~= last_mtime then
mtime_changes_cnt = mtime_changes_cnt + 1
last_mtime = mtime
end
return mtime_changes_cnt == 2
end, WAIT_COND_TIMEOUT);
test_run:cmd("setopt delimiter ''");
-- restore default options -- restore default options
box.cfg{checkpoint_interval = 3600 * 4, checkpoint_count = 4 } box.cfg{checkpoint_interval = 3600 * 4, checkpoint_count = 4 }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment