polardbxengine/mysql-test/suite/group_replication/t/gr_notifications_join_leave...

239 lines
8.1 KiB
Plaintext

################################################################################
#
# WL#10412: GR: notify listener services on relevant group events
#
# This test case checks that the correct notifications are
# triggered to the listeners registered in the service registry.
#
# For that it relies on a table that is updated by a listener
# through the SQL service API.
#
# This file covers the scenarios for regular bootstrap, join, leave, recovering.
#
# |------------+----+---------------------------------------------+------------+--------|
# | Tested | | Scenario\Where | | |
# | in this | | | Server | Others |
# | file | | | triggering | |
# | | | | event | |
# |------------+----+---------------------------------------------+------------+--------|
# | x | 1 | SERVER BOOTSTRAPS GROUP | VC,2xSC | N/A |
# | x | 2 | SERVER JOINS and STARTS RECOVERY | VC,SC | VC,SC |
# | x | 3 | SERVER RECOVERED | SC | SC |
# | x | 4 | SERVER LEAVES(ERROR), SERVER LEAVES(OFFLINE)| VC,SC | VC |
# |------------+----+---------------------------------------------+------------+--------|
# | | 5 | SERVER BOOTSTRAPS+RECOVERS+PRIMARY ELECTION | VC,RC,2xSC | |
# | | 6 | PRIMARY LEAVES | VC,SC,RC | VC,RC |
# |------------+----+---------------------------------------------+------------+--------|
# | | 7 | A SERVER BECOMES UNREACHABLE | SC, VC | N/A |
# | | 8 | MAJORITY UNREACHABLE | QL, SC | N/A |
# | | 9 | MAJORITY UNREACHABLE+FORCE MEMBERS | VC | N/A |
# | | 10 | MAJORITY UNREACHABLE+STOP | VC, SC | N/A |
# |------------+----+---------------------------------------------+------------+--------|
#
# Legend:
# - QL - Quorum Lost event
# - VC - View Changed event
# - RC - Role Changed event
# - SC - State Changed event
#
# To test the cases above, the test sets up a group of
# 2 servers in multi-master mode and proceeds to testing
# the different scenarios. These are highlighted in the
# test file.
################################################################################
--source include/have_debug.inc
--source include/force_restart.inc
--source include/big_test.inc
--source include/have_group_replication_plugin.inc
###
### Sets up the group with two servers: server1 and server2
###
--let $rpl_skip_group_replication_start= 1
--source include/group_replication.inc
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
# lets add the debug points and create the table into which
# the notifications will be logged.
--let $debug_point= register_gms_listener_example
--source include/add_debug_point.inc
SET SQL_LOG_BIN=0;
CREATE TABLE test.gms_listener_example(log_message TEXT);
SET SQL_LOG_BIN=1;
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $debug_point= register_gms_listener_example
--source include/add_debug_point.inc
SET SQL_LOG_BIN=0;
CREATE TABLE test.gms_listener_example(log_message TEXT);
SET SQL_LOG_BIN=1;
--echo ### Scenario 1: SERVER BOOTSTRAPS GROUP
--echo ### Expected:
--echo ### - Myself: 1 VIEW CHANGED, 2 STATE CHANGED
--echo ### - Others: N/A
--echo ##########################################################################
# start the group
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--source include/start_and_bootstrap_group_replication.inc
# view change + server moved to recovering then to online
--let $expected_notifications= 1,VIEW %:1|2,STATE %:1
--source ../include/assert_notifications.inc
# this will make server2 stay on recovery
--source include/gr_stop_applier_sql_thread.inc
--echo ### Scenario 2: MEMBER JOINS, but blocks recoverying
--echo ### Expected:
--echo ### - Myself: 1 VIEW CHANGED, 1 STATE CHANGED
--echo ### - Others: 1 VIEW CHANGED, 1 STATE CHANGED
--echo ##########################################################################
# server2
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $group_replication_start_member_state= RECOVERING
--source include/start_group_replication.inc
--let $expected_notifications= 1,VIEW %:2|1,STATE %:2
--source ../include/assert_notifications.inc
# server1
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $expected_notifications= 1,VIEW %:2|1,STATE %:2
--source ../include/assert_notifications.inc
--echo ### Scenario 3: MEMBER RECOVERS JOINS
--echo ### Expected:
--echo ### - Myself: 1 STATE CHANGED
--echo ### - Others: 1 STATE CHANGED
--echo ##########################################################################
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--source include/gr_start_applier_sql_thread.inc
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $group_replication_member_state= ONLINE
--source include/gr_wait_for_member_state.inc
--let $expected_notifications= 1,STATE %:2
--source ../include/assert_notifications.inc
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $expected_notifications= 1,STATE %:2
--source ../include/assert_notifications.inc
--echo ### Scenario 4: SERVER LEAVES(ERROR), SERVER LEAVES(OFFLINE)
--echo ### Expected:
--echo ### - Myself (leaving): 1 VIEW CHANGED, 1 STATE CHANGED
--echo ### - Others: 1 VIEW CHANGED
--echo ##########################################################################
# server2
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
SET SESSION sql_log_bin=0;
call mtr.add_suppression("Table 'tab1' already exists");
call mtr.add_suppression("The applier thread execution was aborted. Unable to process more transactions, this member will now leave the group");
call mtr.add_suppression("Fatal error during execution on the Applier process of Group Replication. The server will now leave the group.");
call mtr.add_suppression("The server was automatically set into read only mode after an error was detected.");
call mtr.add_suppression("Slave SQL for channel 'group_replication_applier': ... The slave coordinator and worker threads are stopped,*");
SET SESSION sql_log_bin=1;
SET SESSION sql_log_bin=0;
CREATE TABLE test.tab1 (a INT PRIMARY KEY);
SET SESSION sql_log_bin=1;
# server1
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
CREATE TABLE test.tab1 (a INT PRIMARY KEY);
# server2
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $group_replication_member_state= ERROR
--source include/gr_wait_for_member_state.inc
--let $expected_notifications= 1,STATE %:%|1,VIEW %:%
--source ../include/assert_notifications.inc
# server1
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $expected_notifications= 1,VIEW %:3
--source ../include/assert_notifications.inc
# server2
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--source include/stop_group_replication.inc
--let $group_replication_member_state= OFFLINE
--source include/gr_wait_for_member_state.inc
--let $expected_notifications= 1,STATE %:%
--source ../include/assert_notifications.inc
SET SESSION sql_log_bin=0;
DROP TABLE test.tab1;
SET SESSION sql_log_bin=1;
###
### Clean up and bail out
###
# server1
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--source include/stop_group_replication.inc
--let $debug_point= register_gms_listener_example
--source include/remove_debug_point.inc
--source include/start_and_bootstrap_group_replication.inc
# server2
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $debug_point= register_gms_listener_example
--source include/remove_debug_point.inc
--source include/start_group_replication.inc
DROP TABLE gms_listener_example;
DROP TABLE test.tab1;
--source include/rpl_sync.inc
--source include/group_replication_end.inc