Skip to content

Commit 2ed4841

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 02e6fb1 commit 2ed4841

File tree

4 files changed

+92
-10
lines changed

4 files changed

+92
-10
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 = {

crud/common/sharding/sharding_metadata.lua

+4-7
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ end
6868
-- a sharding metadata by a single one, other fibers will wait while
6969
-- cache.fetch_lock become unlocked during timeout passed to
7070
-- _fetch_on_router().
71-
local _fetch_on_router = locked(function(timeout, metadata_map_name)
72-
dev_checks('number', 'string')
71+
local _fetch_on_router = locked(function(timeout, space_name, metadata_map_name)
72+
dev_checks('number', 'string', 'string')
7373

7474
if cache[metadata_map_name] ~= nil then
7575
return
@@ -86,7 +86,7 @@ local _fetch_on_router = locked(function(timeout, metadata_map_name)
8686
return
8787
end
8888

89-
local err = sharding_key.construct_as_index_obj_cache(metadata_map)
89+
local err = sharding_key.construct_as_index_obj_cache(metadata_map, space_name)
9090
if err ~= nil then
9191
return err
9292
end
@@ -107,11 +107,8 @@ local function fetch_on_router(space_name, metadata_map_name, timeout)
107107
end
108108

109109
local timeout = timeout or const.FETCH_SHARDING_METADATA_TIMEOUT
110-
local err = _fetch_on_router(timeout, metadata_map_name)
110+
local err = _fetch_on_router(timeout, space_name, metadata_map_name)
111111
if err ~= nil then
112-
if cache[metadata_map_name] ~= nil then
113-
return cache[metadata_map_name][space_name]
114-
end
115112
return nil, err
116113
end
117114

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
@@ -694,3 +694,70 @@ pgroup.test_update_cache = function(g)
694694
t.assert_equals(err, nil)
695695
t.assert_equals(sharding_key_as_index_obj, {parts = {{fieldno = 3}}})
696696
end
697+
698+
pgroup.test_update_cache_with_incorrect_key = function(g)
699+
-- get data from cache for space with correct sharding key
700+
local space_name = 'customers_name_key'
701+
702+
local sharding_key_as_index_obj, err = helpers.update_sharding_key_cache(g.cluster, space_name)
703+
t.assert_equals(err, nil)
704+
t.assert_equals(sharding_key_as_index_obj, {parts = {{fieldno = 3}}})
705+
706+
-- records for all spaces exist
707+
sharding_key_as_index_obj = helpers.get_sharding_key_cache(g.cluster)
708+
t.assert_equals(sharding_key_as_index_obj, {
709+
customers_age_key = {parts = {{fieldno = 4}}},
710+
customers_name_age_key_different_indexes = {parts = {{fieldno = 3}, {fieldno = 4}}},
711+
customers_name_age_key_three_fields_index = {parts = {{fieldno = 3}, {fieldno = 4}}},
712+
customers_name_key = {parts = {{fieldno = 3}}},
713+
customers_name_key_non_uniq_index = {parts = {{fieldno = 3}}},
714+
customers_name_key_uniq_index = {parts = {{fieldno = 3}}},
715+
customers_secondary_idx_name_key = {parts = {{fieldno = 3}}},
716+
})
717+
718+
-- no error just warning
719+
local space_name = 'customers_name_key'
720+
helpers.call_on_servers(g.cluster, {'s1-master', 's2-master'}, function(server)
721+
server.net_box:call('set_sharding_key', {space_name, {'non_existent_field'}})
722+
end)
723+
724+
-- we get no error because we sent request for correct space
725+
local sharding_key_as_index_obj, err = helpers.update_sharding_key_cache(g.cluster, 'customers_age_key')
726+
t.assert_equals(err, nil)
727+
t.assert_equals(sharding_key_as_index_obj, {parts = {{fieldno = 4}}})
728+
729+
-- cache['customers_name_key'] == nil (space with incorrect key)
730+
-- other records for correct spaces exist in cache
731+
sharding_key_as_index_obj = helpers.get_sharding_key_cache(g.cluster)
732+
t.assert_equals(sharding_key_as_index_obj, {
733+
customers_age_key = {parts = {{fieldno = 4}}},
734+
customers_name_age_key_different_indexes = {parts = {{fieldno = 3}, {fieldno = 4}}},
735+
customers_name_age_key_three_fields_index = {parts = {{fieldno = 3}, {fieldno = 4}}},
736+
customers_name_key_non_uniq_index = {parts = {{fieldno = 3}}},
737+
customers_name_key_uniq_index = {parts = {{fieldno = 3}}},
738+
customers_secondary_idx_name_key = {parts = {{fieldno = 3}}},
739+
})
740+
741+
-- get data from cache for space with incorrect sharding key
742+
local space_name = 'customers_name_key'
743+
helpers.call_on_servers(g.cluster, {'s1-master', 's2-master'}, function(server)
744+
server.net_box:call('set_sharding_key', {space_name, {'non_existent_field'}})
745+
end)
746+
747+
-- we get an error because we sent request for incorrect space
748+
local sharding_key_as_index_obj, err = helpers.update_sharding_key_cache(g.cluster, space_name)
749+
t.assert_equals(sharding_key_as_index_obj, nil)
750+
t.assert_str_contains(err.err, "No such field (non_existent_field) in a space format (customers_name_key)")
751+
752+
-- cache['customers_name_key'] == nil (space with incorrect key)
753+
-- other records for correct spaces exist in cache
754+
sharding_key_as_index_obj = helpers.get_sharding_key_cache(g.cluster)
755+
t.assert_equals(sharding_key_as_index_obj, {
756+
customers_age_key = {parts = {{fieldno = 4}}},
757+
customers_name_age_key_different_indexes = {parts = {{fieldno = 3}, {fieldno = 4}}},
758+
customers_name_age_key_three_fields_index = {parts = {{fieldno = 3}, {fieldno = 4}}},
759+
customers_name_key_non_uniq_index = {parts = {{fieldno = 3}}},
760+
customers_name_key_uniq_index = {parts = {{fieldno = 3}}},
761+
customers_secondary_idx_name_key = {parts = {{fieldno = 3}}},
762+
})
763+
end

0 commit comments

Comments
 (0)