############################################################################### # # When switching to a primary server or changing mode to single primary # with an appointed primary, P, if P leaves or fails under a majority, # after the election finalizes, change terminates and the # group elects a new primary. A warning is thrown to the user. # # Test: # 0. This test needs three servers # 1. Members in Multi Primary Mode, create two tables and rpl_sync # 2. On a member server2 that will be secondary lock a table t1 # 3. On other member insert value on table locked on server2 # 4. Execute action to change to single primary with server1 as primary # 5. Check that the other members are waiting for members to be in read # mode. Stages should be # - Primary Election: waiting for members to enable super_read_only # - Single-primary Switch: executing Primary election - completed work 0 # 6. Lock a table t2 on the primary server1 # 7. Insert something on t2 on server2, the locked secondary # 8. Unlock table t1 on server2, the locked secondary # 9. Stage should be # - Single-primary Switch: executing Primary election - completed work 1 # 10. Kill the new primary server1 # 11. Check that the action finishes # 12. Check server2 was able to insert value # 13. Using weights one can assert here that primary is now server3 # 14. Cleanup # ############################################################################### --source include/have_group_replication_plugin.inc --source include/not_valgrind.inc --let $rpl_server_count= 3 --source include/group_replication.inc --echo --echo # 1. Members in Multi Primary Mode, create two tables and rpl_sync --let $server1_uuid= query_get_value(SELECT @@SERVER_UUID, @@SERVER_UUID, 1) CREATE TABLE test.t1 (a INT PRIMARY KEY); CREATE TABLE test.t2 (a INT PRIMARY KEY); --source include/rpl_sync.inc --echo --echo # 2. On a member server2 that will be secondary lock a table t1 --let $rpl_connection_name= server2 --source include/rpl_connection.inc LOCK TABLE t1 READ; --echo --echo # 3. On other member insert value on table locked on server2 --let $rpl_connection_name= server_3 --source include/rpl_connection.inc --let $server3_uuid= query_get_value(SELECT @@SERVER_UUID, @@SERVER_UUID, 1) SET @@GLOBAL.group_replication_member_weight= 90; INSERT INTO t1 VALUES (1); --let $rpl_connection_name= server_2 --source include/rpl_connection.inc --let $wait_condition=SELECT COUNT(*)=1 FROM performance_schema.events_stages_current WHERE event_name LIKE "%Waiting for table metadata lock%" --source include/wait_condition.inc --echo --echo # 4. Execute action to change to single primary with server1 as primary --let $rpl_connection_name= server3 --source include/rpl_connection.inc --replace_result $server1_uuid MEMBER1_UUID --send_eval SELECT group_replication_switch_to_single_primary_mode("$server1_uuid") --let $rpl_connection_name= server_3 --source include/rpl_connection.inc --echo --echo # 5. Check that the other members are waiting for members to be in read --echo # mode. Stages should be --echo # - Primary Election: waiting for members to enable super_read_only --echo # - Single-primary Switch: executing Primary election - completed work 0 --let $wait_condition=SELECT COUNT(*)=1 FROM performance_schema.events_stages_current WHERE event_name LIKE "%super_read_only%" --source include/wait_condition.inc --let $stage_name= `SELECT event_name FROM performance_schema.events_stages_current WHERE event_name LIKE "%Single-primary Switch%" AND work_completed=0;` --let $assert_text= The stage should be "Single-primary Switch: executing Primary election" --let $assert_cond= "$stage_name" = "stage/group_rpl/Single-primary Switch: executing Primary election" --source include/assert.inc --let $stage_name= `SELECT event_name FROM performance_schema.events_stages_current WHERE event_name LIKE "%super_read_only%";` --let $assert_text= The stage should be "Primary Election: waiting for members to enable super_read_only" --let $assert_cond= "$stage_name" = "stage/group_rpl/Primary Election: waiting for members to enable super_read_only" --source include/assert.inc --echo --echo # 6. Lock a table t2 on the primary server1 --let $rpl_connection_name= server1 --source include/rpl_connection.inc LOCK TABLE t2 READ; --echo --echo # 7. Insert something on t2 on server2, the locked secondary --let $rpl_connection_name= server_2_1 --source include/rpl_connection.inc --send INSERT INTO t2 VALUES (1) --echo --echo # 8. Unlock table t1 on server2, the locked secondary --let $rpl_connection_name= server2 --source include/rpl_connection.inc # Insert might not have started, UNLOCK will unblock internal SET READ_ONLY --let $wait_condition=SELECT COUNT(*)=1 FROM information_schema.processlist WHERE state LIKE "%Waiting for global read lock%" AND info lIKE "%INSERT INTO t2%" AND USER="root" --source include/wait_condition.inc UNLOCK TABLES; --echo --echo # 9. Stage should be --echo # - Single-primary Switch: executing Primary election - completed work 1 --let $wait_condition=SELECT COUNT(*)=1 FROM performance_schema.events_stages_current WHERE event_name LIKE "%Single-primary Switch: executing Primary election%" AND work_completed=1 --source include/wait_condition.inc --echo --echo # 10. Kill the new primary server1 --let $rpl_connection_name= server1 --source include/rpl_connection.inc --let $_group_replication_local_address= `SELECT @@GLOBAL.group_replication_local_address` --let $_group_replication_group_seeds= `SELECT @@GLOBAL.group_replication_group_seeds` --replace_result $group_replication_group_name GROUP_REPLICATION_GROUP_NAME $_group_replication_local_address GROUP_REPLICATION_LOCAL_ADDRESS $_group_replication_group_seeds GROUP_REPLICATION_GROUP_SEEDS --let $restart_parameters=restart:--group-replication-start-on-boot=0 --group-replication-group-name=$group_replication_group_name --group_replication_local_address=$_group_replication_local_address --group_replication_group_seeds=$_group_replication_group_seeds --group_replication_single_primary_mode=TRUE --group_replication_enforce_update_everywhere_checks=FALSE --source include/kill_and_restart_mysqld.inc --let $rpl_server_number= 1 --source include/rpl_reconnect.inc --echo --echo # 11. Check that the action finishes --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $group_replication_number_of_members= 2 --source include/gr_wait_for_number_of_members.inc --echo --echo # 12. Check server2 was able to insert value --let $rpl_connection_name= server_2_1 --source include/rpl_connection.inc --reap --echo --echo # 13. Using weights one can assert here that primary is now server3 --let $rpl_connection_name= server3 --source include/rpl_connection.inc --replace_result $server1_uuid MEMBER1_UUID --reap --source include/gr_assert_primary_member.inc --echo --echo # 14. Cleanup --let $rpl_connection_name= server1 --source include/rpl_connection.inc --source include/start_group_replication.inc --let $rpl_connection_name= server3 --source include/rpl_connection.inc SET @@GLOBAL.group_replication_member_weight= DEFAULT; DROP TABLE t1; DROP TABLE t2; --let $rpl_group_replication_single_primary_mode=1 --let $rpl_group_replication_reset_persistent_vars=1 --source include/group_replication_end.inc