184 lines
5.1 KiB
Plaintext
184 lines
5.1 KiB
Plaintext
################################################################################
|
|
# This test intends to see if recovery can handle group updates under specific
|
|
# situations.
|
|
# It test recovery against group updates when:
|
|
# 1) There is no donor information, as Recovery did not choose yet a member
|
|
# of the group.
|
|
# 2) Recovery already ended its connection to the donor, and multiple members
|
|
# exited the group before the process is declared as finished.
|
|
#
|
|
# Test:
|
|
# 0. The test requires four servers: M1, M2, M3 and M4.
|
|
# 1. Bootstrap start GR on M1. Add some data. Start GR on M2 and M3.
|
|
# Phase1: Change the group when the Joiner did not yet choose a Donor.
|
|
# 2. Set the debug flag to block recovery on M4. Start GR on M4.
|
|
# 3. Stop GR on one of the other member(M2). The recovery process should not
|
|
# be affected. Check the server M2 is no longer member of the group.
|
|
# 4. Change the debug stop point for phase 2. Resume the recovery process on M4.
|
|
# Phase 2: Change the group after the state exchange in the Joiner ended.
|
|
# 5. Restart GR on the stopped member M2.
|
|
# 6. Stop 2 servers (M2 and M3) while recovery is not yet stopped.
|
|
# 7. Resume recovery on M4: All should be OK.
|
|
# 8. Test if the servers (M1 and M4) are working properly by replicating data.
|
|
# 9. Clean up.
|
|
################################################################################
|
|
|
|
--source include/big_test.inc
|
|
--source include/have_debug.inc
|
|
--source include/have_debug_sync.inc
|
|
--let $group_replication_group_name= 850c2d00-edc7-11e4-b80c-0800200c9a66
|
|
--source include/have_group_replication_plugin.inc
|
|
|
|
--let $rpl_server_count= 4
|
|
--let $rpl_skip_group_replication_start= 1
|
|
--source include/group_replication.inc
|
|
|
|
--echo #
|
|
--echo # Start group replication on the three servers
|
|
--echo # Add some data in to the members
|
|
--echo #
|
|
|
|
--connection server1
|
|
--echo server1
|
|
--source include/start_and_bootstrap_group_replication.inc
|
|
|
|
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (1);
|
|
|
|
--connection server2
|
|
--echo server2
|
|
--source include/start_group_replication.inc
|
|
|
|
|
|
--connection server3
|
|
--echo server3
|
|
--source include/start_group_replication.inc
|
|
|
|
|
|
--echo #
|
|
--echo # Phase 1: Change the group when the Joiner did not yet choose a Donor.
|
|
--echo #
|
|
--echo # Start group replication on server 4
|
|
--echo # Wait right after recovery is declared as running.
|
|
--echo #
|
|
|
|
--connection server4
|
|
--echo server4
|
|
|
|
SET @debug_save= @@GLOBAL.DEBUG;
|
|
|
|
--echo # Set the debug flag to block recovery
|
|
SET @@GLOBAL.DEBUG='d,recovery_thread_start_wait';
|
|
|
|
--let $group_replication_start_member_state= RECOVERING
|
|
--source include/start_group_replication.inc
|
|
|
|
#sleep to give time for the start to get stuck on recovery
|
|
--sleep 5
|
|
|
|
--echo #
|
|
--echo # Stop group replication in one of the other servers
|
|
--echo # The recovery process should not be affected.
|
|
--echo #
|
|
|
|
--connection server2
|
|
--echo server2
|
|
--source include/stop_group_replication.inc
|
|
|
|
#Get the member uuid
|
|
--let $group_member_id= query_get_value(SELECT @@SERVER_UUID, @@SERVER_UUID, 1)
|
|
|
|
--connection server4
|
|
--echo server4
|
|
|
|
#Check the server is no longer member of the group
|
|
let $wait_condition= SELECT COUNT(*)=0 FROM performance_schema.replication_group_members
|
|
WHERE member_id="$group_member_id";
|
|
--source include/wait_condition.inc
|
|
|
|
--echo #
|
|
--echo # Resume the recovery process.
|
|
--echo # The data should be there when declared online
|
|
--echo #
|
|
|
|
#Change the stop point for phase 2
|
|
SET @@GLOBAL.DEBUG= 'd,recovery_thread_wait_before_finish';
|
|
#Awake the recovery process
|
|
SET DEBUG_SYNC= "now SIGNAL signal.recovery_continue";
|
|
|
|
#Wait for the data to be there
|
|
let $wait_condition= SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 't1';
|
|
--source include/wait_condition.inc
|
|
let $wait_condition= SELECT COUNT(*)=1 FROM t1;
|
|
--source include/wait_condition.inc
|
|
|
|
--echo #
|
|
--echo # Phase 2: Change the group after the state exchange in the Joiner ended.
|
|
--echo #
|
|
--echo # Restart group replication on the stopped member
|
|
--echo #
|
|
|
|
--connection server2
|
|
--echo server2
|
|
--source include/start_group_replication.inc
|
|
|
|
--echo #
|
|
--echo # Stop 2 servers while recovery is not yet stopped.
|
|
--echo #
|
|
|
|
--connection server2
|
|
--echo server2
|
|
--source include/stop_group_replication.inc
|
|
|
|
--connection server3
|
|
--echo server3
|
|
--source include/stop_group_replication.inc
|
|
|
|
--echo #
|
|
--echo # Resume recovery: All should be OK
|
|
--echo #
|
|
|
|
--connection server4
|
|
--echo server4
|
|
|
|
SET DEBUG_SYNC= "now SIGNAL signal.recovery_end";
|
|
SET @@GLOBAL.DEBUG= @debug_save;
|
|
|
|
--let $group_replication_member_state= ONLINE
|
|
--source include/gr_wait_for_member_state.inc
|
|
|
|
--echo #
|
|
--echo # Test if the servers are working properly
|
|
--echo #
|
|
|
|
--connection server1
|
|
--echo server1
|
|
|
|
INSERT INTO t1 VALUES (2);
|
|
|
|
#sync the servers
|
|
--source include/rpl_sync.inc
|
|
|
|
--connection server4
|
|
--echo server4
|
|
|
|
--let $assert_text= On the recovered member, the table should exist and have 1 elements;
|
|
--let $assert_cond= [select count(*) from t1] = 2;
|
|
--source include/assert.inc
|
|
|
|
--echo #
|
|
--echo # Clean up
|
|
--echo #
|
|
|
|
--connection server2
|
|
--echo server2
|
|
--source include/start_group_replication.inc
|
|
|
|
--connection server3
|
|
--echo server3
|
|
--source include/start_group_replication.inc
|
|
|
|
DROP TABLE t1;
|
|
|
|
--source include/group_replication_end.inc
|