399 lines
12 KiB
Plaintext
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
|