-
Notifications
You must be signed in to change notification settings - Fork 376
/
gh_8505_synchro_triggers_test.lua
80 lines (70 loc) · 2.57 KB
/
gh_8505_synchro_triggers_test.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
local t = require('luatest')
local replica_set = require('luatest.replica_set')
local server = require('luatest.server')
local proxy = require('luatest.replica_proxy')
local g = t.group('gh-8505-synchro-triggers')
g.before_all(function(g)
g.replica_set = replica_set:new({})
local rs_id = g.replica_set.id
g.box_cfg = {
replication_timeout = 0.01,
election_fencing_mode = 'off',
replication = {
server.build_listen_uri('server1', rs_id),
server.build_listen_uri('server2', rs_id),
},
}
g.box_cfg.election_mode = 'candidate'
g.server1 = g.replica_set:build_and_add_server{
alias = 'server1',
box_cfg = g.box_cfg,
}
g.proxy1 = proxy:new{
client_socket_path = server.build_listen_uri('server1_proxy'),
server_socket_path = server.build_listen_uri('server1', rs_id),
}
t.assert(g.proxy1:start{force = true}, 'Proxy from 2 to 1 started')
g.box_cfg.replication[1] = server.build_listen_uri('server1_proxy')
g.box_cfg.election_mode = 'voter'
g.server2 = g.replica_set:build_and_add_server{
alias = 'server2',
box_cfg = g.box_cfg,
}
g.replica_set:start()
g.server1:wait_for_election_leader()
g.server1:exec(function()
box.schema.create_space('test', {is_sync = true}):create_index('pk')
end)
g.server2:wait_for_vclock_of(g.server1)
end)
g.after_all(function(g)
g.replica_set:drop()
end)
g.test_on_commit_trigger = function(g)
g.server1:exec(function()
box.begin()
box.on_commit(function(iter) iter() end)
box.space.test:upsert({1}, {{'=', 1, 1}})
box.commit()
end)
end
g.test_on_rollback_trigger = function(g)
-- Force ACK gathering to fail and cause rollback. It's not enough
-- to set a small timeout, as a transaction can be committed anyway:
-- fibers don't yield so often, compared to such a tiny timeout, ACKs
-- can be processed before the transaction's rollback happens due to
-- a timeout error. So, let's break connection with proxy.
g.server1:update_box_cfg({ replication_synchro_timeout = 1e-9 })
g.server1:wait_for_election_leader()
g.proxy1:pause()
g.server1:exec(function()
box.begin()
box.on_rollback(function(iter) iter() end)
box.space.test:upsert({1}, {{'=', 1, 1}})
local _, err = pcall(box.commit)
t.assert_equals(err.code, box.error.SYNC_QUORUM_TIMEOUT)
end)
g.proxy1:resume()
g.server1:update_box_cfg({ replication_synchro_timeout = 5 })
g.server1:wait_for_election_leader()
end