1################################################################################ 2# 3# The auto-rejoin process is a mechanism that allows a server that left the 4# group due to flaky network (either on his side or on the other members) to 5# try to join again up to group_replication_autorejoin_tries number of times. 6# 7# This test shall verify that upon a member expel, if auto-rejoin is enabled, 8# the expelled member will try to rejoin the group up to 9# group_replication_autorejoin_tries number of times. It will also verify that, 10# if the rejoining member was a primary before being expelled, when that member 11# is successfully rejoined to the group, it will remain a secondary. 12# 13# Test: 14# 0) The test requires three servers (in single-primary mode). 15# 1) Expel the primary. 16# 2) Verify that the expelled member will try to rejoin the group the number of 17# times it is configured in group_replication_autorejoin_tries sysvar. 18# 3) Verify that it manages to rejoin the group 19# 4) Verify that the newly rejoined member is no longer the primary. 20# 5) Cleanup. 21# 22################################################################################ 23--source include/big_test.inc 24--source include/have_debug_sync.inc 25--source include/linux.inc 26--source include/have_group_replication_plugin.inc 27# 28# We manually start the group because we need to set the rejoin timeout before 29# the START GROUP_REPLICATION command. 30# 31--let $rpl_skip_group_replication_start= 1 32--let $rpl_server_count = 3 33--let $rpl_group_replication_single_primary_mode=1 34--source include/group_replication.inc 35 36--echo 37--echo #### 38--echo # 0) The test requires three servers. 39--echo #### 40--echo 41SET sql_log_bin = 0; 42call mtr.add_suppression("Member was expelled from the group due to network failures, changing member status to ERROR."); 43call mtr.add_suppression("The server was automatically set into read only mode after an error was detected."); 44call mtr.add_suppression("Started auto-rejoin procedure attempt*"); 45call mtr.add_suppression("Auto-rejoin procedure attempt*"); 46SET sql_log_bin = 1; 47 48--source include/gr_autorejoin_monitoring.inc 49 50SET @debug_saved = @@GLOBAL.DEBUG; 51SET @@GLOBAL.DEBUG='+d,group_replication_rejoin_short_retry'; 52SET @@GLOBAL.DEBUG='+d,group_replication_stop_before_rejoin'; 53 54--source include/start_and_bootstrap_group_replication.inc 55 56--let $rpl_connection_name = server2 57--source include/rpl_connection.inc 58 59--source include/start_group_replication.inc 60 61--let $rpl_connection_name = server3 62--source include/rpl_connection.inc 63 64--source include/start_group_replication.inc 65 66--echo 67--echo #### 68--echo # 1) Expel one of the members. 69--echo #### 70--echo 71--let $rpl_connection_name = server1 72--source include/rpl_connection.inc 73 74# First, enable auto-rejoin 75SET GLOBAL group_replication_autorejoin_tries = 1; 76 77# Force expel on member 1 78--let $member_id = `SELECT @@GLOBAL.server_uuid` 79--source include/gr_expel_member_from_group.inc 80 81--echo 82--echo #### 83--echo # 2) Verify that the expelled member will try to rejoin the group the 84--echo # number of it is configured in group_replication_autorejoin_tries 85--echo # sysvar. 86--echo #### 87--echo 88--let $rpl_connection_name = server1 89--source include/rpl_connection.inc 90 91SET DEBUG_SYNC = "now WAIT_FOR signal.autorejoin_waiting"; 92 93# Wait for the group to stabilize and find a new primary 94--let $rpl_connection_name = server2 95--source include/rpl_connection.inc 96 97--let $group_replication_number_of_members = 2 98--source include/gr_wait_for_number_of_members.inc 99 100--let $rpl_connection_name = server3 101--source include/rpl_connection.inc 102 103--let $group_replication_number_of_members = 2 104--source include/gr_wait_for_number_of_members.inc 105 106--source include/gr_find_a_primary.inc 107if (!$group_replication_found_primary_out_var) 108{ 109 --die "Should have found a primary after member expel!" 110} 111 112--let $rpl_connection_name = server1 113--source include/rpl_connection.inc 114 115# Verify that auto-rejoin is currently running 116--let $assert_text = Auto-rejoin should be running 117--let $assert_cond = [SELECT IS_AUTOREJOIN_RUNNING()] = TRUE 118--source include/assert.inc 119 120--let $assert_text= super_read_only should be enabled 121--let $assert_cond= [SELECT @@GLOBAL.super_read_only] = 1; 122--source include/assert.inc 123 124# Verify that it attempted one try 125--let $assert_text = We should have attempted 1 rejoin 126--let $assert_cond = [SELECT GET_NUMBER_RETRIES()] = 1 127--source include/assert.inc 128 129SET DEBUG_SYNC = "now SIGNAL signal.autorejoin_continue"; 130 131# Verify that the auto-rejoin process has terminated 132--let $wait_condition = SELECT IS_AUTOREJOIN_RUNNING() = FALSE 133--source include/wait_condition_or_abort.inc 134 135--echo 136--echo #### 137--echo # 3) Verify that it manages to rejoin the group. 138--echo #### 139--echo 140--let $group_replication_member_state = ONLINE 141--let $group_replication_member_id = $member_id 142--source include/gr_wait_for_member_state.inc 143 144--let $group_replication_number_of_members = 3 145--source include/gr_wait_for_number_of_members.inc 146 147--let $rpl_connection_name = server2 148--source include/rpl_connection.inc 149 150--let $group_replication_number_of_members = 3 151--source include/gr_wait_for_number_of_members.inc 152 153--let $rpl_connection_name = server3 154--source include/rpl_connection.inc 155 156--let $group_replication_number_of_members = 3 157--source include/gr_wait_for_number_of_members.inc 158 159--echo 160--echo #### 161--echo # 4) Verify that the newly rejoined member is no longer the primary. 162--echo #### 163--echo 164--let $rpl_connection_name = server1 165--source include/rpl_connection.inc 166 167--source include/gr_assert_secondary_member.inc 168 169--echo 170--echo #### 171--echo # 5) Cleanup. 172--echo #### 173--echo 174# Stop the GR plugin so that we leave super read-only mode and drop the auto-rejoin monitoring functions 175--source include/stop_group_replication.inc 176 177SET @@GLOBAL.DEBUG = @debug_saved; 178SET @@GLOBAL.group_replication_autorejoin_tries = default; 179--source include/gr_end_autorejoin_monitoring.inc 180--source include/group_replication_end.inc 181