polardbxengine/mysql-test/suite/x/t/notices_gr_quorum.test

399 lines
12 KiB
Plaintext

################################################################################
#
# 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