From 029dd6a37242f19c1511175470dcc2b688318237 Mon Sep 17 00:00:00 2001 From: Alexandr <a.lyapunov@corp.mail.ru> Date: Thu, 5 Jun 2014 16:07:18 +0400 Subject: [PATCH] fixed ERRINJ_INDEX_ALLOC for hash and tree induces. removed irritating pragma messages --- src/box/tree_index.cc | 4 +- src/errinj.h | 3 +- src/lib/salad/bps_tree.h | 10 +- test/box/errinj.result | 8 +- test/box/errinj_index.result | 258 ++++++++++++++++++++++++++++++++- test/box/errinj_index.test.lua | 77 +++++++++- 6 files changed, 333 insertions(+), 27 deletions(-) diff --git a/src/box/tree_index.cc b/src/box/tree_index.cc index ef2c257656..cc45bdf8ba 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 ef38719065..11f6f81abd 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 824769a4c6..b87ae2a363 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 e0456e8f33..1cf394bdc3 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 6233799f52..a139297738 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 cd4155ec15..cf4baaf4c3 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 = {} -- GitLab