diff --git a/test/vinyl/recover.result b/test/vinyl/recover.result index 4c3325bf22331086da54532a9a81425c4532c9f3..db5445f01bbb8c8c46b255af92ba9775ac6bf020 100644 --- a/test/vinyl/recover.result +++ b/test/vinyl/recover.result @@ -12,92 +12,6 @@ _ = tmp:create_index('primary', {parts = {1, 'string'}}) --- ... -- --- Check that range splits, compactions, and dumps don't break recovery. --- -s = box.schema.space.create('test', {engine='vinyl'}) ---- -... -_ = s:create_index('primary', {page_size=256, range_size=2048, run_count_per_level=1, run_size_ratio=10}) ---- -... -function vyinfo() return box.space.test.index.primary:info() end ---- -... -range_count = 4 ---- -... -tuple_size = math.ceil(s.index.primary.options.page_size / 4) ---- -... -pad_size = tuple_size - 30 ---- -... -assert(pad_size >= 16) ---- -- true -... -keys_per_range = math.floor(s.index.primary.options.range_size / tuple_size) ---- -... -key_count = range_count * keys_per_range ---- -... --- Add a number of tuples to the test space to trigger range splitting. --- Rewrite them several times with different values so that different --- generations of ranges on disk have different contents. -test_run:cmd("setopt delimiter ';'") ---- -- true -... -iter = 0 -function gen_tuple(k) - local pad = {} - for i = 1,pad_size do - pad[i] = string.char(math.random(65, 90)) - end - return {k, k + iter, table.concat(pad)} -end -while vyinfo().range_count < range_count do - iter = iter + 1 - for k = key_count,1,-1 do s:replace(gen_tuple(k)) end - box.snapshot() - fiber.sleep(0.01) -end; ---- -... -test_run:cmd("setopt delimiter ''"); ---- -- true -... --- Remember the number of iterations and the number of keys --- so that we can check data validity after restart. -_ = tmp:insert{'iter', iter} ---- -... -_ = tmp:insert{'key_count', key_count} ---- -... -test_run:cmd('restart server default') -s = box.space.test ---- -... -tmp = box.space.tmp ---- -... --- Check that the test space content was not corrupted. -iter = tmp:get('iter')[2] ---- -... -key_count = tmp:get('key_count')[2] ---- -... -for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end ---- -... -s:drop() ---- -... --- -- Check that vinyl stats are restored correctly. -- s = box.schema.space.create('test', {engine='vinyl'}) diff --git a/test/vinyl/recover.test.lua b/test/vinyl/recover.test.lua index e88563535e837295337925bd99134843e8e73d06..451a2749c2cc175a23f81fac598bb22a4ebcdbc4 100644 --- a/test/vinyl/recover.test.lua +++ b/test/vinyl/recover.test.lua @@ -1,62 +1,9 @@ test_run = require('test_run').new() -fiber = require('fiber') -- Temporary table to restore variables after restart. tmp = box.schema.space.create('tmp') _ = tmp:create_index('primary', {parts = {1, 'string'}}) --- --- Check that range splits, compactions, and dumps don't break recovery. --- -s = box.schema.space.create('test', {engine='vinyl'}) -_ = s:create_index('primary', {page_size=256, range_size=2048, run_count_per_level=1, run_size_ratio=10}) - -function vyinfo() return box.space.test.index.primary:info() end - -range_count = 4 -tuple_size = math.ceil(s.index.primary.options.page_size / 4) -pad_size = tuple_size - 30 -assert(pad_size >= 16) -keys_per_range = math.floor(s.index.primary.options.range_size / tuple_size) -key_count = range_count * keys_per_range - --- Add a number of tuples to the test space to trigger range splitting. --- Rewrite them several times with different values so that different --- generations of ranges on disk have different contents. -test_run:cmd("setopt delimiter ';'") -iter = 0 -function gen_tuple(k) - local pad = {} - for i = 1,pad_size do - pad[i] = string.char(math.random(65, 90)) - end - return {k, k + iter, table.concat(pad)} -end -while vyinfo().range_count < range_count do - iter = iter + 1 - for k = key_count,1,-1 do s:replace(gen_tuple(k)) end - box.snapshot() - fiber.sleep(0.01) -end; -test_run:cmd("setopt delimiter ''"); - --- Remember the number of iterations and the number of keys --- so that we can check data validity after restart. -_ = tmp:insert{'iter', iter} -_ = tmp:insert{'key_count', key_count} - -test_run:cmd('restart server default') - -s = box.space.test -tmp = box.space.tmp - --- Check that the test space content was not corrupted. -iter = tmp:get('iter')[2] -key_count = tmp:get('key_count')[2] -for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end - -s:drop() - -- -- Check that vinyl stats are restored correctly. -- diff --git a/test/vinyl/split_coalesce.result b/test/vinyl/split_coalesce.result index b6478d302baca1c0b83a9753848da595764e24b9..7205af8181b06f89297c58a54fc7d2d2d24c7f24 100644 --- a/test/vinyl/split_coalesce.result +++ b/test/vinyl/split_coalesce.result @@ -4,6 +4,13 @@ test_run = require('test_run').new() fiber = require('fiber') --- ... +-- Temporary table to restore variables after restart. +var = box.schema.space.create('var') +--- +... +_ = var:create_index('primary', {parts = {1, 'string'}}) +--- +... s = box.schema.space.create('test', {engine='vinyl'}) --- ... @@ -61,6 +68,48 @@ vyinfo().range_count --- - 4 ... +-- Remember the number of iterations and the number of keys +-- so that we can check data validity after restart. +_ = var:insert{'iter', iter} +--- +... +_ = var:insert{'key_count', key_count} +--- +... +_ = var:insert{'keys_per_range', keys_per_range} +--- +... +-- Check that the space can be recovered after splitting ranges. +test_run:cmd('restart server default') +fiber = require 'fiber' +--- +... +s = box.space.test +--- +... +var = box.space.var +--- +... +iter = var:get('iter')[2] +--- +... +key_count = var:get('key_count')[2] +--- +... +keys_per_range = var:get('keys_per_range')[2] +--- +... +function vyinfo() return box.space.test.index.primary:info() end +--- +... +-- Check the space content. +s:count() == key_count +--- +- true +... +for k = 1,key_count do v = s:get(k) assert(v[2] == k + iter) end +--- +... -- Delete 90% keys, remove padding for the rest. test_run:cmd("setopt delimiter ';'") --- @@ -99,10 +148,45 @@ vyinfo().range_count --- - 1 ... --- Check the remaining keys. -for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end +-- Check that the space can be recovered after coalescing ranges. +test_run:cmd('restart server default') +s = box.space.test +--- +... +var = box.space.var +--- +... +iter = var:get('iter')[2] +--- +... +key_count = var:get('key_count')[2] +--- +... +-- Check the space content. +test_run:cmd("setopt delimiter ';'") +--- +- true +... +key_count_left = 0 +for k = 1,key_count do + v = s:get(k) + if k % 10 == 0 then + assert(v[2] == k + iter) + key_count_left = key_count_left + 1 + else + assert(v == nil) + end +end +test_run:cmd("setopt delimiter ''"); +--- +... +s:count() == key_count_left --- +- true ... s:drop() --- ... +var:drop() +--- +... diff --git a/test/vinyl/split_coalesce.test.lua b/test/vinyl/split_coalesce.test.lua index c41e22702ea321d6fc079012504fe1aef348d6d7..adbf90b2cac220f15612e964492d2c883ac1e031 100644 --- a/test/vinyl/split_coalesce.test.lua +++ b/test/vinyl/split_coalesce.test.lua @@ -2,6 +2,10 @@ test_run = require('test_run').new() fiber = require('fiber') +-- Temporary table to restore variables after restart. +var = box.schema.space.create('var') +_ = var:create_index('primary', {parts = {1, 'string'}}) + s = box.schema.space.create('test', {engine='vinyl'}) _ = s:create_index('primary', {unique=true, parts={1, 'unsigned'}, page_size=256, range_size=2048, run_count_per_level=1, run_size_ratio=1000}) @@ -34,6 +38,30 @@ test_run:cmd("setopt delimiter ''"); vyinfo().range_count +-- Remember the number of iterations and the number of keys +-- so that we can check data validity after restart. +_ = var:insert{'iter', iter} +_ = var:insert{'key_count', key_count} +_ = var:insert{'keys_per_range', keys_per_range} + +-- Check that the space can be recovered after splitting ranges. +test_run:cmd('restart server default') + +fiber = require 'fiber' + +s = box.space.test +var = box.space.var + +iter = var:get('iter')[2] +key_count = var:get('key_count')[2] +keys_per_range = var:get('keys_per_range')[2] + +function vyinfo() return box.space.test.index.primary:info() end + +-- Check the space content. +s:count() == key_count +for k = 1,key_count do v = s:get(k) assert(v[2] == k + iter) end + -- Delete 90% keys, remove padding for the rest. test_run:cmd("setopt delimiter ';'") for k = 1,key_count do @@ -59,7 +87,29 @@ test_run:cmd("setopt delimiter ''"); vyinfo().range_count --- Check the remaining keys. -for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end +-- Check that the space can be recovered after coalescing ranges. +test_run:cmd('restart server default') + +s = box.space.test +var = box.space.var + +iter = var:get('iter')[2] +key_count = var:get('key_count')[2] + +-- Check the space content. +test_run:cmd("setopt delimiter ';'") +key_count_left = 0 +for k = 1,key_count do + v = s:get(k) + if k % 10 == 0 then + assert(v[2] == k + iter) + key_count_left = key_count_left + 1 + else + assert(v == nil) + end +end +test_run:cmd("setopt delimiter ''"); +s:count() == key_count_left s:drop() +var:drop()