File: gr_autorejoin_stop_gr.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 (188 lines) | stat: -rw-r--r-- 6,571 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
################################################################################
#
# The auto-rejoin process is a mechanism that allows a server that left the
# group due to flaky network (either on his side or on the other members) to
# try to join again up to group_replication_autorejoin_tries number of times.
#
# This test shall verify that it is possible to stop the plugin while an
# auto-rejoin process is running.
#
# Test:
# 0) The test requires three servers.
# 1) Provoke a member expel.
# 2) Stop the plugin while the auto-rejoin is running on the expelled member.
# 3) Verify that the auto-rejoin process should stop immediately.
# 4) Verify that the expelled member left the group.
# 5) Set the group_replication_exit_state_action on that member to ABORT_SERVER
#    and restart the plugin.
# 6) Expel that member again.
# 7) Stop the plugin while the auto-rejoin is running on that member.
# 8) Verify that it didn't abort and that it left the group.
# 9) Cleanup.
#
################################################################################
--source include/have_debug_sync.inc
--source include/big_test.inc
--source include/linux.inc
--source include/have_group_replication_plugin.inc
--let $rpl_server_count = 3
--source include/group_replication.inc

--echo
--echo ####
--echo # 0) The test requires three servers.
--echo ####
--echo
--let $rpl_connection_name = server1
--source include/rpl_connection.inc

SET sql_log_bin = 0;
call mtr.add_suppression("Member was expelled from the group due to network failures, changing member status to ERROR.");
call mtr.add_suppression("The server was automatically set into read only mode after an error was detected.");
call mtr.add_suppression("\\[GCS\\] The member has left the group but the new view will not be installed, probably because it has not been delivered yet.");
call mtr.add_suppression("\\[GCS\\] read failed");
call mtr.add_suppression("Started auto-rejoin procedure attempt*");
call mtr.add_suppression("Auto-rejoin procedure attempt*");
--disable_query_log # No need for the result file to specify suppressions.
call mtr.add_suppression("\\[GCS\\] There is no local IP address matching the one configured for the local node .*");
call mtr.add_suppression("Unable to initialize the group communication engine");
--enable_query_log
SET sql_log_bin = 1;

--source include/gr_autorejoin_monitoring.inc

--echo
--echo ####
--echo # 1) Provoke a member expel.
--echo ####
--echo
# Save the local address so we can restore it later
--let $local_address_server = `SELECT @@GLOBAL.group_replication_local_address`

# First, enable auto-rejoin
SET GLOBAL group_replication_autorejoin_tries = 2016;

# Enable debug sync point before rejoin(), so we can manually trigger a failure
SET @debug_saved = @@GLOBAL.DEBUG;

# Mess up the local address so we trigger a join failure
SET GLOBAL group_replication_local_address = "128.0.0.1:3306";

# Force expel on member 1
--let $member_id = `SELECT @@GLOBAL.server_uuid`
--source include/gr_expel_member_from_group.inc

# Wait until auto-rejoin starts
--let $wait_condition = SELECT IS_AUTOREJOIN_RUNNING() = TRUE
--source include/wait_condition_or_abort.inc

--echo
--echo ####
--echo # 2) Stop the plugin while the auto-rejoin is running on the expelled
--echo # member.
--echo ####
--echo
--source include/stop_group_replication.inc

--echo
--echo ####
--echo # 3) Verify that the auto-rejoin process should stop immediately.
--echo ####
--echo
--let $wait_condition = SELECT IS_AUTOREJOIN_RUNNING() = FALSE
--source include/wait_condition_or_abort.inc

--echo
--echo ####
--echo # 4) Verify that the expelled member left the group.
--echo ####
--echo
# Verify the view on server 2
--let $rpl_connection_name = server2
--source include/rpl_connection.inc

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

--let $assert_text = Member 1 should not be in the group
--let $assert_cond = COUNT(*) = 0 FROM performance_schema.replication_group_members WHERE MEMBER_ID = "$member_id"
--source include/assert.inc

# Then on server 3
--let $rpl_connection_name = server3
--source include/rpl_connection.inc

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

--let $assert_text = Member 1 should not be in the group
--let $assert_cond = COUNT(*) = 0 FROM performance_schema.replication_group_members WHERE MEMBER_ID = "$member_id"
--source include/assert.inc

--echo
--echo ####
--echo # 5) Set the group_replication_exit_state_action on that member to
--echo # ABORT_SERVER and restart the plugin.
--echo ####
--echo
--let $rpl_connection_name = server1
--source include/rpl_connection.inc

SET @saved_exit_state_action = @@GLOBAL.group_replication_exit_state_action;

SET @@GLOBAL.group_replication_exit_state_action = ABORT_SERVER;
--replace_result $local_address_server LOCAL_ADDRESS_SERVER
--eval SET GLOBAL group_replication_local_address = "$local_address_server"

# Restart the plugin
--source include/start_group_replication.inc

--echo
--echo ####
--echo # 6) Expel that member again.
--echo ####
--echo
# Mess up the local address so we trigger a join failure
SET GLOBAL group_replication_local_address = "128.0.0.1:3306";

SET @@GLOBAL.DEBUG='+d,group_replication_stop_before_rejoin_loop';
SET @@GLOBAL.DEBUG='+d,group_replication_long_retry';
SET @@GLOBAL.DEBUG='-d,group_replication_stop_before_rejoin';

# Expel member again
--source include/gr_expel_member_from_group.inc

--echo
--echo ####
--echo # 7) Stop the plugin while the auto-rejoin is running on that member.
--echo ####
--echo
SET DEBUG_SYNC = "now WAIT_FOR signal.autorejoin_entering_loop";
SET DEBUG_SYNC = "now SIGNAL signal.autorejoin_enter_loop";
--source include/stop_group_replication.inc

--echo
--echo ####
--echo # 8) Verify that it didn't abort and that it left the group.
--echo ####
--echo
# Should be in OFFLINE state
--let $group_replication_member_state= OFFLINE
--let $group_replication_member_id= $member_id
--source include/gr_wait_for_member_state.inc

# Reset GR
--replace_result $local_address_server LOCAL_ADDRESS_SERVER
--eval SET GLOBAL group_replication_local_address = "$local_address_server"
--source include/start_group_replication.inc

--echo
--echo ####
--echo # 9) Cleanup.
--echo ####
--echo
SET @@GLOBAL.DEBUG = @debug_saved;
SET GLOBAL group_replication_autorejoin_tries = default;
SET GLOBAL group_replication_exit_state_action = @saved_exit_state_action;
--source include/gr_end_autorejoin_monitoring.inc
--source include/group_replication_end.inc