File: gr_recovery_slave_commands.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 (422 lines) | stat: -rw-r--r-- 15,919 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
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
###############################################################################
# BUG 21626827 - SOME COMMAND SHOULD NOT BE ALLOWED FOR CHANNEL
#                'GROUP_REPLICATION_RECOVERY'
#
# This test checks to see that user should not be allowed to execute
# set of commands for the group_replication_recovery channel.
#
# Bug 23591186 - WL#9053 : MODIFY MTR TESTS TO VERIFY BEHAVIOR OF
#               'GROUP_REPLICATION_RECOVERY'
# The test is extended to check the behavior when MEMBER is in RECOVERING,
# ONLINE, OFFLINE states.
#
# The commands being checked here are :
# 1. START SLAVE IO_THREAD
# 2. STOP SLAVE IO_THREAD
# 3. START SLAVE FOR CHANNEL
# 4. STOP SLAVE FOR CHANNEL
# 5. START SLAVE SQL_THREAD
# 6. STOP SLAVE SQL_THREAD
# 7. SHOW SLAVE STATUS
# 8. SHOW RELAYLOG EVENTS
# 9. FLUSH RELAY LOGS
# 10. RESET SLAVE
# 11. RESET SLAVE ALL
#
# Test:
# 0. The test requires two servers: M1 and M2.
#
# 1. Bootstrap start GR on M1. Test above mentioned 11 RPL(slave) commands
#    for recovery channel:-
#  - MEMBER_STATE: ONLINE and recovery channel is ABSENT.
#  - Expect ER_REPLICA_CHANNEL_DOES_NOT_EXIST.
#
# 2. Add some data for recovery on M1. Start GR on M2. Test above mentioned
#    11 RPL(slave) commands for recovery channel:-
#  - MEMBER_STATE: ONLINE and recovery channel is PRESENT but INACTIVE.
#  - Expect ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED in most of the cases.
#
# 3. Stop GR on M2. Add data on M1. Lock table on M2 to block recovery.
#    Start GR on M2.
#
# 4. Now when M2 is in RECOVERING state, test above mentioned 11 RPL(slave)
#    commands on recovery channel:-
#  - MEMBER_STATE: RECOVERING and recovery channel is ACTIVE.
#  - Expect ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED in most of the cases.
#
# 5. Unlock tables on M2 and drop table t1 on M1. Stop GR on M2. Test above
#    mentioned 11 RPL(slave) commands:-
#  - MEMBER_STATE: OFFLINE and recovery channel is PRESENT but INACTIVE.
#  - Expect ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED in most of the cases.
###############################################################################

# Skip configuration of recovery channel

--source include/big_test.inc
--source include/have_group_replication_xcom_communication_stack.inc
--let $skip_recovery_configuration = 1
--source include/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--source include/group_replication.inc

# Phase 1
--echo
--echo # Bootstrap start GR on M1 and test commands for recovery channel
--echo # when MEMBER_STATE: ONLINE and recovery channel is ABSENT

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
set session sql_log_bin=0;
call mtr.add_suppression("Replica channel 'group_replication_recovery' does not exist.*");
set session sql_log_bin=1;

--source include/start_and_bootstrap_group_replication.inc

--echo
--echo # CHM for 'group_replication_recovery' channel won't accept parameters other than
--echo # MASTER_USER and MASTER_PASSWORD
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
CHANGE REPLICATION SOURCE TO SOURCE_HOST="localhost", SOURCE_PORT=10 FOR CHANNEL "group_replication_recovery";

--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
CHANGE REPLICATION SOURCE TO SOURCE_TLS_CIPHERSUITES="foo" FOR CHANNEL "group_replication_recovery";

--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
CHANGE REPLICATION SOURCE TO SOURCE_CONNECTION_AUTO_FAILOVER=1 FOR CHANNEL "group_replication_recovery";

--echo
--echo # ERROR when executing STOP SLAVE on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
STOP SLAVE FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing START SLAVE on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
START SLAVE FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing STOP SLAVE IO_THREAD on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
STOP SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing START SLAVE IO_THREAD on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
START SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing STOP SLAVE SQL_THREAD on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
STOP SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing START SLAVE SQL_THREAD on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
START SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing SHOW SLAVE STATUS on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
--query_vertical SHOW SLAVE STATUS FOR CHANNEL 'group_replication_recovery'

--echo
--echo # ERROR when executing SHOW RELAYLOG EVENTS on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
SHOW RELAYLOG EVENTS  FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing FLUSH RELAY LOGS on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
FLUSH RELAY LOGS FOR CHANNEL 'group_replication_recovery';

--echo
--echo # ERROR when executing RESET SLAVE command on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
RESET SLAVE FOR CHANNEL "group_replication_recovery";

--echo
--echo # ERROR when executing RESET SLAVE ALL command on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
RESET SLAVE ALL FOR CHANNEL "group_replication_recovery";

# Phase 2
--echo
--echo # Add some data for recovery on M1. Start GR on M2.

CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);

--let $rpl_connection_name= server2
--source include/rpl_connection.inc

set session sql_log_bin=0;
call mtr.add_suppression("Transaction cannot be executed while Group Replication is recovering.*");
call mtr.add_suppression("Run function 'before_commit' in plugin 'group_replication' failed");
set session sql_log_bin=1;

--disable_warnings
CHANGE REPLICATION SOURCE TO SOURCE_USER="root" FOR CHANNEL "group_replication_recovery";
--enable_warnings
--source include/start_group_replication.inc

--let $wait_condition= SELECT COUNT(*)=1 FROM performance_schema.replication_connection_status where CHANNEL_NAME="group_replication_recovery" and SERVICE_STATE="OFF"
--source include/wait_condition.inc

--echo
--echo # Test commands for recovery channel when MEMBER_STATE: ONLINE and
--echo # recovery channel is PRESENT but INACTIVE.

--echo
--echo # STOP SLAVE is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE FOR CHANNEL "group_replication_recovery";

--echo
--echo # START SLAVE is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE FOR CHANNEL 'group_replication_recovery';

--echo
--echo # STOP SLAVE IO_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE IO_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # STOP SLAVE SQL_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE SQL_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # SHOW SLAVE STATUS - check that recovery channel is inactive
--let $io_thread = query_get_value(SHOW SLAVE STATUS FOR CHANNEL 'group_replication_recovery', Slave_IO_Running, 1)
--let $assert_text= recovery channel is inactive
--let $assert_cond= "$io_thread" = "No"
--source include/assert.inc

--echo
--echo # SHOW RELAYLOG EVENTS - check that relaylogs are created
--let $relay_log_name= query_get_value(SHOW RELAYLOG EVENTS FOR CHANNEL 'group_replication_recovery', Log_name, 1)
--let $assert_text= Relay logs are created
--let $assert_cond= "$relay_log_name" <> ""
--source include/assert.inc

--echo
--echo # SUCCESS when executing FLUSH RELAY LOGS on GR recovery channel
FLUSH RELAY LOGS FOR CHANNEL 'group_replication_recovery';

--echo
--echo # SUCCESS when executing RESET SLAVE on GR recovery channel
RESET SLAVE FOR CHANNEL "group_replication_recovery";

--echo
--echo # Execute RESET SLAVE ALL FOR CHANNEL to delete the recovery channel
--echo # and related files
RESET SLAVE ALL FOR CHANNEL "group_replication_recovery";

# Phase 3
--echo
--echo # Stop GR on M2. Add data on M1. Lock table on M2 to block recovery.
--echo # Start GR on M2.

# Stop group replication and lock table t1 on server 2 to block recovery.
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--source include/stop_group_replication.inc

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (3);

# Lock the table in a different connection
--let $rpl_connection_name= server_2
--source include/rpl_connection.inc
LOCK TABLE t1 READ;

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--disable_warnings
CHANGE REPLICATION SOURCE TO SOURCE_USER="root" FOR CHANNEL "group_replication_recovery";
--enable_warnings

--echo
--echo # Ensure that M2 is blocked in recovery stage so channel exists

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

--let $wait_timeout= 60
--let $wait_condition= SELECT COUNT(*)=1 FROM performance_schema.replication_connection_status where CHANNEL_NAME="group_replication_recovery" and SERVICE_STATE="ON"
--source include/wait_condition.inc

# Phase 4
--echo
--echo # Now when M2 is in RECOVERING state, test commands for recovery channel
--echo # when MEMBER_STATE: RECOVERING and recovery channel is ACTIVE.

--echo
--echo # STOP SLAVE is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE FOR CHANNEL "group_replication_recovery";

--echo
--echo # START SLAVE is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE FOR CHANNEL 'group_replication_recovery';

--echo
--echo # STOP SLAVE IO_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE IO_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE IO_THREAD with UNTIL option is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE IO_THREAD UNTIL SOURCE_LOG_FILE = 'server-binary-log.000001', SOURCE_LOG_POS = 754 FOR CHANNEL 'group_replication_recovery';

--echo
--echo # STOP SLAVE SQL_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE SQL_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE SQL_THREAD with UNTIL option is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE SQL_THREAD UNTIL SQL_AFTER_GTIDS='11111111-1111-1111-1111-111111111111:1-23' FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE SQL_THREAD with UNTIL option is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE SQL_THREAD UNTIL RELAY_LOG_FILE = 'server-relay-log-group_replication_recovery.000001', RELAY_LOG_POS = 854 FOR CHANNEL 'group_replication_recovery';

--echo
--echo # SHOW SLAVE STATUS - check that recovery channel is active
--let $io_thread = query_get_value(SHOW SLAVE STATUS FOR CHANNEL 'group_replication_recovery', Slave_IO_Running, 1)
--let $assert_text= recovery channel is active
--let $assert_cond= "$io_thread" = "Yes"
--source include/assert.inc

--echo
--echo # SHOW RELAYLOG EVENTS - Relay log files should exists
--let $relay_log_name= query_get_value(SHOW RELAYLOG EVENTS FOR CHANNEL 'group_replication_recovery', Log_name, 1)
--let $assert_text= Relay log name should not be empty as the command successfully executed.
--let $assert_cond= "$relay_log_name" <> ""
--source include/assert.inc

# Bug#23575646 : FLUSH RELAY LOGS SHOULD HIT ERROR 3139 WHEN SERVER STATE IS RECOVERING
--echo
--echo # ERROR when executing FLUSH RELAY LOGS on GR recovery channel
--error ER_RUN_HOOK_ERROR
FLUSH RELAY LOGS FOR CHANNEL 'group_replication_recovery';

--echo
--echo # RESET SLAVE command is blocked only when recovery channel is active.
--error ER_REPLICA_CHANNEL_MUST_STOP
RESET SLAVE FOR CHANNEL "group_replication_recovery";

--echo
--echo # RESET SLAVE [ALL] command is blocked only when recovery channel is active.
--error ER_REPLICA_CHANNEL_MUST_STOP
RESET SLAVE ALL FOR CHANNEL "group_replication_recovery";


# Phase 5
--echo
--echo # Unlock tables on M2 and drop table t1 on M1. Stop GR on M2. Test
--echo # for recovery channel when MEMBER_STATE: OFFLINE and recovery channel
--echo # is PRESENT but INACTIVE.

--let $rpl_connection_name= server_2
--source include/rpl_connection.inc
UNLOCK TABLES;

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
DROP TABLE t1;

--source include/rpl_sync.inc

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--source include/stop_group_replication.inc

--echo
--echo # STOP SLAVE is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE FOR CHANNEL "group_replication_recovery";

--echo
--echo # START SLAVE is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE FOR CHANNEL 'group_replication_recovery';

--echo
--echo # STOP SLAVE IO_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE IO_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE IO_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # STOP SLAVE SQL_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
STOP SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # START SLAVE SQL_THREAD is blocked on GR recovery channel
--error ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED
START SLAVE SQL_THREAD FOR CHANNEL 'group_replication_recovery';

--echo
--echo # SHOW SLAVE STATUS - check that recovery channel is inactive
--let $io_thread = query_get_value(SHOW SLAVE STATUS FOR CHANNEL 'group_replication_recovery', Slave_IO_Running, 1)
--let $assert_text= recovery channel is inactive
--let $assert_cond= "$io_thread" = "No"
--source include/assert.inc

--echo
--echo # SHOW RELAYLOG EVENTS - check that relaylogs are not deleted
--let $relay_log_name= query_get_value(SHOW RELAYLOG EVENTS FOR CHANNEL 'group_replication_recovery', Log_name, 1)
--let $assert_text= Relay logs are not deleted
--let $assert_cond= "$relay_log_name" <> ""
--source include/assert.inc

--echo
--echo # Execute RESET SLAVE ALL FOR CHANNEL to delete the recovery channel
--echo # and related files
RESET SLAVE ALL FOR CHANNEL "group_replication_recovery";

--echo
--echo # ERROR when executing RESET SLAVE on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
RESET SLAVE FOR CHANNEL "group_replication_recovery";

--echo
--echo # ERROR when executing FLUSH RELAY LOGS on GR recovery channel
--error ER_REPLICA_CHANNEL_DOES_NOT_EXIST
FLUSH RELAY LOGS FOR CHANNEL 'group_replication_recovery';

--source include/group_replication_end.inc