summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/rpl/t/rpl_parallel_xa_same_xid.test
blob: 888dd2f177b38963cfb028e1f7bd7c5e9b37df9d (plain)
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
# 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

--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