From: Jon Olav Hauglid Date: March 2 2011 11:49am Subject: bzr commit into mysql-trunk branch (jon.hauglid:3717) Bug#11766752 List-Archive: http://lists.mysql.com/commits/132275 X-Bug: 11766752 Message-Id: <201103021149.p22BdIHN030641@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============9104803323025315609==" --===============9104803323025315609== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-trunk-bug59936/ based on revid:vinay.fisrekar@stripped 3717 Jon Olav Hauglid 2011-03-02 Bug #11766752 (former 59936) Multiple XA assertions - transactional statement fuzzer The problem was that the server for several statements did not check the state of the current XA transaction (if any) before trying to execute the statement. Specifically, you are not supposed to do anything other than XA PREPARE / XA COMMIT ONE PHASE when in IDLE state, or anything other than XA COMMIT / XA ROLLBACK in PREPARED state. The assertions triggered by the testcase posted in the bug report, was triggered by trying to access a table or rollback to a savepoint when the current XA transaction was in PREPARED state. This patch fixes the problem by reporting ER_XAER_RMFAIL error if 1) A statement tries to start a statement transaction when XA state is IDLE or PREPARED. 2) SAVEPOINT or ROLLBACK TO SAVEPOINT is executed with an active XA transaction. (Similar to what is already done for COMMIT/ROLLBACK) Test case added to xa.test. Also verified with the C testcase posted on the bug report. modified: mysql-test/r/xa.result mysql-test/t/xa.test sql/handler.cc sql/transaction.cc === modified file 'mysql-test/r/xa.result' --- a/mysql-test/r/xa.result 2011-02-14 13:16:31 +0000 +++ b/mysql-test/r/xa.result 2011-03-02 11:49:45 +0000 @@ -166,3 +166,27 @@ ERROR XA102: XA_RBDEADLOCK: Transaction XA END 'b'; XA ROLLBACK 'b'; DROP TABLE t1; +# +# Bug#11766752 59936: multiple xa assertions - transactional +# statement fuzzer +# +CREATE TABLE t1 (a INT) engine=InnoDB; +XA START 'a'; +INSERT INTO t1 VALUES (1); +SAVEPOINT savep; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state +XA END 'a'; +INSERT INTO t1 VALUES (2); +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state +SAVEPOINT savep; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state +XA PREPARE 'a'; +INSERT INTO t1 VALUES (2); +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the PREPARED state +SAVEPOINT savep; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the PREPARED state +XA COMMIT 'a'; +SELECT * FROM t1; +a +1 +DROP TABLE t1; === modified file 'mysql-test/t/xa.test' --- a/mysql-test/t/xa.test 2011-02-14 13:16:31 +0000 +++ b/mysql-test/t/xa.test 2011-03-02 11:49:45 +0000 @@ -287,6 +287,35 @@ DROP TABLE t1; disconnect con1; +--echo # +--echo # Bug#11766752 59936: multiple xa assertions - transactional +--echo # statement fuzzer +--echo # + +CREATE TABLE t1 (a INT) engine=InnoDB; +XA START 'a'; +INSERT INTO t1 VALUES (1); + +--error ER_XAER_RMFAIL +SAVEPOINT savep; + +XA END 'a'; +--error ER_XAER_RMFAIL +INSERT INTO t1 VALUES (2); +--error ER_XAER_RMFAIL +SAVEPOINT savep; + +XA PREPARE 'a'; +--error ER_XAER_RMFAIL +INSERT INTO t1 VALUES (2); +--error ER_XAER_RMFAIL +SAVEPOINT savep; + +XA COMMIT 'a'; +SELECT * FROM t1; +DROP TABLE t1; + + # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc === modified file 'sql/handler.cc' --- a/sql/handler.cc 2011-03-01 14:47:01 +0000 +++ b/sql/handler.cc 2011-03-02 11:49:45 +0000 @@ -975,6 +975,13 @@ void trans_register_ha(THD *thd, bool al DBUG_ENTER("trans_register_ha"); DBUG_PRINT("enter",("%s", all ? "all" : "stmt")); + enum xa_states xa_state= thd->transaction.xid_state.xa_state; + if (xa_state == XA_IDLE || xa_state == XA_PREPARED) + { + my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]); + DBUG_VOID_RETURN; + } + if (all) { trans= &thd->transaction.all; === modified file 'sql/transaction.cc' --- a/sql/transaction.cc 2011-02-14 14:15:28 +0000 +++ b/sql/transaction.cc 2011-03-02 11:49:45 +0000 @@ -362,6 +362,13 @@ bool trans_savepoint(THD *thd, LEX_STRIN !opt_using_transactions) DBUG_RETURN(FALSE); + enum xa_states xa_state= thd->transaction.xid_state.xa_state; + if (xa_state != XA_NOTR) + { + my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]); + DBUG_RETURN(TRUE); + } + sv= find_savepoint(thd, name); if (*sv) /* old savepoint of the same name exists */ @@ -435,6 +442,13 @@ bool trans_rollback_to_savepoint(THD *th DBUG_RETURN(TRUE); } + enum xa_states xa_state= thd->transaction.xid_state.xa_state; + if (xa_state != XA_NOTR) + { + my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]); + DBUG_RETURN(TRUE); + } + if (ha_rollback_to_savepoint(thd, sv)) res= TRUE; else if (((thd->variables.option_bits & OPTION_KEEP_LOG) || --===============9104803323025315609== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-trunk-bug59936/ # testament_sha1: 8c756b16f5aa66b513745d98117be0f5254fb7a1 # timestamp: 2011-03-02 12:49:49 +0100 # base_revision_id: vinay.fisrekar@stripped\ # k0g88bw0bi4zenav # # Begin bundle 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 --===============9104803323025315609==--