diff --git a/src/box/tree_index.cc b/src/box/tree_index.cc index ef2c2576560908b6922a47b32722808d689f804d..cc45bdf8bad326cf499d32b4e50cbc35ceddc8b0 100644 --- a/src/box/tree_index.cc +++ b/src/box/tree_index.cc @@ -189,9 +189,7 @@ tree_iterator_bwd_skip_one_check_next_equality(struct iterator *iterator) static void * extent_alloc() { -#ifndef NDEBUG - ERROR_INJECT(ERRINJ_TREE_ALLOC, return 0); -#endif + ERROR_INJECT(ERRINJ_INDEX_ALLOC, return 0); return mempool_alloc(&tree_extent_pool); } diff --git a/src/errinj.h b/src/errinj.h index ef38719065ef624e806eb107941129159df9a574..11f6f81abd919f6f7712a1efe91e03b1f8b14d5a 100644 --- a/src/errinj.h +++ b/src/errinj.h @@ -43,8 +43,7 @@ struct errinj { _(ERRINJ_TESTING, false) \ _(ERRINJ_WAL_IO, false) \ _(ERRINJ_WAL_ROTATE, false) \ - _(ERRINJ_INDEX_ALLOC, false) \ - _(ERRINJ_TREE_ALLOC, false) + _(ERRINJ_INDEX_ALLOC, false) ENUM0(errinj_enum, ERRINJ_LIST); extern struct errinj errinjs[]; diff --git a/src/lib/salad/bps_tree.h b/src/lib/salad/bps_tree.h index 824769a4c6a646b46c7bc7a1bb0b0b8e4db5dc51..b87ae2a363a1ec72b593587c58a35c7c4274ae7e 100644 --- a/src/lib/salad/bps_tree.h +++ b/src/lib/salad/bps_tree.h @@ -243,19 +243,13 @@ * use linear search. To turn on the linear search * #define BPS_BLOCK_LINEAR_SEARCH */ -#ifdef BPS_BLOCK_LINEAR_SEARCH -#pragma message("Btree: using linear search") -#endif /** * A switch that enables collection of executions of different * branches of code. Used only for debug purposes, I hope you - * will not use it. + * will not use it. Nevertheless, to turn it on, + * #define BPS_TREE_DEBUG_BRANCH_VISIT */ -#ifdef BPS_TREE_DEBUG_BRANCH_VISIT -#pragma message("Btree: debugging: collecting branch visits") -#endif - /* }}} */ diff --git a/test/box/errinj.result b/test/box/errinj.result index e0456e8f33fbb8e183bb74ea70bc510fae2a596d..1cf394bdc384549af0be9791caebee85f6c7f0ff 100644 --- a/test/box/errinj.result +++ b/test/box/errinj.result @@ -9,15 +9,13 @@ space:create_index('primary', { type = 'hash' }) ... errinj.info() --- -- ERRINJ_WAL_IO: +- ERRINJ_INDEX_ALLOC: state: false - ERRINJ_TESTING: - state: false - ERRINJ_INDEX_ALLOC: + ERRINJ_WAL_IO: state: false ERRINJ_WAL_ROTATE: state: false - ERRINJ_TREE_ALLOC: + ERRINJ_TESTING: state: false ... errinj.set("some-injection", true) diff --git a/test/box/errinj_index.result b/test/box/errinj_index.result index 6233799f527c6b18291b71f28d61883228983494..a13929773801ed7f204bb5168778b42bcb5c000f 100644 --- a/test/box/errinj_index.result +++ b/test/box/errinj_index.result @@ -1,13 +1,13 @@ errinj = require('errinj') --- ... +-- Check a failed realloc in tree index. s = box.schema.create_space('tweedledum') --- ... -s:create_index('primary') +s:create_index('primary', {type = 'tree'} ) --- ... --- Check a failed realloc in tree. for i = 1,10 do s:insert{i, i, 'test' .. i} end --- ... @@ -49,7 +49,7 @@ res - [9, 9, 'test9'] - [10, 10, 'test10'] ... -errinj.set("ERRINJ_TREE_ALLOC", true) +errinj.set("ERRINJ_INDEX_ALLOC", true) --- - ok ... @@ -195,7 +195,257 @@ check_iter_and_size() --- - ok ... -errinj.set("ERRINJ_TREE_ALLOC", false) +errinj.set("ERRINJ_INDEX_ALLOC", false) +--- +- ok +... +for i = 4501,5500 do s:insert{i, i} end +--- +... +res = {} +--- +... +for i = 1,10 do table.insert(res, (s:get{i})) end +--- +... +res +--- +- - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [8, 8, 'test8'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +s:delete{8} +--- +- [8, 8, 'test8'] +... +res = {} +--- +... +for i = 1,10 do table.insert(res, (s:get{i})) end +--- +... +res +--- +- - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +res = {} +--- +... +for i = 5001,5010 do table.insert(res, (s:get{i})) end +--- +... +res +--- +- - [5001, 5001] + - [5002, 5002] + - [5003, 5003] + - [5004, 5004] + - [5005, 5005] + - [5006, 5006] + - [5007, 5007] + - [5008, 5008] + - [5009, 5009] + - [5010, 5010] +... +s:drop() +--- +... +----------------------------------- +-- Check a failed realloc in hash index. +s = box.schema.create_space('tweedledum') +--- +... +s:create_index('primary', {type = 'hash'} ) +--- +... +for i = 1,10 do s:insert{i, i, 'test' .. i} end +--- +... +res = {} +--- +... +for i = 1,10 do table.insert(res, s:get{i}) end +--- +... +res +--- +- - [1, 1, 'test1'] + - [2, 2, 'test2'] + - [3, 3, 'test3'] + - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [8, 8, 'test8'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +res = {} +--- +... +for _, t in s.index[0]:pairs() do table.insert(res, t) end +--- +... +res +--- +- - [1, 1, 'test1'] + - [2, 2, 'test2'] + - [3, 3, 'test3'] + - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [8, 8, 'test8'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +errinj.set("ERRINJ_INDEX_ALLOC", true) +--- +- ok +... +res = {} +--- +... +for i = 1,10 do table.insert(res, s:get{i}) end +--- +... +res +--- +- - [1, 1, 'test1'] + - [2, 2, 'test2'] + - [3, 3, 'test3'] + - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [8, 8, 'test8'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +res = {} +--- +... +for _, t in s.index[0]:pairs() do table.insert(res, t) end +--- +... +res +--- +- - [1, 1, 'test1'] + - [2, 2, 'test2'] + - [3, 3, 'test3'] + - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [8, 8, 'test8'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +for i = 501,2500 do s:insert{i, i} end +--- +- error: Failed to allocate 23 bytes in hash for key +... +s:delete{1} +--- +- [1, 1, 'test1'] +... +res = {} +--- +... +for i = 1,10 do table.insert(res, (s:get{i})) end +--- +... +res +--- +- - [2, 2, 'test2'] + - [3, 3, 'test3'] + - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [8, 8, 'test8'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +res = {} +--- +... +for i = 501,510 do table.insert(res, (s:get{i})) end +--- +... +res +--- +- [] +... +res = {} +--- +... +for i = 2001,2010 do table.insert(res, (s:get{i})) end +--- +... +res +--- +- [] +... +--since every insertion is rejected, count must be (10 - number of deletions) +function check_iter_and_size(size_must_be) local count = 0 for _, t in s.index[0]:pairs() do count = count + 1 end print (count) return count ~= size_must_be and "fail 1" or "ok" end +--- +... +check_iter_and_size(9) +--- +- ok +... +for i = 2501,3500 do s:insert{i, i} end +--- +- error: Failed to allocate 23 bytes in hash for key +... +s:delete{2} +--- +- [2, 2, 'test2'] +... +check_iter_and_size(8) +--- +- ok +... +res = {} +--- +... +for i = 1,10 do table.insert(res, (s:get{i})) end +--- +... +res +--- +- - [3, 3, 'test3'] + - [4, 4, 'test4'] + - [5, 5, 'test5'] + - [6, 6, 'test6'] + - [7, 7, 'test7'] + - [8, 8, 'test8'] + - [9, 9, 'test9'] + - [10, 10, 'test10'] +... +for i = 3501,4500 do s:insert{i, i} end +--- +- error: Failed to allocate 23 bytes in hash for key +... +s:delete{3} +--- +- [3, 3, 'test3'] +... +check_iter_and_size(7) +--- +- ok +... +errinj.set("ERRINJ_INDEX_ALLOC", false) --- - ok ... diff --git a/test/box/errinj_index.test.lua b/test/box/errinj_index.test.lua index cd4155ec151d79dcbdabb1d5641866eaa5da69f4..cf4baaf4c3af3584082ffae0e21f2e41511edce4 100644 --- a/test/box/errinj_index.test.lua +++ b/test/box/errinj_index.test.lua @@ -1,9 +1,9 @@ errinj = require('errinj') -s = box.schema.create_space('tweedledum') -s:create_index('primary') +-- Check a failed realloc in tree index. --- Check a failed realloc in tree. +s = box.schema.create_space('tweedledum') +s:create_index('primary', {type = 'tree'} ) for i = 1,10 do s:insert{i, i, 'test' .. i} end res = {} @@ -13,7 +13,7 @@ res = {} for _, t in s.index[0]:pairs() do table.insert(res, t) end res -errinj.set("ERRINJ_TREE_ALLOC", true) +errinj.set("ERRINJ_INDEX_ALLOC", true) res = {} for i = 1,10 do table.insert(res, s:get{i}) end @@ -50,7 +50,74 @@ for i = 3501,4500 do s:insert{i, i} end s:delete{3} check_iter_and_size() -errinj.set("ERRINJ_TREE_ALLOC", false) +errinj.set("ERRINJ_INDEX_ALLOC", false) + +for i = 4501,5500 do s:insert{i, i} end +res = {} +for i = 1,10 do table.insert(res, (s:get{i})) end +res +s:delete{8} +res = {} +for i = 1,10 do table.insert(res, (s:get{i})) end +res +res = {} +for i = 5001,5010 do table.insert(res, (s:get{i})) end +res +s:drop() + +----------------------------------- + +-- Check a failed realloc in hash index. + +s = box.schema.create_space('tweedledum') +s:create_index('primary', {type = 'hash'} ) + +for i = 1,10 do s:insert{i, i, 'test' .. i} end +res = {} +for i = 1,10 do table.insert(res, s:get{i}) end +res +res = {} +for _, t in s.index[0]:pairs() do table.insert(res, t) end +res + +errinj.set("ERRINJ_INDEX_ALLOC", true) + +res = {} +for i = 1,10 do table.insert(res, s:get{i}) end +res +res = {} +for _, t in s.index[0]:pairs() do table.insert(res, t) end +res + +for i = 501,2500 do s:insert{i, i} end +s:delete{1} + +res = {} +for i = 1,10 do table.insert(res, (s:get{i})) end +res +res = {} +for i = 501,510 do table.insert(res, (s:get{i})) end +res +res = {} +for i = 2001,2010 do table.insert(res, (s:get{i})) end +res + +--since every insertion is rejected, count must be (10 - number of deletions) +function check_iter_and_size(size_must_be) local count = 0 for _, t in s.index[0]:pairs() do count = count + 1 end print (count) return count ~= size_must_be and "fail 1" or "ok" end +check_iter_and_size(9) + +for i = 2501,3500 do s:insert{i, i} end +s:delete{2} +check_iter_and_size(8) +res = {} +for i = 1,10 do table.insert(res, (s:get{i})) end +res + +for i = 3501,4500 do s:insert{i, i} end +s:delete{3} +check_iter_and_size(7) + +errinj.set("ERRINJ_INDEX_ALLOC", false) for i = 4501,5500 do s:insert{i, i} end res = {}