Skip to content

Commit 1065f71

Browse files
d.sharonovTotktonada
authored andcommitted
fetch schema to be applied from replicaset leader
1 parent 03a75d4 commit 1065f71

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

migrator/init.lua

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,22 @@ local function get_diff()
3333
return names, migrations_map
3434
end
3535

36+
local function get_schema()
37+
return ddl.get_schema()
38+
end
39+
40+
-- since migrations might be triggered on a replica, we should fetch ddl schema from actual master
41+
-- see https://github.com/tarantool/migrations/issues/56 for details
42+
local function fetch_schema()
43+
if vars.use_cartridge_ddl ~= true then return nil end
44+
local schema, err = rpc.call('migrator', 'get_schema', nil, {prefer_local = true, leader_only = true})
45+
if err ~= nil then
46+
log.error(err)
47+
error(err)
48+
end
49+
return schema
50+
end
51+
3652
--- Run migrations on all nodes in the cluster
3753
-- Throws an exception in case of any problems
3854
-- @function up
@@ -97,7 +113,7 @@ local function up()
97113

98114
local patch = {
99115
migrations = config,
100-
['schema.yml'] = vars.use_cartridge_ddl and ddl.get_schema() or nil
116+
['schema.yml'] = fetch_schema()
101117
}
102118
log.info('Migrations applied on all storages, changing clusterwide configuration...')
103119
log.verbose('All migrations applied successfully, changing cluster-wide configuration with a patch: %s', json.encode(patch))
@@ -158,5 +174,7 @@ return {
158174
up = up,
159175

160176
set_loader = set_loader,
161-
set_use_cartridge_ddl = set_use_cartridge_ddl
177+
set_use_cartridge_ddl = set_use_cartridge_ddl,
178+
179+
get_schema = get_schema
162180
}

test/integration/fockups_test.lua

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ g.cluster = cartridge_helpers.Cluster:new({
3030
roles = { 'vshard-storage' },
3131
servers = {
3232
{ instance_uuid = cartridge_helpers.uuid('b', 1), },
33+
{ instance_uuid = cartridge_helpers.uuid('b', 2), },
3334
},
3435
},
3536
},
@@ -167,3 +168,62 @@ g.test_reload = function()
167168
end
168169
end
169170

171+
-- https://github.com/tarantool/migrations/issues/56
172+
g.test_up_on_replica = function()
173+
for _, server in pairs(g.cluster.servers) do
174+
server.net_box:eval([[
175+
require('migrator').set_loader(
176+
require('migrator.config-loader').new()
177+
)
178+
]])
179+
end
180+
181+
-- create some space
182+
g.cluster.main_server:http_request('post', '/migrations/up', { json = {} })
183+
utils.set_sections(g, { { filename = "migrations/source/100_create_space.lua", content = [[
184+
return {
185+
up = function()
186+
local f = box.schema.create_space('somespace', {
187+
format = {
188+
{ name = 'key', type = 'string' },
189+
{ name = 'value', type = 'string', is_nullable = true }
190+
},
191+
if_not_exists = true,
192+
})
193+
f:create_index('primary', {
194+
parts = { 'key' },
195+
if_not_exists = true,
196+
})
197+
end
198+
}
199+
]] } })
200+
g.cluster.main_server:http_request('post', '/migrations/up', { json = {} })
201+
202+
fiber.sleep(0.5)
203+
204+
-- inject schema replication delay
205+
g.cluster:server('storage-1-2').net_box:eval([[
206+
box.space._space:before_replace(function(old, new) os.execute('sleep 0.5'); return new end)
207+
]])
208+
209+
-- change space format to make ddl schema incompatible
210+
utils.set_sections(g, { { filename = "migrations/source/101_alter_space.lua", content = [[
211+
return {
212+
up = function()
213+
box.space.somespace:format({
214+
{ name = 'key', type = 'string' },
215+
{ name = 'value', type = 'string', is_nullable = true },
216+
{ name = 'secondvalue', type = 'string', is_nullable = true }
217+
})
218+
end
219+
}
220+
]] } })
221+
g.cluster:server('storage-1-2'):http_request('post', '/migrations/up', { json = {} })
222+
end
223+
224+
g.after_each(function()
225+
g.cluster:server('storage-1-2').net_box:eval([[
226+
local f = box.space._space:before_replace()
227+
box.space._space:before_replace(nil, f[1])
228+
]])
229+
end)

0 commit comments

Comments
 (0)