File: gr_majority_loss_restart.inc

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 (195 lines) | stat: -rw-r--r-- 7,665 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
################################################################################
# Validate that when a group looses the majority, if the faulty member tries to
# rejoin it will be disallowed to unblock the group and user needs to use
# group_replication_force_members option.
#
# 0. Start with 2 servers running GR
# 1. Crash server 2.
# 2. Execute a transaction on server 1, which will block
#    since the group does not have majority.
# 3. Assert that group is still blocked.
# 4. Restart server 2 with group_replication_start_on_boot=ON,
#    server 2 will be refused to join the group.
# 5. Unblock group with server1 as a single member.
# 6. Check that statement did unblock and was applied on
#    server1.
# 7. Rejoin server2
# 8. Execute a transaction on both members.
# 9. Validate data.
#10. Clean up.
################################################################################
# This test does crashes servers, thence we skip it on valgrind.
--source include/not_valgrind.inc
--source include/big_test.inc
--source include/force_restart.inc
--source include/have_group_replication_plugin.inc
--source include/group_replication.inc

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $member1_uuid= query_get_value(SELECT @@SERVER_UUID, @@SERVER_UUID, 1)
--let $member1_group_replication_local_address= `SELECT @@GLOBAL.group_replication_local_address`

set session sql_log_bin=0;
call mtr.add_suppression("Old incarnation found while trying to add node*.*");
set session sql_log_bin=1;

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $member2_uuid= query_get_value(SELECT @@SERVER_UUID, @@SERVER_UUID, 1)
--let $member2_group_replication_local_address= `SELECT @@GLOBAL.group_replication_local_address`
--let $member2_group_replication_group_seeds= `SELECT @@GLOBAL.group_replication_group_seeds`

SET SESSION sql_log_bin= 0;
call mtr.add_suppression("Timeout on wait for view after joining group");
call mtr.add_suppression("read failed");
call mtr.add_suppression("The member was unable to join the group. Local port: *.*");
call mtr.add_suppression("Error connecting to all peers. Member join failed. Local port: *.*");
SET SESSION sql_log_bin= 1;


--echo
--echo ############################################################
--echo # 1. Crash server 2.
--let $rpl_connection_name= server2
--source include/rpl_connection.inc

--source include/kill_and_restart_mysqld.inc
--source include/rpl_reconnect.inc

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

--let $group_replication_member_state= UNREACHABLE
--let $group_replication_member_id= $member2_uuid
--source include/gr_wait_for_member_state.inc


--echo
--echo ############################################################
--echo # 2. Execute a transaction on server 1, which will block
--echo #    since the group does not have majority.
--let $rpl_connection_name= server_1
--source include/rpl_connection.inc
# This transaction will be blocked since group lost its majority.
# Though it needs to be delivered to the group when unblocked.
--send CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY)

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $wait_condition= SELECT PROCESSLIST_STATE="waiting for handler commit" FROM performance_schema.threads WHERE processlist_INFO LIKE "CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY)"
--source include/wait_condition.inc


--echo
--echo ############################################################
--echo # 3. Assert that group is still blocked.
--let $group_replication_number_of_members= 2
--source include/gr_wait_for_number_of_members.inc

--let $assert_text= server 2 is marked as unreachable
--let $assert_cond= [SELECT COUNT(*) FROM performance_schema.replication_group_members WHERE member_id="$member2_uuid" AND member_state="UNREACHABLE"] = 1
--source include/assert.inc


--echo
--echo ############################################################
--echo # 4. Restart server 2 with group_replication_start_on_boot=ON,
--echo #    server 2 will be refused to join the group.
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $restart_parameters=restart:--group_replication_local_address=$member2_group_replication_local_address --group_replication_group_seeds=$member2_group_replication_group_seeds --group_replication_start_on_boot=ON --group-replication-group-name=$group_replication_group_name
--replace_result $group_replication_group_name GROUP_REPLICATION_GROUP_NAME $member2_group_replication_local_address GROUP_REPLICATION_LOCAL_ADDRESS $member2_group_replication_group_seeds GROUP_REPLICATION_GROUP_SEEDS
--source include/kill_and_restart_mysqld.inc

# Give it some time to try and fail
--sleep 75

--let $rpl_server_number= 2
--source include/rpl_reconnect.inc
--let $group_replication_member_state= OFFLINE
--source include/gr_wait_for_member_state.inc

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $assert_text= server 2 is marked as unreachable
--let $assert_cond= [SELECT COUNT(*) FROM performance_schema.replication_group_members WHERE member_id="$member2_uuid" AND member_state="UNREACHABLE"] = 1
--source include/assert.inc


--echo
--echo ############################################################
--echo # 5. Unblock group with server1 as a single member.
--let $local_address_server1= `SELECT @@GLOBAL.group_replication_local_address`
--replace_result $local_address_server1 SERVER1_ADDRESS
--eval SET GLOBAL group_replication_force_members= "$local_address_server1"


--echo
--echo ############################################################
--echo # 6. Check that statement did unblock and was applied on
--echo #    server1.
--let $rpl_connection_name= server_1
--source include/rpl_connection.inc
--reap

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $wait_condition= SELECT COUNT(*)=1 FROM information_schema.tables WHERE TABLE_SCHEMA="test" AND TABLE_NAME="t1";
--source include/wait_condition.inc


--echo
--echo ############################################################
--echo # 7. Rejoin server2
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
# Ensure that GR is already stopped on server2.
--let $skip_assert_read_only= 1
--source include/stop_group_replication.inc
--source include/start_group_replication.inc


--echo
--echo ############################################################
--echo # 8. Execute a transaction on both members.
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
INSERT INTO t1 VALUES (1);

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

--source include/rpl_sync.inc


--echo
--echo ############################################################
--echo # 9. Validate data.
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $assert_text= 'There are two values in table t1'
--let $assert_cond= [SELECT COUNT(*) AS count FROM t1, count, 1] = 2
--source include/assert.inc
--source include/show_binlog_events.inc

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $assert_text= 'There are two values in table t1'
--let $assert_cond= [SELECT COUNT(*) AS count FROM t1, count, 1] = 2
--source include/assert.inc

--let $binlog_file= LAST
--source include/show_binlog_events.inc

--let $diff_tables= server1:test.t1, server2:test.t1
--source include/diff_tables.inc


--echo
--echo ############################################################
--echo # 10. Clean up.
DROP TABLE t1;

--source include/group_replication_end.inc