Skip to content

Commit dbb314a

Browse files
committed
Fix filling sharding key cache when sharding key data is incorrect
Sharding key cache contains sharding key structures separated by space name. Before this fix if sharding key was incorrect for some space an error was returned and sharding keys that were after the incorrect one did not get into the cache. The solution is to create a variable for an error and write a message to it if an error occurred for the space we are working with, output a warning for other spaces. Part of #237
1 parent 396f282 commit dbb314a

File tree

3 files changed

+88
-3
lines changed

3 files changed

+88
-3
lines changed

crud/common/sharding/sharding_key.lua

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
local errors = require('errors')
2+
local log = require('log')
23

34
local dev_checks = require('crud.common.dev_checks')
45
local cache = require('crud.common.sharding.sharding_metadata_cache')
@@ -96,8 +97,10 @@ function sharding_key_module.extract_from_pk(space_name, sharding_key_as_index_o
9697
return extract_from_index(primary_key, primary_index_parts, sharding_key_as_index_obj)
9798
end
9899

99-
function sharding_key_module.construct_as_index_obj_cache(metadata_map)
100-
dev_checks('table')
100+
function sharding_key_module.construct_as_index_obj_cache(metadata_map, specified_space_name)
101+
dev_checks('table', 'string')
102+
103+
local result_err
101104

102105
cache.sharding_key_as_index_obj_map = {}
103106
for space_name, metadata in pairs(metadata_map) do
@@ -106,12 +109,19 @@ function sharding_key_module.construct_as_index_obj_cache(metadata_map)
106109
metadata.space_format,
107110
metadata.sharding_key_def)
108111
if err ~= nil then
109-
return err
112+
if specified_space_name == space_name then
113+
result_err = err
114+
log.error(err)
115+
else
116+
log.warn(err)
117+
end
110118
end
111119

112120
cache.sharding_key_as_index_obj_map[space_name] = sharding_key_as_index_obj
113121
end
114122
end
123+
124+
return result_err
115125
end
116126

117127
sharding_key_module.internal = {

test/helper.lua

+8
Original file line numberDiff line numberDiff line change
@@ -332,4 +332,12 @@ function helpers.update_sharding_key_cache(cluster, space_name)
332332
]], {space_name})
333333
end
334334

335+
function helpers.get_sharding_key_cache(cluster)
336+
return cluster.main_server.net_box:eval([[
337+
local sharding_metadata_cache = require('crud.common.sharding.sharding_metadata_cache')
338+
339+
return sharding_metadata_cache[sharding_metadata_cache.SHARDING_KEY_MAP_NAME]
340+
]])
341+
end
342+
335343
return helpers

test/integration/ddl_sharding_key_test.lua

+67
Original file line numberDiff line numberDiff line change
@@ -676,3 +676,70 @@ pgroup.test_update_cache = function(g)
676676
t.assert_equals(err, nil)
677677
t.assert_equals(sharding_key_as_index_obj, {parts = {{fieldno = 3}}})
678678
end
679+
680+
pgroup.test_update_cache_with_incorrect_key = function(g)
681+
-- get data from cache for space with correct sharding key
682+
local space_name = 'customers_name_key'
683+
684+
local sharding_key_as_index_obj, err = helpers.update_sharding_key_cache(g.cluster, space_name)
685+
t.assert_equals(err, nil)
686+
t.assert_equals(sharding_key_as_index_obj, {parts = {{fieldno = 3}}})
687+
688+
-- records for all spaces exist
689+
sharding_key_as_index_obj = helpers.get_sharding_key_cache(g.cluster)
690+
t.assert_equals(sharding_key_as_index_obj, {
691+
customers_age_key = {parts = {{fieldno = 4}}},
692+
customers_name_age_key_different_indexes = {parts = {{fieldno = 3}, {fieldno = 4}}},
693+
customers_name_age_key_three_fields_index = {parts = {{fieldno = 3}, {fieldno = 4}}},
694+
customers_name_key = {parts = {{fieldno = 3}}},
695+
customers_name_key_non_uniq_index = {parts = {{fieldno = 3}}},
696+
customers_name_key_uniq_index = {parts = {{fieldno = 3}}},
697+
customers_secondary_idx_name_key = {parts = {{fieldno = 3}}},
698+
})
699+
700+
-- no error just warning
701+
local space_name = 'customers_name_key'
702+
helpers.call_on_servers(g.cluster, {'s1-master', 's2-master'}, function(server)
703+
server.net_box:call('set_sharding_key', {space_name, {'non_existent_field'}})
704+
end)
705+
706+
-- we get no error because we sent request for correct space
707+
local sharding_key_as_index_obj, err = helpers.update_sharding_key_cache(g.cluster, 'customers_age_key')
708+
t.assert_equals(err, nil)
709+
t.assert_equals(sharding_key_as_index_obj, {parts = {{fieldno = 4}}})
710+
711+
-- cache['customers_name_key'] == nil (space with incorrect key)
712+
-- other records for correct spaces exist in cache
713+
sharding_key_as_index_obj = helpers.get_sharding_key_cache(g.cluster)
714+
t.assert_equals(sharding_key_as_index_obj, {
715+
customers_age_key = {parts = {{fieldno = 4}}},
716+
customers_name_age_key_different_indexes = {parts = {{fieldno = 3}, {fieldno = 4}}},
717+
customers_name_age_key_three_fields_index = {parts = {{fieldno = 3}, {fieldno = 4}}},
718+
customers_name_key_non_uniq_index = {parts = {{fieldno = 3}}},
719+
customers_name_key_uniq_index = {parts = {{fieldno = 3}}},
720+
customers_secondary_idx_name_key = {parts = {{fieldno = 3}}},
721+
})
722+
723+
-- get data from cache for space with incorrect sharding key
724+
local space_name = 'customers_name_key'
725+
helpers.call_on_servers(g.cluster, {'s1-master', 's2-master'}, function(server)
726+
server.net_box:call('set_sharding_key', {space_name, {'non_existent_field'}})
727+
end)
728+
729+
-- we get an error because we sent request for incorrect space
730+
local sharding_key_as_index_obj, err = helpers.update_sharding_key_cache(g.cluster, space_name)
731+
t.assert_equals(sharding_key_as_index_obj, nil)
732+
t.assert_str_contains(err.err, "No such field (non_existent_field) in a space format (customers_name_key)")
733+
734+
-- cache['customers_name_key'] == nil (space with incorrect key)
735+
-- other records for correct spaces exist in cache
736+
sharding_key_as_index_obj = helpers.get_sharding_key_cache(g.cluster)
737+
t.assert_equals(sharding_key_as_index_obj, {
738+
customers_age_key = {parts = {{fieldno = 4}}},
739+
customers_name_age_key_different_indexes = {parts = {{fieldno = 3}, {fieldno = 4}}},
740+
customers_name_age_key_three_fields_index = {parts = {{fieldno = 3}, {fieldno = 4}}},
741+
customers_name_key_non_uniq_index = {parts = {{fieldno = 3}}},
742+
customers_name_key_uniq_index = {parts = {{fieldno = 3}}},
743+
customers_secondary_idx_name_key = {parts = {{fieldno = 3}}},
744+
})
745+
end

0 commit comments

Comments
 (0)