Skip to content

Commit 83413a5

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 92c3fbd commit 83413a5

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

crud/common/sharding/sharding_key.lua

Lines changed: 12 additions & 3 deletions
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,18 @@ 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+
else
115+
log.warn(err)
116+
end
110117
end
111118

112119
cache.sharding_key_as_index_obj_map[space_name] = sharding_key_as_index_obj
113120
end
114121
end
122+
123+
return result_err
115124
end
116125

117126
sharding_key_module.internal = {

test/helper.lua

Lines changed: 8 additions & 0 deletions
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

Lines changed: 67 additions & 0 deletions
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)