File: gr_recovery_completion_mode.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (271 lines) | stat: -rw-r--r-- 7,681 bytes parent folder | download
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
################################################################################
# This test evaluates both recovery policies on when a member should become
# online.
#
# Test:
#   0. The test requires two servers.
#
# Phase 1: Recovery only waits for the certification of all cached transactions
#   1. Create 2 tables (t1,t2) on both servers
#   2. Start group replication on server1 with some data inserted on t1
#   3. Lock table t1 on server 2 and start group replication
#      Recovery will get stuck as the member can't execute data on t1
#   4. Lock table t2 on server 2 and insert some data on t2 on server 1
#      Recovery application of cached data is blocked as t2 is locked
#   5. Unlock t1 and recovery first phase will unblock.
#      The member should become online as it does not wait for the application
#      of cached transactions, only its certification.
#   6. Clean up.
#
# Phase 2: Recovery waits for the execution of all executed transactions
#   1. Create 2 tables (t1,t2) on both servers
#   2. Start group replication on server1 with some data inserted on t1
#   3. Lock table t1 on server 2 and start group replication
#      Recovery will get stuck as the member can't execute data on t1
#   4. Lock table t2 on server 2 and insert some data on t2 on server 1
#      Recovery application of cached data is blocked as t2 is locked
#   5. Unlock t1 and recovery first phase will unblock.
#      The member should still be on recovery as the server is waiting for the
#      execution of cached transactions and t2 is locked.
#   6. Unlock t2 and the application of cached transactions will unblock.
#      The member should become online.
#   7. Clean up.
################################################################################

--source include/big_test.inc
--let $group_replication_group_name= 08033a70-3560-11e5-a2cb-0800200c9a66
--source include/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--source include/group_replication.inc

--echo ######################################################################
--echo # Phase 1:
--echo # Recovery only waits for the certification of all cached transactions
--echo ######################################################################

--echo #
--echo # Create t1 and t2 on both servers
--echo # Start group replication on server 1 after inserting data on t1
--echo #

--connection server1
--echo server1

SET SESSION sql_log_bin=0;
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE t2 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
SET SESSION sql_log_bin=1;

--source include/start_and_bootstrap_group_replication.inc

INSERT INTO t1 VALUES (1);

--connection server2
--echo server2

SET SESSION sql_log_bin=0;
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE t2 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
SET SESSION sql_log_bin=1;

--echo #
--echo # Lock table t1 and table t2 on server 2
--echo # Table t1: Blocks first phase of recovery
--echo # Table t2: Blocks second phase of recovery
--echo #

SET @configured_rec_policy= @@GLOBAL.group_replication_recovery_complete_at;
SET GLOBAL group_replication_recovery_complete_at= "transactions_certified";

--connection server_2
--echo server_2 (server2)
LOCK TABLE t1 READ;

--connection slave
--echo slave (server2)
LOCK TABLE t2 READ;

--echo #
--echo # Start group replication on server 2 and check it is stuck on recovery
--echo #

--connection server2
--echo server2

--let $group_replication_start_member_state= RECOVERING
--source include/start_group_replication.inc

--echo #
--echo # Insert some transaction on server 1 that will be cached on server 2
--echo #

--connection server1
--echo server1

# Wait for the View Change event to reach the binlog.
--eval SELECT WAIT_FOR_EXECUTED_GTID_SET('$group_replication_group_name:3')
INSERT INTO t2 VALUES (1);

--echo #
--echo # UnLock table t1: First phase of recovery can carry on.
--echo # Member 1 is online as it only waits for certification of cached data
--echo #

--connection server_2
--echo server_2 (server2)

UNLOCK TABLES;

--connection server2
--echo server2

--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc

--echo #
--echo # UnLock table t2: Second phase of recovery can carry on.
--echo # The data should be there.
--echo #

--connection slave
--echo slave (server2)

UNLOCK TABLES;

--let $wait_condition= SELECT COUNT(*)=1 FROM t2;
--source include/wait_condition.inc

--echo #
--echo # Phase 1 cleanup
--echo # Remove the data from the tables and stop group replication on server 2
--echo #

--connection server1
--echo server1

TRUNCATE TABLE t1;
TRUNCATE TABLE t2;

--source include/rpl_sync.inc

--connection server2
--echo server2

--source include/stop_group_replication.inc

--echo ######################################################################
--echo # Phase 2:
--echo # Recovery waits for the execution of all executed transactions
--echo ######################################################################

--echo #
--echo # Start group replication on server 1 after inserting data on t1
--echo #

--connection server1
--echo server1

INSERT INTO t1 VALUES (1);

--echo #
--echo # Change recovery policy on server 2 to wait for transaction execution.
--echo #

--connection server2
--echo server2

SET GLOBAL group_replication_recovery_complete_at= "transactions_applied";

--echo #
--echo # Lock table t1 and table t2 on server 2
--echo # Table t1: Blocks first phase of recovery
--echo # Table t2: Blocks second phase of recovery
--echo #

--connection server_2
--echo server_2 (server2)

LOCK TABLE t1 READ;

--connection slave
--echo slave (server2)

LOCK TABLE t2 READ;

--echo #
--echo # Start group replication on server 2 and check it is stuck on recovery
--echo #

--connection server2
--echo server2

--let $group_replication_start_member_state= RECOVERING
--source include/start_group_replication.inc

--echo #
--echo # Insert some transaction on server 1 that will be cached on server 2
--echo #

--connection server1
--echo server1

INSERT INTO t2 VALUES (1);

--echo #
--echo # Wait for the transactions to be cached on server 2
--echo #

--connection server2
--echo server2

--let $wait_condition= SELECT COUNT_TRANSACTIONS_IN_QUEUE=2 FROM performance_schema.replication_group_member_stats where member_id in (SELECT @@server_uuid);
--source include/wait_condition.inc

--echo #
--echo # UnLock table t1: First phase of recovery can carry on.
--echo # Member 2 is still recovering as it can't apply cached data
--echo #

--connection server_2
--echo server_2 (server2)

UNLOCK TABLES;

--connection server2
--echo server2

--let $server2_uuid= `SELECT @@GLOBAL.SERVER_UUID`
--let $member_state= query_get_value(SELECT Member_State from performance_schema.replication_group_members WHERE member_id= '$server2_uuid', Member_State, 1)
--let $assert_text= The value of member_state should be recovering
--let $assert_cond= "$member_state" = "RECOVERING"
--source include/assert.inc

--echo #
--echo # UnLock table t2: Second phase of recovery can carry on.
--echo # The data should be there and the member should now be online.
--echo #

--connection slave
--echo slave (server2)

UNLOCK TABLES;

--let $wait_condition= SELECT COUNT(*)=1 FROM t2;
--source include/wait_condition.inc

--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc

--echo #
--echo # Test cleanup
--echo #

--connection server2
--echo server2

DROP TABLE t1;
DROP TABLE t2;

SET GLOBAL group_replication_recovery_complete_at= @configured_rec_policy;

--source include/group_replication_end.inc