Skip to content

Commit 074e78d

Browse files
crud: fix passing errors from storages for merger
Before this patch, returning any errors from storages for merger operations (`crud.select`, `crud.pairs`, `readview:select`, `readview:pairs`) had resulted in non-informative "Invalid merge source 0x556bb6885a00" errors. This patch fixes the issue by replacing error return with error throw. Part of #373
1 parent b44caab commit 074e78d

File tree

7 files changed

+147
-12
lines changed

7 files changed

+147
-12
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1212
non-iterating indexes (#373).
1313
* Precision loss for decimal conditions in case of non-indexed fields or
1414
non-iterating indexes (#373).
15+
* Passing errors from storages for merger operations (`crud.select`,
16+
`crud.pairs`, `readview:select`, `readview:pairs`) (#423).
1517

1618
## [1.4.3] - 05-02-24
1719

crud/select.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ local function select_on_storage(space_name, index_id, conditions, opts)
6161

6262
local space = box.space[space_name]
6363
if space == nil then
64-
return cursor, SelectError:new("Space %q doesn't exist", space_name)
64+
SelectError:assert(false, "Space %q doesn't exist", space_name)
6565
end
6666

6767
local index = space.index[index_id]
6868
if index == nil then
69-
return cursor, SelectError:new("Index with ID %s doesn't exist", index_id)
69+
SelectError:assert(false, "Index with ID %s doesn't exist", index_id)
7070
end
7171

7272
local _, err = sharding.check_sharding_hash(space_name,
@@ -83,7 +83,7 @@ local function select_on_storage(space_name, index_id, conditions, opts)
8383
scan_condition_num = opts.scan_condition_num,
8484
})
8585
if err ~= nil then
86-
return cursor, SelectError:new("Failed to generate tuples filter: %s", err)
86+
return SelectError:assert(false, "Failed to generate tuples filter: %s", err)
8787
end
8888

8989
-- execute select
@@ -95,7 +95,7 @@ local function select_on_storage(space_name, index_id, conditions, opts)
9595
yield_every = opts.yield_every,
9696
})
9797
if err ~= nil then
98-
return cursor, SelectError:new("Failed to execute select: %s", err)
98+
return SelectError:assert(false, "Failed to execute select: %s", err)
9999
end
100100

101101
if resp.tuples_fetched < opts.limit or opts.limit == 0 then

test/integration/pairs_readview_test.lua

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -895,11 +895,14 @@ local function read_impl(cg, space, conditions, opts)
895895
local status, resp = pcall(function()
896896
return rv:pairs(space, conditions, opts):totable()
897897
end)
898-
t.assert(status, resp)
899898

900899
rv:close()
901900

902-
return resp, nil
901+
if status then
902+
return resp, nil
903+
else
904+
return nil, resp
905+
end
903906
end, {space, conditions, opts})
904907
end
905908

@@ -919,3 +922,17 @@ for case_name_template, case in pairs(gh_373_types_cases) do
919922
case(g, read_impl)
920923
end
921924
end
925+
926+
pgroup.before_test(
927+
'test_pairs_merger_process_storage_error',
928+
read_scenario.before_merger_process_storage_error
929+
)
930+
931+
pgroup.test_pairs_merger_process_storage_error = function(g)
932+
read_scenario.merger_process_storage_error(g, read_impl)
933+
end
934+
935+
pgroup.after_test(
936+
'test_pairs_merger_process_storage_error',
937+
read_scenario.after_merger_process_storage_error
938+
)

test/integration/pairs_test.lua

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -905,9 +905,12 @@ local function read_impl(cg, space, conditions, opts)
905905
local status, resp = pcall(function()
906906
return crud.pairs(space, conditions, opts):totable()
907907
end)
908-
t.assert(status, resp)
909908

910-
return resp, nil
909+
if status then
910+
return resp, nil
911+
else
912+
return nil, resp
913+
end
911914
end, {space, conditions, opts})
912915
end
913916

@@ -927,3 +930,17 @@ for case_name_template, case in pairs(gh_373_types_cases) do
927930
case(g, read_impl)
928931
end
929932
end
933+
934+
pgroup.before_test(
935+
'test_pairs_merger_process_storage_error',
936+
read_scenario.before_merger_process_storage_error
937+
)
938+
939+
pgroup.test_pairs_merger_process_storage_error = function(g)
940+
read_scenario.merger_process_storage_error(g, read_impl)
941+
end
942+
943+
pgroup.after_test(
944+
'test_pairs_merger_process_storage_error',
945+
read_scenario.after_merger_process_storage_error
946+
)

test/integration/read_scenario.lua

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,12 @@ local function gh_418_read_with_secondary_noneq_index_condition(cg, read)
5050
-- iterator had erroneously expected tuples to be sorted by `last_login`
5151
-- index while iterating on `city` index. Before the issue had beed fixed,
5252
-- user had received only one record instead of two.
53-
local result = read(cg,
53+
local result, err = read(cg,
5454
'logins',
5555
{{'=', 'city', 'Tatsumi Port Island'}, {'<=', 'last_login', 42}},
5656
{bucket_id = PINNED_BUCKET_NO}
5757
)
58+
t.assert_equals(err, nil)
5859

5960
if type(result) == 'number' then -- crud.count
6061
t.assert_equals(result, 2)
@@ -555,8 +556,71 @@ for space_kind, space_option in pairs(datetime_condition_space_options) do
555556
end
556557

557558

559+
local function before_merger_process_storage_error(cg)
560+
helpers.call_on_storages(cg.cluster, function(server)
561+
server:exec(function()
562+
local space
563+
if box.info.ro == false then
564+
space = box.schema.space.create('speedy_gonzales', {if_not_exists = true})
565+
566+
space:format({
567+
{name = 'id', type = 'unsigned'},
568+
{name = 'bucket_id', type = 'unsigned'},
569+
})
570+
571+
space:create_index('pk', {
572+
parts = {'id'},
573+
if_not_exists = true,
574+
})
575+
576+
space:create_index('bucket_id', {
577+
parts = {'bucket_id'},
578+
unique = false,
579+
if_not_exists = true,
580+
})
581+
end
582+
583+
local real_select_impl = rawget(_G, '_crud').select_on_storage
584+
rawset(_G, '_real_select_impl', real_select_impl)
585+
586+
-- Drop right before select to cause storage-side error.
587+
-- Work guaranteed only with mode = 'write'.
588+
local function erroneous_select_impl(...)
589+
if box.info.ro == false then
590+
space:drop()
591+
end
592+
593+
return real_select_impl(...)
594+
end
595+
596+
rawget(_G, '_crud').select_on_storage = erroneous_select_impl
597+
end)
598+
end)
599+
end
600+
601+
local function merger_process_storage_error(cg, read)
602+
local _, err = read(cg, 'speedy_gonzales', {{'==', 'id', 1}})
603+
t.assert_not_equals(err, nil)
604+
605+
local err_msg = err.err or tostring(err)
606+
t.assert_str_contains(err_msg, "Space \"speedy_gonzales\" doesn't exist")
607+
end
608+
609+
local function after_merger_process_storage_error(cg)
610+
helpers.call_on_storages(cg.cluster, function(server)
611+
server:exec(function()
612+
local real_select_impl = rawget(_G, '_real_select_impl')
613+
614+
rawget(_G, '_crud').select_on_storage = real_select_impl
615+
end)
616+
end)
617+
end
618+
558619
return {
559620
gh_418_read_with_secondary_noneq_index_condition = gh_418_read_with_secondary_noneq_index_condition,
560621
gh_373_read_with_decimal_condition_cases = gh_373_read_with_decimal_condition_cases,
561622
gh_373_read_with_datetime_condition_cases = gh_373_read_with_datetime_condition_cases,
623+
before_merger_process_storage_error = before_merger_process_storage_error,
624+
merger_process_storage_error = merger_process_storage_error,
625+
after_merger_process_storage_error = after_merger_process_storage_error,
562626
}

test/integration/select_readview_test.lua

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2498,7 +2498,11 @@ local function read_impl(cg, space, conditions, opts)
24982498

24992499
rv:close()
25002500

2501-
return crud.unflatten_rows(resp.rows, resp.metadata)
2501+
if err ~= nil then
2502+
return nil, err
2503+
end
2504+
2505+
return crud.unflatten_rows(resp.rows, resp.metadata), nil
25022506
end, {space, conditions, opts})
25032507
end
25042508

@@ -2518,3 +2522,17 @@ for case_name_template, case in pairs(gh_373_types_cases) do
25182522
case(g, read_impl)
25192523
end
25202524
end
2525+
2526+
pgroup.before_test(
2527+
'test_select_merger_process_storage_error',
2528+
read_scenario.before_merger_process_storage_error
2529+
)
2530+
2531+
pgroup.test_select_merger_process_storage_error = function(g)
2532+
read_scenario.merger_process_storage_error(g, read_impl)
2533+
end
2534+
2535+
pgroup.after_test(
2536+
'test_select_merger_process_storage_error',
2537+
read_scenario.after_merger_process_storage_error
2538+
)

test/integration/select_test.lua

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,9 +2274,12 @@ local function read_impl(cg, space, conditions, opts)
22742274
opts.mode = 'write'
22752275

22762276
local resp, err = cg.cluster.main_server:call('crud.select', {space, conditions, opts})
2277-
t.assert_equals(err, nil)
22782277

2279-
return crud.unflatten_rows(resp.rows, resp.metadata)
2278+
if err ~= nil then
2279+
return nil, err
2280+
end
2281+
2282+
return crud.unflatten_rows(resp.rows, resp.metadata), nil
22802283
end
22812284

22822285
pgroup.test_gh_418_select_with_secondary_noneq_index_condition = function(g)
@@ -2295,3 +2298,17 @@ for case_name_template, case in pairs(gh_373_types_cases) do
22952298
case(g, read_impl)
22962299
end
22972300
end
2301+
2302+
pgroup.before_test(
2303+
'test_select_merger_process_storage_error',
2304+
read_scenario.before_merger_process_storage_error
2305+
)
2306+
2307+
pgroup.test_select_merger_process_storage_error = function(g)
2308+
read_scenario.merger_process_storage_error(g, read_impl)
2309+
end
2310+
2311+
pgroup.after_test(
2312+
'test_select_merger_process_storage_error',
2313+
read_scenario.after_merger_process_storage_error
2314+
)

0 commit comments

Comments
 (0)