--source include/have_innodb.inc --source include/have_debug.inc --source include/master-slave.inc --disable_query_log call mtr.add_suppression("InnoDB: Transaction was aborted due to "); --enable_query_log --echo MDEV-31655: Parallel replication deadlock victim preference code erroneously removed # The problem was that InnoDB would choose the wrong deadlock victim. # Create a lot of transactions that can cause deadlocks, and use error # injection to check that the first transactions in each group is never # selected as deadlock victim. --let $rows= 10 --let $transactions= 5 --let $gcos= 10 --connection server_1 ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; BEGIN; --disable_query_log --let $i= 0 while ($i < 10) { eval INSERT INTO t1 VALUES ($i, 0); inc $i; } --enable_query_log COMMIT; --source include/save_master_gtid.inc --connection server_2 --source include/sync_with_master_gtid.inc --source include/stop_slave.inc SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; SET @old_parallel_mode=@@GLOBAL.slave_parallel_mode; eval set @@global.slave_parallel_threads= $transactions; set @@global.slave_parallel_mode= conservative; SET @old_dbug= @@GLOBAL.debug_dbug; # This error injection will allow no retries for GTIDs divisible by 1000. SET GLOBAL debug_dbug= "+d,rpl_mdev31655_zero_retries"; --connection server_1 SET @old_dbug= @@SESSION.debug_dbug; SET SESSION debug_dbug="+d,binlog_force_commit_id"; --let $j= 1 while ($j <= $gcos) { eval SET @commit_id= $j+1000; --let $i= 0 while ($i < $transactions) { --disable_query_log eval SET SESSION gtid_seq_no= 1000 + 1000*$j + $i; BEGIN; --let $k= 0 while ($k < $rows) { eval UPDATE t1 SET b=b+1 WHERE a=(($i+$k) MOD $rows); inc $k; } COMMIT; --enable_query_log inc $i; } inc $j; } SET SESSION debug_dbug= @old_dbug; SELECT COUNT(*), SUM(a*100*b) FROM t1; --source include/save_master_gtid.inc --connection server_2 --source include/start_slave.inc --source include/sync_with_master_gtid.inc SET GLOBAL debug_dbug= @old_dbug; SELECT COUNT(*), SUM(a*100*b) FROM t1; # Clean up. --connection server_2 --source include/stop_slave.inc SET GLOBAL slave_parallel_threads=@old_parallel_threads; SET GLOBAL slave_parallel_mode=@old_parallel_mode; --source include/start_slave.inc --connection server_1 DROP TABLE t1; --source include/rpl_end.inc