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 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
|
################################################################################
# This test evaluates both recovery policies on when a member should become
# online.
#
# Test:
# 0. The test requires two servers.
#
# Phase 1: Recovery only waits for the certification of all cached transactions
# 1. Create 2 tables (t1,t2) on both servers
# 2. Start group replication on server1 with some data inserted on t1
# 3. Lock table t1 on server 2 and start group replication
# Recovery will get stuck as the member can't execute data on t1
# 4. Lock table t2 on server 2 and insert some data on t2 on server 1
# Recovery application of cached data is blocked as t2 is locked
# 5. Unlock t1 and recovery first phase will unblock.
# The member should become online as it does not wait for the application
# of cached transactions, only its certification.
# 6. Clean up.
#
# Phase 2: Recovery waits for the execution of all executed transactions
# 1. Create 2 tables (t1,t2) on both servers
# 2. Start group replication on server1 with some data inserted on t1
# 3. Lock table t1 on server 2 and start group replication
# Recovery will get stuck as the member can't execute data on t1
# 4. Lock table t2 on server 2 and insert some data on t2 on server 1
# Recovery application of cached data is blocked as t2 is locked
# 5. Unlock t1 and recovery first phase will unblock.
# The member should still be on recovery as the server is waiting for the
# execution of cached transactions and t2 is locked.
# 6. Unlock t2 and the application of cached transactions will unblock.
# The member should become online.
# 7. Clean up.
################################################################################
--source include/big_test.inc
--let $group_replication_group_name= 08033a70-3560-11e5-a2cb-0800200c9a66
--source include/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--source include/group_replication.inc
--echo ######################################################################
--echo # Phase 1:
--echo # Recovery only waits for the certification of all cached transactions
--echo ######################################################################
--echo #
--echo # Create t1 and t2 on both servers
--echo # Start group replication on server 1 after inserting data on t1
--echo #
--connection server1
--echo server1
SET SESSION sql_log_bin=0;
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE t2 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
SET SESSION sql_log_bin=1;
--source include/start_and_bootstrap_group_replication.inc
INSERT INTO t1 VALUES (1);
--connection server2
--echo server2
SET SESSION sql_log_bin=0;
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE t2 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
SET SESSION sql_log_bin=1;
--echo #
--echo # Lock table t1 and table t2 on server 2
--echo # Table t1: Blocks first phase of recovery
--echo # Table t2: Blocks second phase of recovery
--echo #
SET @configured_rec_policy= @@GLOBAL.group_replication_recovery_complete_at;
SET GLOBAL group_replication_recovery_complete_at= "transactions_certified";
--connection server_2
--echo server_2 (server2)
LOCK TABLE t1 READ;
--connection slave
--echo slave (server2)
LOCK TABLE t2 READ;
--echo #
--echo # Start group replication on server 2 and check it is stuck on recovery
--echo #
--connection server2
--echo server2
--let $group_replication_start_member_state= RECOVERING
--source include/start_group_replication.inc
--echo #
--echo # Insert some transaction on server 1 that will be cached on server 2
--echo #
--connection server1
--echo server1
# Wait for the View Change event to reach the binlog.
--eval SELECT WAIT_FOR_EXECUTED_GTID_SET('$group_replication_group_name:3')
INSERT INTO t2 VALUES (1);
--echo #
--echo # UnLock table t1: First phase of recovery can carry on.
--echo # Member 1 is online as it only waits for certification of cached data
--echo #
--connection server_2
--echo server_2 (server2)
UNLOCK TABLES;
--connection server2
--echo server2
--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc
--echo #
--echo # UnLock table t2: Second phase of recovery can carry on.
--echo # The data should be there.
--echo #
--connection slave
--echo slave (server2)
UNLOCK TABLES;
--let $wait_condition= SELECT COUNT(*)=1 FROM t2;
--source include/wait_condition.inc
--echo #
--echo # Phase 1 cleanup
--echo # Remove the data from the tables and stop group replication on server 2
--echo #
--connection server1
--echo server1
TRUNCATE TABLE t1;
TRUNCATE TABLE t2;
--source include/rpl_sync.inc
--connection server2
--echo server2
--source include/stop_group_replication.inc
--echo ######################################################################
--echo # Phase 2:
--echo # Recovery waits for the execution of all executed transactions
--echo ######################################################################
--echo #
--echo # Start group replication on server 1 after inserting data on t1
--echo #
--connection server1
--echo server1
INSERT INTO t1 VALUES (1);
--echo #
--echo # Change recovery policy on server 2 to wait for transaction execution.
--echo #
--connection server2
--echo server2
SET GLOBAL group_replication_recovery_complete_at= "transactions_applied";
--echo #
--echo # Lock table t1 and table t2 on server 2
--echo # Table t1: Blocks first phase of recovery
--echo # Table t2: Blocks second phase of recovery
--echo #
--connection server_2
--echo server_2 (server2)
LOCK TABLE t1 READ;
--connection slave
--echo slave (server2)
LOCK TABLE t2 READ;
--echo #
--echo # Start group replication on server 2 and check it is stuck on recovery
--echo #
--connection server2
--echo server2
--let $group_replication_start_member_state= RECOVERING
--source include/start_group_replication.inc
--echo #
--echo # Insert some transaction on server 1 that will be cached on server 2
--echo #
--connection server1
--echo server1
INSERT INTO t2 VALUES (1);
--echo #
--echo # Wait for the transactions to be cached on server 2
--echo #
--connection server2
--echo server2
--let $wait_condition= SELECT COUNT_TRANSACTIONS_IN_QUEUE=2 FROM performance_schema.replication_group_member_stats where member_id in (SELECT @@server_uuid);
--source include/wait_condition.inc
--echo #
--echo # UnLock table t1: First phase of recovery can carry on.
--echo # Member 2 is still recovering as it can't apply cached data
--echo #
--connection server_2
--echo server_2 (server2)
UNLOCK TABLES;
--connection server2
--echo server2
--let $server2_uuid= `SELECT @@GLOBAL.SERVER_UUID`
--let $member_state= query_get_value(SELECT Member_State from performance_schema.replication_group_members WHERE member_id= '$server2_uuid', Member_State, 1)
--let $assert_text= The value of member_state should be recovering
--let $assert_cond= "$member_state" = "RECOVERING"
--source include/assert.inc
--echo #
--echo # UnLock table t2: Second phase of recovery can carry on.
--echo # The data should be there and the member should now be online.
--echo #
--connection slave
--echo slave (server2)
UNLOCK TABLES;
--let $wait_condition= SELECT COUNT(*)=1 FROM t2;
--source include/wait_condition.inc
--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc
--echo #
--echo # Test cleanup
--echo #
--connection server2
--echo server2
DROP TABLE t1;
DROP TABLE t2;
SET GLOBAL group_replication_recovery_complete_at= @configured_rec_policy;
--source include/group_replication_end.inc
|