From: Jon Olav Hauglid Date: April 13 2011 1:26pm Subject: bzr commit into mysql-5.5 branch (jon.hauglid:3442) Bug#12352846 List-Archive: http://lists.mysql.com/commits/135327 X-Bug: 12352846 Message-Id: <201104131326.p3DDQjMk010302@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2619326816826966524==" --===============2619326816826966524== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.5-bug12352846/ based on revid:davi.arnaut@stripped 3442 Jon Olav Hauglid 2011-04-13 Bug#12352846 - TRANS_XA_START(THD*): ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL() FAILED The triggered assert checks that the previous XA transaction has done proper cleanup before a new XA transaction is started. The bug that caused it to be triggered was that XA COMMIT did not clean up error state if XA COMMIT discovered that the current XA transaction had to be rolled back. This patch fixes the problem by resetting the XA error state before XA COMMIT calls ha_rollback_trans(). This allows following XA transactions to be started without triggering the assert. Test case added to xa.test. modified: mysql-test/r/xa.result mysql-test/t/xa.test sql/transaction.cc === modified file 'mysql-test/r/xa.result' --- a/mysql-test/r/xa.result 2011-04-12 10:57:02 +0000 +++ b/mysql-test/r/xa.result 2011-04-13 13:26:33 +0000 @@ -200,3 +200,32 @@ SELECT * FROM t1; a 1 DROP TABLE t1; +# +# Bug#12352846 - TRANS_XA_START(THD*): +# ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL() +# FAILED +# +DROP TABLE IF EXISTS t1, t2; +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (a INT); +START TRANSACTION; +INSERT INTO t1 VALUES (1); +# Connection con2 +XA START 'xid1'; +# Sending: +INSERT INTO t2 SELECT a FROM t1; +# Connection default +# Waiting until INSERT ... is blocked +DELETE FROM t1; +COMMIT; +# Connection con2 +# Reaping: INSERT INTO t2 SELECT a FROM t1 +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +XA COMMIT 'xid1'; +ERROR XA102: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected +XA START 'xid1'; +XA END 'xid1'; +XA PREPARE 'xid1'; +XA ROLLBACK 'xid1'; +# Connection default +DROP TABLE t1, t2; === modified file 'mysql-test/t/xa.test' --- a/mysql-test/t/xa.test 2011-04-12 10:57:02 +0000 +++ b/mysql-test/t/xa.test 2011-04-13 13:26:33 +0000 @@ -3,6 +3,8 @@ # -- source include/have_innodb.inc +--source include/not_embedded.inc + # Save the initial number of concurrent sessions --source include/count_sessions.inc @@ -326,6 +328,59 @@ SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # Bug#12352846 - TRANS_XA_START(THD*): +--echo # ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL() +--echo # FAILED +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1, t2; +--enable_warnings + +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (a INT); + +START TRANSACTION; +INSERT INTO t1 VALUES (1); + +--echo # Connection con2 +--connect (con2,localhost,root) +XA START 'xid1'; +--echo # Sending: +--send INSERT INTO t2 SELECT a FROM t1 + +--echo # Connection default +--connection default +let $wait_condition= + SELECT COUNT(*) = 1 FROM information_schema.processlist + WHERE state = "Sending data" + AND info = "INSERT INTO t2 SELECT a FROM t1"; +--echo # Waiting until INSERT ... is blocked +--source include/wait_condition.inc +DELETE FROM t1; +COMMIT; + +--echo # Connection con2 +--connection con2 +--echo # Reaping: INSERT INTO t2 SELECT a FROM t1 +--error ER_LOCK_DEADLOCK +--reap +--error ER_XA_RBDEADLOCK +XA COMMIT 'xid1'; +# This caused the assert to be triggered +XA START 'xid1'; + +XA END 'xid1'; +XA PREPARE 'xid1'; +XA ROLLBACK 'xid1'; + +--echo # Connection default +connection default; +DROP TABLE t1, t2; +disconnect con2; + + # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc === modified file 'sql/transaction.cc' --- a/sql/transaction.cc 2011-04-12 10:57:02 +0000 +++ b/sql/transaction.cc 2011-04-13 13:26:33 +0000 @@ -79,6 +79,33 @@ static bool xa_trans_rolled_back(XID_STA /** + Rollback the active XA transaction. + + @note Resets rm_error before calling ha_rollback(), so + the thd->transaction.xid structure gets reset + by ha_rollback() / THD::transaction::cleanup(). + + @return TRUE if the rollback failed, FALSE otherwise. +*/ + +static bool xa_trans_force_rollback(THD *thd) +{ + /* + We must reset rm_error before calling ha_rollback(), + so thd->transaction.xid structure gets reset + by ha_rollback()/THD::transaction::cleanup(). + */ + thd->transaction.xid_state.rm_error= 0; + if (ha_rollback_trans(thd, true)) + { + my_error(ER_XAER_RMERR, MYF(0)); + return true; + } + return false; +} + + +/** Begin a new transaction. @note Beginning a transaction implicitly commits any current @@ -649,8 +676,7 @@ bool trans_xa_commit(THD *thd) if (xa_trans_rolled_back(&thd->transaction.xid_state)) { - if (ha_rollback_trans(thd, TRUE)) - my_error(ER_XAER_RMERR, MYF(0)); + xa_trans_force_rollback(thd); res= thd->is_error(); } else if (xa_state == XA_IDLE && thd->lex->xa_opt == XA_ONE_PHASE) @@ -739,15 +765,7 @@ bool trans_xa_rollback(THD *thd) DBUG_RETURN(TRUE); } - /* - Resource Manager error is meaningless at this point, as we perform - explicit rollback request by user. We must reset rm_error before - calling ha_rollback(), so thd->transaction.xid structure gets reset - by ha_rollback()/THD::transaction::cleanup(). - */ - thd->transaction.xid_state.rm_error= 0; - if ((res= test(ha_rollback_trans(thd, TRUE)))) - my_error(ER_XAER_RMERR, MYF(0)); + res= xa_trans_force_rollback(thd); thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); thd->transaction.all.modified_non_trans_table= FALSE; --===============2619326816826966524== 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-5.5-bug12352846/ # testament_sha1: f4db3e12760f2f5c799d8107a935fea900f696b4 # timestamp: 2011-04-13 15:26:37 +0200 # base_revision_id: davi.arnaut@stripped\ # 6ewpc5z6r6fvy380 # # Begin bundle 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 --===============2619326816826966524==--