1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
################################################################################
# === Purpose ===
# This test verifies that no transaction prepared ack being sent by a member for
# transactions received during recovery.
#
# === Implementation ===
# 00. The test requires three servers: server1 and 2
# 01. Boot start server1
# 02. Start server2
# 03. Stop GR on server1
# 04. Execute transactions on the new primary
# 05. Add debug points in server1
# 06. Start GR on server1, let it waits after
# after_wait_for_applier_module_recovery
# 07. Add debug points in server1, server waits
# before_commit_hook_wait
# 08. Commit a transaction on server2 while server1 is
# in recovery
# 09. On server1, wait for the transaction to reach debug
# sync point
# 10. Resume recovery on server1, verify that server1 is
# online
# 11. Resume transaction recived during recovery, verify all
# members are still online and server1 executed the
# transaction
# 12. Verify that all members are still online and server1
# executed the transaction
# 13. Verify that all members have same data
# 14. Cleaning up
################################################################################
--source include/have_debug_sync.inc
--source include/big_test.inc
--source include/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--let $rpl_group_replication_single_primary_mode=1
--let $rpl_server_count= 2
--source include/group_replication.inc
--echo
--echo ############################################################
--echo # 01. Boot start server1
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--let $sysvars_to_save = [ "GLOBAL.group_replication_consistency" ]
--source include/save_sysvars.inc
SET GLOBAL group_replication_consistency= 'AFTER';
--source include/start_and_bootstrap_group_replication.inc
--echo
--echo ############################################################
--echo # 2. Start server2
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $sysvars_to_save = [ "GLOBAL.group_replication_consistency" ]
--source include/save_sysvars.inc
SET GLOBAL group_replication_consistency= 'AFTER';
--source include/start_group_replication.inc
--echo
--echo ############################################################
--echo # 3. Stop GR on server1
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--source include/stop_group_replication.inc
--echo
--echo ############################################################
--echo # 4. Execute transactions on the new primary
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (3);
--echo
--echo ############################################################
--echo # 5. Add debug points in server1
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
SET @@GLOBAL.DEBUG= '+d,recovery_thread_wait_after_wait_for_applier_module_recovery';
--echo
--echo ############################################################
--echo # 6. Start GR on server1, let it waits after
--echo # after_wait_for_applier_module_recovery
--let $group_replication_start_member_state= RECOVERING
--source include/start_group_replication.inc
SET DEBUG_SYNC = "now WAIT_FOR signal.recovery_thread_wait_after_wait_for_applier_module_recovery";
--let $assert_text= Verify MEMBER_STATE is RECOVERING
--let $assert_cond= "[SELECT MEMBER_STATE FROM performance_schema.replication_group_members WHERE MEMBER_ID= @@server_uuid, MEMBER_STATE, 1]" = "RECOVERING"
--source include/assert.inc
--echo
--echo ############################################################
--echo # 7. Add debug points in server1, server waits
--echo # before_commit_hook_wait
SET @@GLOBAL.DEBUG= '+d,group_replication_before_commit_hook_wait';
--echo
--echo ############################################################
--echo # 8. Commit a transaction on server2 while server1 is
--echo # in recovery
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
INSERT INTO t1 VALUES (4);
--echo ############################################################
--echo # 9. On server1, wait for the transaction to reach debug
--echo # sync point
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
SET DEBUG_SYNC= "now WAIT_FOR signal.group_replication_before_commit_hook_wait_reached";
--echo ############################################################
--echo # 10. Resume recovery on server1, verify that server1 is
--echo # online
SET @@GLOBAL.DEBUG= '-d,recovery_thread_wait_after_wait_for_applier_module_recovery';
SET DEBUG_SYNC= "now SIGNAL signal.recovery_thread_resume_after_wait_for_applier_module_recovery";
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--echo ############################################################
--echo # 11. Resume transaction recived during recovery, verify all
--echo # members are still online and server1 executed the
--echo # transaction
SET @@GLOBAL.DEBUG= '-d,group_replication_before_commit_hook_wait';
SET DEBUG_SYNC= "now SIGNAL continue_commit";
--echo ############################################################
--echo # 12. Verify that all members are still online and server1
--echo # executed the transaction
--let $assert_text= There are three members in the group
--let $assert_cond= "[SELECT COUNT(*) from performance_schema.replication_group_members WHERE MEMBER_STATE=\"ONLINE\"]" = 2
--source include/assert.inc
--let $assert_text= On the recovered member, the table should contain 4 elements
--let $assert_cond= [select count(*) as count from t1] = 4;
--source include/assert.inc
--echo ############################################################
--echo # 13. Verify that all members have same data
--let $diff_tables= server1:test.t1, server2:test.t1
--source include/diff_tables.inc
--echo ############################################################
--echo # 14. Cleaning up
SET DEBUG_SYNC= 'RESET';
--source include/restore_sysvars.inc
--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--source include/restore_sysvars.inc
DROP TABLE t1;
--source include/group_replication_end.inc
|