# # The IO thread MUST not connect to RECOVERING group member and should # get re-connect to ONLINE member of the group as recovery can take time # and that would unnecessary delay receiver in getting binary logs. # # Test: # # 0. The test requires 3 servers: # server1: primary # server2: secondary # server3: single server replica # 1. Bootstrap group with server1 # 2. Lock server2 on recovery and join it to the group # 3. Establish managed connection between server3 and server2 secondary # and locked on recovery. Secondaries priority is higher than primary # 4. Create and start new channel ch1_3: server2(source), # server3(replica) # 5. Confirm server1 and server2 members of group are added to # performance_schema.replication_asynchronous_connection_failover. # 6. Confirm connection is done with server1 due to server2 being on # recovery. # 7. Wait 30 seconds and validate that replica is still connected # to server1. # 8. After UNLOCK tables it shall reconnect to server2 # 9. Cleanup # --source include/have_group_replication_plugin.inc --let $rpl_skip_group_replication_start= 1 --let $rpl_server_count= 3 --let $rpl_group_replication_single_primary_mode=1 --source include/group_replication.inc --echo --echo # 1. Bootstrap group with server1 --echo --let $rpl_connection_name= server1 --source include/rpl_connection.inc set session sql_log_bin=0; CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY , b INT); set session sql_log_bin=1; --source include/start_and_bootstrap_group_replication.inc INSERT INTO test.t1 (b) VALUES (1); --let $member1_uuid = `SELECT @@GLOBAL.server_uuid` --let $_tmp_gr_group_name= `SELECT @@GLOBAL.group_replication_group_name` --echo --echo # 2. Lock server2 on recovery and join it to the group --echo --let $rpl_connection_name= server2 --source include/rpl_connection.inc set session sql_log_bin=0; CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY , b INT); set session sql_log_bin=1; --let $rpl_connection_name= server_2 --source include/rpl_connection.inc LOCK TABLES t1 READ; --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $member2_uuid = `SELECT @@GLOBAL.server_uuid` --let $group_replication_start_member_state= RECOVERING --source include/start_group_replication.inc --echo --echo # 3. Establish managed connection between server3 and server2 secondary --echo # and locked on recovery. Secondaries priority is higher than primary --echo --let $rpl_connection_name= server3 --source include/rpl_connection.inc set session sql_log_bin=0; CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY , b INT); set session sql_log_bin=1; --replace_result $SERVER_MYPORT_2 SERVER_MYPORT_2 $_tmp_gr_group_name FAILOVER_GROUP_NAME --eval SELECT asynchronous_connection_failover_add_managed('ch1_3', 'GroupReplication', '$_tmp_gr_group_name', '127.0.0.1', $SERVER_MYPORT_2, '', 60, 80); --echo --echo # 4. Create and start new channel ch1_3: server2(source), --echo # server3(replica) --echo --replace_result $SERVER_MYPORT_2 SERVER_2_PORT --eval CHANGE REPLICATION SOURCE TO SOURCE_HOST='127.0.0.1', SOURCE_USER='root', SOURCE_AUTO_POSITION=1, SOURCE_CONNECTION_AUTO_FAILOVER=1, SOURCE_PORT=$SERVER_MYPORT_2, SOURCE_CONNECT_RETRY=1, SOURCE_RETRY_COUNT=1 FOR CHANNEL 'ch1_3' --let $rpl_channel_name='ch1_3' --source include/start_slave.inc --let $rpl_channel_name= --echo --echo # 5. Confirm server1 and server2 members of group are added to --echo # performance_schema.replication_asynchronous_connection_failover. --echo --let $wait_condition= SELECT COUNT(*)=2 FROM performance_schema.replication_asynchronous_connection_failover; --source include/wait_condition.inc --echo --echo # 6. Confirm connection is done with server1 due to server2 being on --echo # recovery. --echo --let $wait_condition= SELECT COUNT(*)=1 COUNT FROM performance_schema.replication_connection_status WHERE channel_name = "ch1_3" AND source_uuid = "$member1_uuid" --source include/wait_condition.inc --echo --echo # 7. Wait 30 seconds and validate that replica is still connected --echo # to server1. --echo --sleep 30 --let $assert_text= Verify server1 is on replication_asynchronous_connection_failover --let $assert_cond= [SELECT count(*) COUNT FROM performance_schema.replication_connection_status WHERE channel_name = "ch1_3" AND source_uuid = "$member1_uuid", COUNT, 1] = "1" --source include/assert.inc --echo --echo # 8. After UNLOCK tables it shall reconnect to server2 --echo --let $rpl_connection_name= server_2 --source include/rpl_connection.inc UNLOCK TABLES; --let $group_replication_member_state= ONLINE --source include/gr_wait_for_member_state.inc --let $rpl_connection_name= server3 --source include/rpl_connection.inc --let $wait_condition= SELECT COUNT(*)=1 COUNT FROM performance_schema.replication_connection_status WHERE channel_name = "ch1_3" AND source_uuid = "$member2_uuid" --source include/wait_condition.inc --echo --echo # 9. Cleanup --echo SET SESSION sql_log_bin = 0; call mtr.add_suppression("The source .* for channel 'ch1_3' has joined the group .*, and so added its entry into replication_asynchronous_connection_failover table."); call mtr.add_suppression("The master's UUID has changed, although this should not happen unless you have changed it manually. The old UUID was.*"); call mtr.add_suppression("The IO thread detected that the source .* does not belong to the group majority, thence the channel .* will try to connect to another source."); call mtr.add_suppression("The group .* for the channel .* has been removed, and so removed its entry from replication_asynchronous_connection_failover_managed and all the group members from replication_asynchronous_connection_failover table."); call mtr.add_suppression("The group .* for the channel .* has been added, and so added its entry in replication_asynchronous_connection_failover_managed and source to replication_asynchronous_connection_failover table."); SET SESSION sql_log_bin = 1; --let $rpl_channel_name='ch1_3' --source include/stop_slave.inc --let $rpl_reset_slave_all= 1 --let $rpl_multi_source= 1 --source include/rpl_reset_slave.inc --let $rpl_channel_name= --let $rpl_reset_slave_all= --let $rpl_multi_source= --replace_result $group_replication_group_name GROUP_NAME --eval SELECT asynchronous_connection_failover_delete_managed('ch1_3', '$group_replication_group_name') DROP TABLE t1; --let $rpl_connection_name= server1 --source include/rpl_connection.inc DROP TABLE t1; --let $rpl_skip_sync= 1 --let $rpl_only_running_threads= 1 --source include/group_replication_end.inc