--source include/master-slave.inc --source include/have_binlog_format_row.inc --source include/not_gtid_enabled.inc connection slave; source include/stop_slave.inc; set @save.slave_parallel_workers= @@global.slave_parallel_workers; set @@global.slave_parallel_workers= 2; --let $saved_relay_repo= `SELECT @@global.relay_log_info_repository` --let $save_sync_relay_log= `SELECT @@global.sync_relay_log_info` SET @@global.relay_log_info_repository="TABLE"; SET @@global.sync_relay_log_info= 1; source include/start_slave.inc; connection master; create database d1; create database d2; create table d1.t1 (a int primary key) engine=innodb; create table d2.t1 (a int primary key) engine=innodb; create table d1.t2m (a int) engine=myisam; # non-trans engine to detect deadlock insert into d1.t1 values (1),(2),(3); insert into d2.t1 values (1),(2),(3); insert into d1.t2m values (1); --source include/sync_slave_sql_with_master.inc begin; # the blocker update d1.t1 set a=31 where a=3; insert into d1.t1 values (5),(6),(7); # create job #1 (this one will be blocked on a row lock on slave) connection master; begin; update d1.t1 set a=20 where a=2; insert into d1.t2m values (2); update d1.t1 set a=30 where a=3; insert into d1.t1 values (4); commit; # create job #2 for another worker. this will be executed on the slave even # if the first worker is blocked on job #1 delete from d2.t1; # wait till job #2 is done connection slave1; let $count= 0; let $table= d2.t1; source include/wait_until_rows_count.inc; # wait for job #1 to block in the middle of a transaction connection slave; let $count= 2; let $table= d1.t2m; source include/wait_until_rows_count.inc; # This will leave Exec_Master_Log_Pos in an inconsistent state, i.e. it will # point to the event corresponding to job #1, even though job #2 which a larger # log pos has already been executed stop slave; --let $exec_master_log_pos=query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1) --echo Exec_Master_Log_Pos = $exec_master_log_pos select Id, Master_log_pos from mysql.slave_worker_info; --let $master_log_pos_1=`SELECT Master_log_pos FROM mysql.slave_worker_info WHERE Id=1` --let $master_log_pos_2=`SELECT Master_log_pos FROM mysql.slave_worker_info WHERE Id=2` # Exec_Master_Log_Pos is only consistent when it is equal to # max($master_log_pos_1,$master_log_pos_2) if (`SELECT $exec_master_log_pos < $master_log_pos_1 || $exec_master_log_pos < $master_log_pos_2`) { --die *** Exec_Master_Log_Pos is inconsistent! } # Cleanup commit; source include/start_slave.inc; connection master; drop database d1; drop database d2; --source include/sync_slave_sql_with_master.inc set @@global.slave_parallel_workers= @save.slave_parallel_workers; --disable_query_log --eval SET @@global.relay_log_info_repository="$saved_relay_repo" --eval SET @@global.sync_relay_log_info=$saved_relay_log; --enable_query_log --source include/rpl_end.inc