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
|
################################################################################
# Multi master member state change test
# This test serves the purpose of evaluating the state changes a member can
# undergo.
#
# The state changes tested are:
# 1) Single member group
# Member 1: Offline => Online
# 2) Member joining into existing group
# Member 2: Offline => Recovering => Online
# 3) Member leaving (after adding another member to guarantee quorum):
# Member 3: Online => Offline
# 4) Clean up.
################################################################################
--source include/have_debug.inc
--source include/have_debug_sync.inc
--let $group_replication_group_name= 89ab83b0-9f17-11e3-a5e2-0800200c9a66
--source include/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--let $rpl_server_count= 3
--source include/group_replication.inc
SET @debug_save= @@GLOBAL.DEBUG;
--echo #
--echo # 1) Setup a new single member group
--echo #
--connection server1
--echo server1
--echo # Set the debug flag to block recovery
SET @@GLOBAL.DEBUG='d,recovery_thread_wait_before_finish';
--echo # Member should be offline before start
--let $assert_text= On the new stopped member, the status is OFFLINE
--let $assert_cond= [select count(*) from performance_schema.replication_group_members WHERE member_state="OFFLINE"] = 1;
--source include/assert.inc
--source include/start_and_bootstrap_group_replication.inc
--echo # Member should be online as the member is alone and doesn't need recovery
--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc
--echo #
--echo # 2) A new member enters the existing group
--echo #
# Block the applier on server 1 so view change event wont be written and recovery blocks on server 2
SET @@GLOBAL.DEBUG='+d,block_applier_updates';
--connection server2
--echo server2
--echo # Member should be marked as on recovery on both members
--let $group_replication_start_member_state= RECOVERING
--source include/start_group_replication.inc
--let $group_replication_member_id= query_get_value(SELECT @@SERVER_UUID, @@SERVER_UUID, 1)
--connection server1
--echo server1
--let $group_replication_member_state= RECOVERING
--source include/gr_wait_for_member_state.inc
#Unblock recovery
SET DEBUG_SYNC = "now WAIT_FOR applier_read_blocked";
SET @@GLOBAL.DEBUG='-d,block_applier_updates';
SET DEBUG_SYNC = "now SIGNAL resume_applier_read";
--connection server2
--echo server2
--echo # Member should be marked as online on both members
--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc
--connection server1
--echo server1
SET DEBUG_SYNC= 'RESET';
--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc
--echo #
--echo # 3) A member leaves the existing group
--echo #
--echo # Add a new member to hold quorum
--connection server3
--echo server3
--source include/start_group_replication.inc
--echo # Member should be marked as online
#reset the member id variable as it was pointing server 2
--let $group_replication_member_id=
--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc
--echo # Member should be marked as offline after stop
--let $group_replication_member_state= OFFLINE
--source include/gr_wait_for_member_state.inc
--echo #
--echo # Cleaning up
--echo #
--let $server_count=3
while ($server_count)
{
--connection server$server_count
--echo server$server_count
SET @@GLOBAL.DEBUG= @debug_save;
--dec $server_count
}
--source include/group_replication_end.inc
|