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