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
|
--source include/have_innodb.inc
--source include/have_perfschema.inc
#
# The test verifies binlogging of XA transaction and state of prepared XA
# as far as binlog is concerned.
#
# The prepared XA transactions can be disconnected from the client,
# discovered from another connection and commited or rolled back
# later. They also survive the server restart. The test runs two
# loops each consisting of prepared XA:s generation, their
# manipulation and a server restart followed with survived XA:s
# completion.
#
# Prepared XA can't get available to an external connection
# until connection that either leaves actively or is killed
# has completed a necessary part of its cleanup.
# Selecting from P_S.threads provides a method to learn that.
#
# Total number of connection each performing one insert into table
--let $conn_number=20
# Number of rollbacks and commits from either side of the server restart
--let $rollback_number=5
--let $commit_number=5
# Number of transactions that are terminated before server restarts
--let $term_number=`SELECT $rollback_number + $commit_number`
# Instead of disconnect make some connections killed when their
# transactions got prepared.
--let $killed_number=5
# make some connections disconnected by shutdown rather than actively
--let $server_disconn_number=5
--let $prepared_at_server_restart = `SELECT $conn_number - $term_number`
# number a "warmup" connection after server restart, they all commit
--let $post_restart_conn_number=10
# Counter to be used in GTID consistency check.
# It's incremented per each non-XA transaction commit.
# Local to this file variable to control one-phase commit loop
--let $one_phase_number = 5
--connection default
# Remove possibly preceeding binlogs and clear initialization time
# GTID executed info. In the following all transactions are counted
# to conduct verification at the end of the test.
if (`SELECT @@global.log_bin`)
{
RESET MASTER;
}
# Disconected and follower threads need synchronization
CREATE VIEW v_processlist as SELECT * FROM performance_schema.threads where type = 'FOREGROUND';
--eval call mtr.add_suppression("Found $prepared_at_server_restart prepared XA transactions")
CREATE TABLE t (a INT) ENGINE=innodb;
# MDEV-515 takes X-lock on the table for the first insert.
# So concurrent insert won't happen on the table
INSERT INTO t VALUES(100);
# Counter is incremented at the end of post restart to
# reflect number of loops done in correctness computation.
--let $restart_number = 0
--let $how_to_restart=restart_mysqld.inc
--source suite/binlog/include/binlog_xa_prepared_do_and_restart.inc
--let $how_to_restart=kill_and_restart_mysqld.inc
--source suite/binlog/include/binlog_xa_prepared_do_and_restart.inc
--connection default
# Few xs that commit in one phase, not subject to the server restart
# nor reconnect.
# This piece of test is related to mysqlbinlog recovery examine below.
--let $k = 0
while ($k < $one_phase_number)
{
--eval XA START 'one_phase_trx_$k'
--eval INSERT INTO t SET a=$k
--eval XA END 'one_phase_trx_$k'
--eval XA COMMIT 'one_phase_trx_$k' ONE PHASE
--inc $k
}
SELECT SUM(a) FROM t;
DROP TABLE t;
DROP VIEW v_processlist;
let $outfile= $MYSQLTEST_VARDIR/tmp/mysqlbinlog.sql;
if (`SELECT @@global.log_bin`)
{
# Recording proper samples of binlogged prepared XA:s
--source include/show_binlog_events.inc
--exec $MYSQL_BINLOG -R --to-last-log master-bin.000001 > $outfile
}
--echo All transactions must be completed, to empty-list the following:
XA RECOVER;
if (`SELECT @@global.log_bin`)
{
--exec $MYSQL test < $outfile
--remove_file $outfile
XA RECOVER;
}
|