File: gr_recovery_completion_mode_failure.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 (159 lines) | stat: -rw-r--r-- 4,996 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
################################################################################
# This test evaluates that when a policy cannot be enforced, recovery fails
#
# Test:
#   0. The test requires two servers.
#   1. Create 2 tables (t1,t2) on both servers.
#   2. Start group replication on server1 with some data inserted on t1.
#      Change recovery policy on server2 to wait for transaction execution i.e.
#      transactions_applied.
#   3. Lock table t1 on server2 and start group replication to block first
#      phase of recovery. Recovery will get stuck as the member can't execute
#      data on t1.
#   4. Insert some data on t2 on server1.
#      Recovery application of cached data is waiting on the state transfer
#      completion.
#   5. Fake a stopped applier thread during recovery.
#   6. Unlock t1 and recovery first phase will unblock.
#      The member should error out as it can't execute cached transactions.
#   7. Clean up.
################################################################################

--source include/big_test.inc
--source include/have_debug.inc
--let $group_replication_group_name= a5980950-41c7-11e5-b970-0800200c9a66
--source include/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--source include/group_replication.inc

--echo #
--echo # Create t1 and t2 on both servers
--echo # Start group replication on server 1 and insert 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;

call mtr.add_suppression("It is not possible to ensure the execution of group*");
call mtr.add_suppression("Unable to ensure the execution of group*");
call mtr.add_suppression("Fatal error during the incremental recovery process of Group Replication.*");
call mtr.add_suppression("The member is leaving a group without being on one");
call mtr.add_suppression("The member is already leaving or joining a group.");
call mtr.add_suppression("Error leaving the group");
call mtr.add_suppression("Skipping leave operation: concurrent attempt to leave the group is on-going.");
call mtr.add_suppression("Can't evaluate the group replication applier execution status. Group replication recovery will shutdown to avoid data corruption.");
call mtr.add_suppression("The server was automatically set into read only mode after an error was detected.");
SET SESSION sql_log_bin=1;

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

--connection server2
--echo server2

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

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

--connection server_2
--echo server_2 (server2)

LOCK TABLE t1 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 # Fake a stopped applier thread during recovery.
--echo #

--connection server2
--echo server2

SET @@GLOBAL.DEBUG= '+d,group_replication_wait_for_gtid_execution_force_error';

--echo #
--echo # UnLock table t1: First phase of recovery can carry on.
--echo # Member 2 will error out as it can't wait for data execution
--echo #

--connection server_2
--echo server_2 (server2)

UNLOCK TABLES;

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

SET @@GLOBAL.DEBUG= '-d,group_replication_wait_for_gtid_execution_force_error';

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

--connection server1
--echo server1

--let $group_replication_number_of_members= 1
--source include/gr_wait_for_number_of_members.inc

--connection server2
--echo server2

--source include/stop_group_replication.inc
--source include/start_group_replication.inc

DROP TABLE t1;
DROP TABLE t2;

SET GLOBAL group_replication_recovery_complete_at= @configured_rec_policy;

--source include/group_replication_end.inc