################################################################################ # # WL#10655: Global notification for GR membership changes # # This test case checks that enabled notices are triggered and delivered to # client. # # This file covers the scenarios where QUORUM is lost. # # # +----+---------------------------------------------+------------+--------| # | Lp | Scenario\Where | | | # | | | Server1 | Others | # | | | triggering | | # | | | event | | # +----+---------------------------------------------+------------+--------| # | 1 | A SERVER BECOMES UNREACHABLE | SC, VC | N/A | # | 2 | MAJORITY UNREACHABLE | QL, SC | N/A | # | 3 | MAJORITY UNREACHABLE+FORCE MEMBERS | VC | N/A | # | 4 | MAJORITY UNREACHABLE+STOP | VC, SC | N/A | # +----+---------------------------------------------+------------+--------| # # Scenarios described inside the table will be repeated two times: # # * X Protocol GR notices enabled - verify delivery of the notices # * X Protocol GR notices disabled - verify that X Plugin doesn't send the notices # --source include/count_sessions.inc --source include/force_restart.inc --source include/big_test.inc --source include/have_mysqlx_plugin.inc --source include/have_group_replication_plugin.inc ## Test starts here --let $xtest=$MYSQL_TMP_DIR/group_replication_setup_and_xnotices_test.tmp --write_file $xtest -->import group_replication.macro -->import kill_and_restart.macro -->import assert_notices.macro -->macro Query_get_value %VAR% %STMT% query_result; stmtsql %STMT%; recvtovar %VAR%; noquery_result; -->endmacro -->echo -->echo ### -->echo ### Sets up the group with three servers -->echo ### # # Setup X connections for GR configuration & notice verification # # * This test requires only one connection to do the verification. # callmacro Connect_to_all_mysqld_instances verify 1; callmacro Connect_to_all_mysqld_instances server %SERVER_NUMBER%; # # Get the servers configuration # callmacro Setsession server_1; callmacro Query_get_value %MEMBER_UUID_1% SELECT @@SERVER_UUID; callmacro Query_get_value %LOCAL_ADDRESS_SERVER_1% SELECT @@GLOBAL.group_replication_local_address; callmacro Query_get_value %GROUP_SEEDS_SERVER_1% SELECT @@GLOBAL.group_replication_group_seeds; quiet; noquery_result; SET SQL_LOG_BIN=0; call mtr.add_suppression("The member has failed to gracefully leave the group."); call mtr.add_suppression("Timeout while waiting for the group communication"); call mtr.add_suppression("read failed"); SET SQL_LOG_BIN=1; query_result; noquiet; callmacro Setsession server_2; callmacro Query_get_value %MEMBER_UUID_2% SELECT @@SERVER_UUID; callmacro Query_get_value %LOCAL_ADDRESS_SERVER_2% SELECT @@GLOBAL.group_replication_local_address; callmacro Query_get_value %GROUP_SEEDS_SERVER_2% SELECT @@GLOBAL.group_replication_group_seeds; callmacro Setsession server_3; callmacro Query_get_value %MEMBER_UUID_3% SELECT @@SERVER_UUID; callmacro Query_get_value %LOCAL_ADDRESS_SERVER_3% SELECT @@GLOBAL.group_replication_local_address; callmacro Query_get_value %GROUP_SEEDS_SERVER_3% SELECT @@GLOBAL.group_replication_group_seeds; # # Start GR # callmacro GR_clear_bootstrap_group %SERVER_NUMBER%; callmacro Setsession server_1; callmacro GR_start_and_bootstrap %SERVER_NUMBER% %GR_NAME% ONLINE; callmacro Setsession server_2; callmacro GR_start %GR_NAME% ONLINE; callmacro Setsession server_3; callmacro GR_start %GR_NAME% ONLINE; callmacro GR_wait_for_number_of_members %SERVER_NUMBER%; # # Enable notification on connections that are going be used for verification # # * Enable notices only on first server # callmacro %ENABLE_NOTICES% 1 {"notice":["group_replication/membership/quorum_loss", "group_replication/membership/view", "group_replication/status/role_change", "group_replication/status/state_change"]}; -->echo -->echo ### Scenario 1: SERVER UNREACHABLE -->echo ### Expected: -->echo ### - Correct Servers: 1 STATE CHANGED (and eventually a VIEW CHANGED) -->echo ### - Failed server: N/A -->echo ########################################################## callmacro Kill_and_restart_mysqld server_3 %MYSQLXTEST_VARDIR%/tmp/mysqld.3.expect; callmacro Setsession server_1; callmacro GR_wait_for_number_of_members 2; callmacro %ASSERT_NOTICES% state_changed verify_1; callmacro %ASSERT_NOTICES% view_changed verify_1; callmacro %ASSERT_NOTICES% none verify_1; -->echo -->echo ### Scenario 2: MAJORITY UNREACHABLE -->echo ### Expected: -->echo ### - Correct Servers: 1 QUORUM LOST, 1 STATE CHANGED -->echo ### - Failed Servers: N/A -->echo ########################################################## callmacro Kill_and_restart_mysqld server_2 %MYSQLXTEST_VARDIR%/tmp/mysqld.2.expect; callmacro Setsession server_1; callmacro GR_wait_for_uuid_and_member_state %MEMBER_UUID_2% UNREACHABLE; callmacro %ASSERT_NOTICES% quorum_lost verify_1; callmacro %ASSERT_NOTICES% state_changed verify_1; callmacro %ASSERT_NOTICES% none verify_1; -->echo -->echo ### Scenario 3: MAJORITY UNREACHABLE + FORCE MEMBERS -->echo ### Expected: -->echo ### - Correct Servers: 1 VIEW CHANGED -->echo ### - Failed Servers: N/A -->echo ########################################################## callmacro Setsession server_1; noquery_result; varsub %LOCAL_ADDRESS_SERVER_1%; SET GLOBAL group_replication_force_members= "%LOCAL_ADDRESS_SERVER_1%"; query_result; # Verify that the GR members table has only one entry callmacro GR_wait_for_number_of_members 1; noquery_result; SET GLOBAL group_replication_force_members= ""; query_result; callmacro %ASSERT_NOTICES% view_changed verify_1; callmacro %ASSERT_NOTICES% none verify_1; callmacro GR_stop; -->echo -->echo ### Scenario 4: MAJORITY UNREACHABLE + STOP -->echo ### Expected: -->echo ### - Correct Servers: 1 VIEW CHANGED, 1 STATE CHANGED -->echo ### - Failed Servers: N/A -->echo ########################################################## callmacro Setsession server_1; noquery_result; RESET MASTER; varsub %GROUP_SEEDS_SERVER_1%; SET @@global.group_replication_group_seeds="%GROUP_SEEDS_SERVER_1%"; varsub %LOCAL_ADDRESS_SERVER_1%; SET @@global.group_replication_local_address="%LOCAL_ADDRESS_SERVER_1%"; query_result; callmacro GR_start_and_bootstrap %SERVER_NUMBER% %GR_NAME% ONLINE; callmacro %ASSERT_NOTICES% view_changed verify_1; callmacro %ASSERT_NOTICES% state_changed verify_1; callmacro %ASSERT_NOTICES% state_changed verify_1; callmacro %ASSERT_NOTICES% none verify_1; callmacro Setsession server_2; noquery_result; RESET MASTER; varsub %GROUP_SEEDS_SERVER_2%; SET @@global.group_replication_group_seeds="%GROUP_SEEDS_SERVER_2%"; varsub %LOCAL_ADDRESS_SERVER_2%; SET @@global.group_replication_local_address="%LOCAL_ADDRESS_SERVER_2%"; query_result; callmacro GR_start %GR_NAME% ONLINE; callmacro %ASSERT_NOTICES% view_changed verify_1; callmacro %ASSERT_NOTICES% state_changed verify_1; callmacro %ASSERT_NOTICES% state_changed verify_1; callmacro %ASSERT_NOTICES% none verify_1; callmacro Kill_and_restart_mysqld server_2 %MYSQLXTEST_VARDIR%/tmp/mysqld.2.expect; callmacro Setsession server_1; callmacro GR_wait_for_uuid_and_member_state %MEMBER_UUID_2% UNREACHABLE; callmacro %ASSERT_NOTICES% quorum_lost verify_1; callmacro %ASSERT_NOTICES% state_changed verify_1; callmacro %ASSERT_NOTICES% none verify_1; callmacro GR_stop; callmacro %ASSERT_NOTICES% none verify_1; -->echo -->echo ### Cleanup: in xtest -->echo ########################################################################## callmacro Setsession server_1; noquery_result; quiet; varsub %GROUP_SEEDS_SERVER_1%; SET @@global.group_replication_group_seeds="%GROUP_SEEDS_SERVER_1%"; varsub %LOCAL_ADDRESS_SERVER_1%; SET @@global.group_replication_local_address="%LOCAL_ADDRESS_SERVER_1%"; query_result; noquiet; callmacro Setsession server_2; noquery_result; quiet; varsub %GROUP_SEEDS_SERVER_2%; SET @@global.group_replication_group_seeds="%GROUP_SEEDS_SERVER_2%"; varsub %LOCAL_ADDRESS_SERVER_2%; SET @@global.group_replication_local_address="%LOCAL_ADDRESS_SERVER_2%"; query_result; noquiet; callmacro Setsession server_3; noquery_result; quiet; varsub %GROUP_SEEDS_SERVER_3%; SET @@global.group_replication_group_seeds="%GROUP_SEEDS_SERVER_3%"; varsub %LOCAL_ADDRESS_SERVER_3%; SET @@global.group_replication_local_address="%LOCAL_ADDRESS_SERVER_3%"; query_result; noquiet; EOF ## Setup X Plugin & GR --let $rpl_server_count= 3 --let $rpl_skip_group_replication_start= 1 --source include/group_replication.inc --let $dont_reset_global_status_variables=1 --source include/xplugin_preamble.inc --let $ceiling= `SELECT $rpl_server_count + 1` --let $i = 1 while ($i < $ceiling) { --let $rpl_connection_silent= 1 --let $rpl_connection_name= server$i --echo [Setup XPlugin user on connection '$rpl_connection_name'] --source include/rpl_connection.inc --let $create_user_disable_binlog=1 --source include/xplugin_create_user.inc --inc $i } --let $rpl_connection_silent= 0 --echo --echo ## Protocol GR notices enabled - verify delivery of the notices --echo ########################################################################## exec $MYSQLXTEST -ux_root --ssl-mode=disabled --file=$xtest -v %SERVER_NUMBER%=$rpl_server_count -v %GR_NAME%=$group_replication_group_name -v %ASSERT_NOTICES%=CHK_assert_notice -v %ENABLE_NOTICES%=Enable_notice -v %MYSQLXTEST_VARDIR%=$MYSQLTEST_VARDIR -v %SERVER_XPORT_1%=$MASTER_X_MYPORT_1 -v %SERVER_XPORT_2%=$MASTER_X_MYPORT_2 -v %SERVER_XPORT_3%=$MASTER_X_MYPORT_3 2>&1; --let $rpl_connection_name= server_2 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect --let $rpl_connection_name= server2 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect --let $rpl_connection_name= server_3 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect --let $rpl_connection_name= server3 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect --echo --echo ## X Protocol GR notices disabled - verify that X Plugin doesn't send the notices --echo ########################################################################## exec $MYSQLXTEST -ux_root --ssl-mode=disabled --file=$xtest -v %SERVER_NUMBER%=$rpl_server_count -v %GR_NAME%=$group_replication_group_name -v %ASSERT_NOTICES%=CHK_assert_notice_none_ignore_args -v %ENABLE_NOTICES%=Dont_enable_notice -v %MYSQLXTEST_VARDIR%=$MYSQLTEST_VARDIR -v %SERVER_XPORT_1%=$MASTER_X_MYPORT_1 -v %SERVER_XPORT_2%=$MASTER_X_MYPORT_2 -v %SERVER_XPORT_3%=$MASTER_X_MYPORT_3 2>&1; --let $rpl_connection_name= server_2 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect --let $rpl_connection_name= server2 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect --let $rpl_connection_name= server_3 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect --let $rpl_connection_name= server3 --source include/rpl_connection.inc --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect ## Cleanup --remove_file $xtest --source include/group_replication_end.inc --let $i = 1 --let $rpl_connection_silent=1 while ($i < $ceiling) { --let $rpl_connection_silent= 1 --let $rpl_connection_name= server$i --source include/rpl_connection.inc --source include/xplugin_drop_user.inc --inc $i } # Following connections are established by group_replication.inc, # still group_replication_end.inc doesn't disconnects them. # # Releasing the connections manually # --disconnect server1 --disconnect server2 --disconnect server3 --disconnect master1 --disconnect master --disconnect slave1 --disconnect slave --connection default # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc