polardbxengine/mysql-test/extra/binlog_tests/binlog_gtid_next_xa.inc

199 lines
5.7 KiB
PHP

# ==== Purpose ====
#
# The test is binlog-on-off insensitive to test XA transaction
# identified with explicit GTID_NEXT values.
# It is included from a top-level tests against server
# with --log-bin and --skip-log-bin either.
#
# ==== Usage ====
#
# --let $rpl_skip_log_bin= [1]
#
# Parameters:
#
# $rpl_skip_log_bin
# top-level caller sets it to 1 when the server is run with --skip-log-bin.
# The value is checked in the current file in order to pick for execution
# only one binlog format, as well as passed to interested included files,
# such as rpl_init.inc.
#
# An XA transaction generates two transactions in the binary log:
# 1. XA BEGIN; DML; XA END; XA PREPARE;
# 2. XA [COMMIT|ROLLBACK];
#
# This test verifies that all possible combinations of GTID_NEXT for
# the two parts of the transaction are allowed (provided that
# GTID_MODE allows it), and that GTID ownership is maintained
# correctly. Specifically, ownership should be released between the
# two transactions and after the two transactions.
#
# ==== Implementation ====
#
# Execute the following:
#
# For COMMIT_OR_ROLLBACK in COMMIT, ROLLBACK:
# For GTID1 in AUTOMATIC, GTID, ANONYMOUS:
# For GTID2 in AUTOMATIC, GTID, ANONYMOUS, none:
# SET GTID_NEXT = <GTID1>;
# XA BEGIN;
# DML;
# XA END;
# verify that no GTID is owned
#
# if GTID2 != none:
# SET GTID_NEXT = <GTID2>;
# XA <COMMIT_OR_ROLLBACK>;
# verify that no GTID is owned
#
# The two innermost loops are unrolled because it is not practical to
# implement such logic in mtr. The body of the inner loop is
# implemented in extra/binlog_tests/{gtid_next_xa,gtid_next_xa_error_simul}.test
# where the latter of two verifies clear exits out of errors, and
# seemless continuation after the server restart while having an XA in
# prepared state.
#
# ==== References ====
#
# WL#6860: binlogging XA transactions
# - Test was created in this worklog.
# No need to run this test in multiple combinations.
if (!$rpl_skip_log_bin)
{
--source include/have_debug.inc
--source include/have_binlog_format_statement.inc
# --log-bin ON specific error simulation
call mtr.add_suppression("The transaction owned GTID is already in the gtid_executed table");
CALL mtr.add_suppression("Statement is unsafe because it is being used inside a XA transaction");
}
--let $rpl_gtid_utils= 1
--let $rpl_topology= none
# rpl_init.inc is aware of possible $rpl_skip_log_bin = 1
--source include/rpl_init.inc
--source include/rpl_default_connections.inc
call mtr.add_suppression("Found 1 prepared XA transactions");
--let $rpl_gtid_mode= ON_PERMISSIVE
--source include/rpl_set_gtid_mode.inc
--connect(conn_err_simul,localhost,root,,)
--connection master
CREATE TABLE t1 (a INT);
--let $xid= 1
--let $commit= COMMIT
# This is GTID setting related error
--let $error= 0
# Unlike the above this is an error in applying the prepare or the commit
--let $error_simul =
# Fixme: The declarion has to be done here even though it gets in use only inside
# a sourced file. Otherwise mtr parser reacts buggy near the if() of the following
# while block.
--let $error_at_prepare=0
--let $i= 0
while ($i < 2)
{
--let $gtid1= AUTOMATIC
--let $gtid2= AUTOMATIC
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= AUTOMATIC
--let $gtid2= $uuida:$xid
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= AUTOMATIC
--let $gtid2= ANONYMOUS
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= AUTOMATIC
--let $gtid2= none
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= $uuida:$xid
--let $gtid2= AUTOMATIC
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= $uuida:$xid
--let $gtid2= $uuidb:$xid
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= $uuida:$xid
--let $gtid2= ANONYMOUS
--source extra/binlog_tests/gtid_next_xa.test
--let $error= convert_error(ER_GTID_NEXT_TYPE_UNDEFINED_GTID)
--let $gtid1= $uuida:$xid
--let $gtid2= none
--source extra/binlog_tests/gtid_next_xa.test
--let $error= 0
--let $gtid1= ANONYMOUS
--let $gtid2= AUTOMATIC
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= ANONYMOUS
--let $gtid2= $uuida:$xid
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= ANONYMOUS
--let $gtid2= ANONYMOUS
--source extra/binlog_tests/gtid_next_xa.test
--let $gtid1= ANONYMOUS
--let $gtid2= none
--source extra/binlog_tests/gtid_next_xa.test
# Commit 1 phase or Rollback "clean" case
--let $one_phase = one phase
--let $gtid1= $uuida:$xid
--let $gtid2= $uuidb:$xid
--source extra/binlog_tests/gtid_next_xa.test
--let $one_phase =
# Commit 1 phase or Rollback simulated error case
--let $one_phase = one phase
--let $error_simul = at_commit
--let $gtid1= $uuida:$xid
--let $gtid2= $uuidb:$xid
--source extra/binlog_tests/gtid_next_xa_error_simul.test
--let $error_simul=
--let $one_phase =
# Regular 2 phase cases with simulated error
--let $error_simul = at_prepare
--let $gtid1= $uuida:$xid
--let $gtid2= $uuidb:$xid
--source extra/binlog_tests/gtid_next_xa_error_simul.test
--let $error_simul=
--let $error_simul = at_commit
--let $gtid1= $uuida:$xid
--let $gtid2= $uuidb:$xid
--source extra/binlog_tests/gtid_next_xa_error_simul.test
--let $error_simul=
--let $do_shutdown_after_prepare = 1
--let $error_simul = at_commit
--let $gtid1= $uuida:$xid
--let $gtid2= $uuidb:$xid
--source extra/binlog_tests/gtid_next_xa_error_simul.test
--let $error_simul=
--let $do_shutdown_after_prepare = 0
--inc $i
--let $commit= ROLLBACK
}
DROP TABLE t1;
# rpl_init.inc saves GTID_MODE in the $gtid_mode variable
--let $rpl_gtid_mode= $gtid_mode
--source include/rpl_set_gtid_mode.inc
--source include/rpl_end.inc