polardbxengine/mysql-test/extra/rpl_tests/rpl_stop_middle_group.test

172 lines
5.2 KiB
Plaintext

# Proving that stopping in the middle of applying a group of events
# does not have immediate effect if a non-transaction table has been changed.
# The slave sql thread has to try to finish applying first.
# The tests rely on simulation of the killed status.
# The matter of testing correlates to some of `rpl_start_stop_slave' that does
# not require `have_debug'.
# Test group sematics and thereby failing in such group is bound to
# the Single-Threaded Slave.
-- source include/not_mts_slave_parallel_workers.inc
-- source include/have_myisam.inc
connection master;
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
create table tm (a int auto_increment primary key) engine=myisam;
create table ti (a int auto_increment primary key) engine=innodb;
sync_slave_with_master;
set @@global.debug="+d,stop_slave_middle_group";
connection master;
begin;
insert into ti set a=null;
insert into tm set a=null; # to simulate killed status on the slave
commit;
connection slave;
call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
call mtr.add_suppression("Slave SQL.*Slave SQL Thread stopped with incomplete event group having non-transactional changes");
# slave will catch the killed status but won't shut down immediately
# only after the whole group has done (commit)
source include/wait_for_slave_sql_to_stop.inc;
# checking: no error and the group is finished
--source include/check_slave_no_error.inc
--let $assert_text= Everything that was read, was executed
--let $assert_cond= [SHOW SLAVE STATUS, Read_Master_Log_Pos, 1] = [SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1]
--source include/assert.inc
--let $assert_text= There is one row in table tm
--let $assert_cond= [SELECT COUNT(*) AS Val FROM tm, Val, 1] = 1
--source include/assert.inc
--let $assert_text= There is one row in table ti
--let $assert_cond= [SELECT COUNT(*) AS Val FROM ti, Val, 1] = 1
--source include/assert.inc
--source include/stop_slave.inc
set @@global.debug="-d";
#
# bug#45940 issues around rli->last_event_start_time
# Testing of slave stopped after it had waited (in vain) for
# the group be finished.
# It could not be finished because of simulation of failure to
# receive the terminal part
# The test relay on simulation of the incomplete group in the relay log
# Two cases are verified: a mixed transacton and a mixed multi-table update.
#
# The mixed transacton.
#
source include/start_slave.inc;
connection master;
truncate table tm; # cleanup of former tests
truncate table ti;
#connection slave;
sync_slave_with_master;
set @@global.debug="+d,stop_slave_middle_group";
set @@global.debug="+d,incomplete_group_in_relay_log";
connection master;
begin;
insert into ti set a=null;
insert into tm set a=null;
commit;
connection slave;
# slave will catch the killed status, won't shut down immediately
# but does it eventually having the whole group unfinished (not committed)
let $slave_sql_errno= 13117; # ER_SLAVE_FATAL_ERROR
--let $show_slave_sql_error= 1
--source include/wait_for_slave_sql_error.inc
# checking: the error and group unfinished
--let $assert_text= Not everything that was read, was executed
--let $assert_cond= [SHOW SLAVE STATUS, Read_Master_Log_Pos, 1] > [SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1]
--source include/assert.inc
--let $assert_text= There is one row in table tm
--let $assert_cond= [SELECT COUNT(*) AS Val FROM tm, Val, 1] = 1
--source include/assert.inc
--let $assert_text= There is no row in table ti
--let $assert_cond= [SELECT COUNT(*) AS Val FROM ti, Val, 1] = 0
--source include/assert.inc
--source include/stop_slave.inc
set @@global.debug="-d";
#
# The mixed multi-table update
#
# above tests for Bug#11765758 - 58754 made sure slave is down
truncate table tm;
source include/start_slave.inc;
connection master;
#connection slave;
sync_slave_with_master;
set @@global.debug="+d,stop_slave_middle_group";
set @@global.debug="+d,incomplete_group_in_relay_log";
connection master;
update tm as t1, ti as t2 set t1.a=t1.a * 2, t2.a=t2.a * 2;
connection slave;
# slave will catch the killed status, won't shut down immediately
# but does it eventually having the whole group unfinished (not committed)
#
# checking: the error and group unfinished
let $slave_sql_errno= 13117; # ER_SLAVE_FATAL_ERROR
--let $show_slave_sql_error= 1
--source include/wait_for_slave_sql_error.inc
--let $assert_text= Not everything that was read, was executed
--let $assert_cond= [SHOW SLAVE STATUS, Read_Master_Log_Pos, 1] > [SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1]
--source include/assert.inc
--let $assert_text= The max value for field 'a' is 2
--let $assert_cond= [SELECT MAX(a) AS Val FROM tm, Val, 1] = 2
--source include/assert.inc
--let $assert_text= The max value for field 'a' is 1
--let $assert_cond= [SELECT MAX(a) AS Val FROM ti, Val, 1] = 1
--source include/assert.inc
--source include/stop_slave.inc
set @@global.debug="-d";
#
# clean-up
#
# the sql thread has an error, so reset replication state
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
connection master;
drop table tm, ti;
--sync_slave_with_master