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
|
# The tests verify concurrent execution of replicated (MDEV-742)
# XA transactions in the parallel optimistic mode.
# Prove optimistic scheduler handles xid-namesake XA:s.
# That is despite running in parallel there must be no conflicts
# caused by multiple transactions' same xid.
--source include/have_binlog_format_mixed_or_row.inc
--source include/have_innodb.inc
--source include/have_perfschema.inc
--source include/master-slave.inc
--disable_query_log
call mtr.add_suppression("InnoDB: Transaction was aborted due to ");
--enable_query_log
--let $xid_num = 19
--let $repeat = 17
--let $workers = 7
--connection slave
call mtr.add_suppression("WSREP: handlerton rollback failed");
--source include/stop_slave.inc
# a measure against MDEV-20605
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
SET @old_parallel_threads = @@GLOBAL.slave_parallel_threads;
--disable_query_log
--eval SET @@global.slave_parallel_threads = $workers
--enable_query_log
SET @old_parallel_mode = @@GLOBAL.slave_parallel_mode;
SET @@global.slave_parallel_mode ='optimistic';
--source include/start_slave.inc
--connection master
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
--let $i = $xid_num
--let $t = t1
--disable_query_log
while ($i)
{
--let $k = $repeat
while ($k)
{
--eval XA START 'xid_$i'
--eval INSERT INTO $t SET a=$i, b=$k
--eval XA END 'xid_$i'
--let $one_phase = `SELECT IF(floor(rand()*10)%2, "ONE PHASE", 0)`
if (!$one_phase)
{
--eval XA PREPARE 'xid_$i'
--eval XA COMMIT 'xid_$i'
}
if ($one_phase)
{
--eval XA COMMIT 'xid_$i' ONE PHASE
}
if (!$one_phase)
{
--eval XA START 'xid_$i'
--eval INSERT INTO $t SET a=$i, b=$k
--eval XA END 'xid_$i'
--eval XA PREPARE 'xid_$i'
--eval XA ROLLBACK 'xid_$i'
}
--dec $k
}
--dec $i
}
--enable_query_log
# Above-like test complicates execution env to create
# data conflicts as well. They will be resolved by the optmistic
# scheduler as usual.
CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, b INT) ENGINE=InnoDB;
--let $i = $xid_num
--let $t = t2
--disable_query_log
while ($i)
{
--let $k = $repeat
while ($k)
{
--eval XA START 'xid_$i'
--eval INSERT INTO $t SET a=NULL, b=$k
--eval UPDATE $t SET b=$k + 1 WHERE a=last_insert_id() % $workers
--eval XA END 'xid_$i'
--let $one_phase = `SELECT IF(floor(rand()*10)%2, "ONE PHASE", 0)`
if (!$one_phase)
{
--eval XA PREPARE 'xid_$i'
--eval XA COMMIT 'xid_$i'
}
if ($one_phase)
{
--eval XA COMMIT 'xid_$i' ONE PHASE
}
--eval XA START 'xid_$i'
--eval UPDATE $t SET b=$k + 1 WHERE a=last_insert_id() % $workers
--eval DELETE FROM $t WHERE a=last_insert_id()
--eval XA END 'xid_$i'
--eval XA PREPARE 'xid_$i'
--eval XA ROLLBACK 'xid_$i'
--let $do_drop_create = `SELECT IF(floor(rand()*10)%100, 1, 0)`
if ($do_drop_create)
{
DROP TABLE t1;
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
}
--dec $k
}
--dec $i
}
--enable_query_log
--source include/sync_slave_sql_with_master.inc
--let $diff_tables= master:t1, slave:t1
--source include/diff_tables.inc
#
# Clean up.
#
--connection slave
--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 master
DROP TABLE t1, t2;
--source include/rpl_end.inc
|