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
|
#
# The IO thread MUST not connect to RECOVERING group member because 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 server1.
# Secondaries priority is higher than primary
# 4. Create and start new channel ch1_3: server1(source),
# server3(replica)
# 5. Confirm server1 and server2 members of group are added to
# performance_schema.replication_asynchronous_connection_failover.
# 6. Wait 30 seconds and validate that replica is still connected
# to server1.
# 7. After UNLOCK tables it shall reconnect to server2
# 8. 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 server1.
--echo # 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_1 SERVER_MYPORT_1 $_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_1, '', 60, 80);
--echo
--echo # 4. Create and start new channel ch1_3: server1(source),
--echo # server3(replica)
--echo
--replace_result $SERVER_MYPORT_1 SERVER_1_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_1, SOURCE_CONNECT_RETRY=1, SOURCE_RETRY_COUNT=2 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. 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 # 7. 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 # 8. 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 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')
CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION=0 FOR CHANNEL 'ch1_3';
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
|