From: Jon Olav Hauglid Date: October 13 2010 2:15pm Subject: bzr commit into mysql-5.5-runtime branch (jon.hauglid:3164) Bug#55930 List-Archive: http://lists.mysql.com/commits/120691 X-Bug: 55930 Message-Id: <201010131415.o9DBtrFK021841@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1729282922868317499==" --===============1729282922868317499== 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-runtime-bug55930/ based on revid:dmitry.lenev@stripped 3164 Jon Olav Hauglid 2010-10-13 Bug #55930 Assertion `thd->transaction.stmt.is_empty() || thd->in_sub_stmt || (thd->state.. OPTIMIZE TABLE is not directly supported by InnoDB. Instead, recreate and analyze of the table is done. After recreate, the table is closed and locks are released before the table is reopened and locks re-acquired for the analyze phase. This assertion was triggered if OPTIMIZE TABLE failed to acquire thr_lock locks before starting the analyze phase. The assertion tests (among other things) that there no active statement transaction. However, as part of acquiring the thr_lock lock, external_lock() is called for InnoDB tables and this causes a statement transaction to be started. If thr_multi_lock() later fails (e.g. due to timeout), the failure handling code causes this assert to be triggered. This patch fixes the problem by doing rollback of the current statement transaction in case open_ltable (used by OPTIMIZE TABLE) fails to acquire thr_lock locks. Test case added to lock_sync.test. modified: mysql-test/r/lock_sync.result mysql-test/t/lock_sync.test sql/sql_base.cc === modified file 'mysql-test/r/lock_sync.result' --- a/mysql-test/r/lock_sync.result 2010-06-17 13:31:51 +0000 +++ b/mysql-test/r/lock_sync.result 2010-10-13 14:15:28 +0000 @@ -704,3 +704,37 @@ SET DEBUG_SYNC="now SIGNAL query"; # Connection default DROP EVENT e2; SET DEBUG_SYNC="RESET"; +# +# Bug#55930 Assertion `thd->transaction.stmt.is_empty() || +# thd->in_sub_stmt || (thd->state.. +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(a INT) engine=InnoDB; +INSERT INTO t1 VALUES (1), (2); +# Connection con1 +SET SESSION lock_wait_timeout= 1; +SET DEBUG_SYNC= 'ha_admin_open_ltable SIGNAL opti_recreate WAIT_FOR opti_analyze'; +# Sending: +OPTIMIZE TABLE t1; +# Connection con2 +SET DEBUG_SYNC= 'now WAIT_FOR opti_recreate'; +SET DEBUG_SYNC= 'after_lock_tables_takes_lock SIGNAL thrlock WAIT_FOR release_thrlock'; +# Sending: +INSERT INTO t1 VALUES (3); +# Connection default +SET DEBUG_SYNC= 'now WAIT_FOR thrlock'; +SET DEBUG_SYNC= 'now SIGNAL opti_analyze'; +# Connection con1 +# Reaping: OPTIMIZE TABLE t1 +Table Op Msg_type Msg_text +test.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test.t1 optimize error Lock wait timeout exceeded; try restarting transaction +test.t1 optimize status Operation failed +Warnings: +Error 1205 Lock wait timeout exceeded; try restarting transaction +SET DEBUG_SYNC= 'now SIGNAL release_thrlock'; +# Connection con2 +# Reaping: INSERT INTO t1 VALUES (3) +# Connection default +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; === modified file 'mysql-test/t/lock_sync.test' --- a/mysql-test/t/lock_sync.test 2010-08-06 11:29:37 +0000 +++ b/mysql-test/t/lock_sync.test 2010-10-13 14:15:28 +0000 @@ -1023,6 +1023,61 @@ DROP EVENT e2; SET DEBUG_SYNC="RESET"; +--echo # +--echo # Bug#55930 Assertion `thd->transaction.stmt.is_empty() || +--echo # thd->in_sub_stmt || (thd->state.. +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1(a INT) engine=InnoDB; +INSERT INTO t1 VALUES (1), (2); + +connect (con1, localhost, root); +connect (con2, localhost, root); + +--echo # Connection con1 +connection con1; +SET SESSION lock_wait_timeout= 1; +SET DEBUG_SYNC= 'ha_admin_open_ltable SIGNAL opti_recreate WAIT_FOR opti_analyze'; +--echo # Sending: +--send OPTIMIZE TABLE t1 + +--echo # Connection con2 +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR opti_recreate'; +SET DEBUG_SYNC= 'after_lock_tables_takes_lock SIGNAL thrlock WAIT_FOR release_thrlock'; +--echo # Sending: +--send INSERT INTO t1 VALUES (3) + +--echo # Connection default +connection default; +SET DEBUG_SYNC= 'now WAIT_FOR thrlock'; +SET DEBUG_SYNC= 'now SIGNAL opti_analyze'; + +--echo # Connection con1 +connection con1; +--echo # Reaping: OPTIMIZE TABLE t1 +--reap +SET DEBUG_SYNC= 'now SIGNAL release_thrlock'; +disconnect con1; +--source include/wait_until_disconnected.inc + +--echo # Connection con2 +connection con2; +--echo # Reaping: INSERT INTO t1 VALUES (3) +--reap +disconnect con2; +--source include/wait_until_disconnected.inc + +--echo # Connection default +connection default; +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; + + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc === modified file 'sql/sql_base.cc' --- a/sql/sql_base.cc 2010-10-11 03:23:51 +0000 +++ b/sql/sql_base.cc 2010-10-13 14:15:28 +0000 @@ -5319,7 +5319,10 @@ TABLE *open_ltable(THD *thd, TABLE_LIST end: if (table == NULL) + { + trans_rollback_stmt(thd); close_thread_tables(thd); + } thd_proc_info(thd, 0); DBUG_RETURN(table); } --===============1729282922868317499== 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-runtime-bug55930/ # testament_sha1: e075660332a9b139d14b53efce07f609df8c0606 # timestamp: 2010-10-13 16:15:32 +0200 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: dmitry.lenev@stripped\ # olvr6c2xn4m8gazk # # Begin bundle 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 wSlxCIEuC0O4BBJGWimrdGC/4u5IpwoSFBxoyWA= --===============1729282922868317499==--