From: Jon Olav Hauglid Date: September 3 2010 1:49pm Subject: bzr commit into mysql-5.5-runtime branch (jon.hauglid:3133) Bug#56494 List-Archive: http://lists.mysql.com/commits/117524 X-Bug: 56494 Message-Id: <201009031350.o837ru2R024372@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2673648246443161561==" --===============2673648246443161561== 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-bug56494/ based on revid:jon.hauglid@stripped 3133 Jon Olav Hauglid 2010-09-03 Bug #56494 Segfault in upgrade_shared_lock_to_exclusive() for REPAIR of merge table This crash happened if a table maintenance statement (ANALYZE TABLE, REPAIR TABLE, etc.) was executed on a MERGE table and a metadata lock on the MERGE table could not be acquired due to a conflicting metadata lock on a child table. During processing of maintenance statments, the metadata lock on the table is upgraded. If the lock was not acquired in the first place, this would cause a segfault. This patch fixes the problem by checking that we in fact have a metadata lock on the table before lock upgrade is attempted. Test case added to mdl_sync.test. modified: mysql-test/r/mdl_sync.result mysql-test/t/mdl_sync.test sql/sql_admin.cc === modified file 'mysql-test/r/mdl_sync.result' --- a/mysql-test/r/mdl_sync.result 2010-08-12 13:50:23 +0000 +++ b/mysql-test/r/mdl_sync.result 2010-09-03 13:49:36 +0000 @@ -2913,3 +2913,27 @@ UNLOCK TABLES; # Connection default UNLOCK TABLES; DROP DATABASE db1; +# +# Bug#56494 Segfault in upgrade_shared_lock_to_exclusive() for +# REPAIR of merge table +# +DROP TABLE IF EXISTS t1, t2, m1; +CREATE TABLE t1 (a INT) engine=MyISAM; +CREATE TABLE t2 (a INT) engine=MyISAM; +CREATE TABLE m1 (a INT) engine=MERGE UNION=(t1, t2); +# Connection default +SET DEBUG_SYNC= 'after_lock_tables_takes_lock SIGNAL waiting WAIT_FOR repaired'; +# Sending: +CREATE TABLE IF NOT EXISTS t1 (a INT); +# Connection con1 +# Waiting for CREATE TABLE to acquire a lock +SET DEBUG_SYNC= 'now WAIT_FOR waiting'; +SET SESSION lock_wait_timeout= 1; +REPAIR TABLE m1; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SET DEBUG_SYNC= 'now SIGNAL repaired'; +# Connection default +# Reaping: CREATE TABLE IF NOT EXISTS t1 (a INT) +Warnings: +Note 1050 Table 't1' already exists +DROP TABLE m1, t1, t2; === modified file 'mysql-test/t/mdl_sync.test' --- a/mysql-test/t/mdl_sync.test 2010-08-12 13:50:23 +0000 +++ b/mysql-test/t/mdl_sync.test 2010-09-03 13:49:36 +0000 @@ -4532,6 +4532,45 @@ disconnect con2; disconnect con3; +--echo # +--echo # Bug#56494 Segfault in upgrade_shared_lock_to_exclusive() for +--echo # REPAIR of merge table +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1, t2, m1; +--enable_warnings + +CREATE TABLE t1 (a INT) engine=MyISAM; +CREATE TABLE t2 (a INT) engine=MyISAM; +CREATE TABLE m1 (a INT) engine=MERGE UNION=(t1, t2); + +connect (con1, localhost, root); + +--echo # Connection default +connection default; +SET DEBUG_SYNC= 'after_lock_tables_takes_lock SIGNAL waiting WAIT_FOR repaired'; +--echo # Sending: +--send CREATE TABLE IF NOT EXISTS t1 (a INT) + +--echo # Connection con1 +connection con1; +--echo # Waiting for CREATE TABLE to acquire a lock +SET DEBUG_SYNC= 'now WAIT_FOR waiting'; +SET SESSION lock_wait_timeout= 1; +# This caused the segfault +--error ER_LOCK_WAIT_TIMEOUT +REPAIR TABLE m1; +SET DEBUG_SYNC= 'now SIGNAL repaired'; + +--echo # Connection default +connection default; +--echo # Reaping: CREATE TABLE IF NOT EXISTS t1 (a INT) +--reap +DROP TABLE m1, t1, t2; +disconnect con1; + + # 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_admin.cc' --- a/sql/sql_admin.cc 2010-08-18 11:29:04 +0000 +++ b/sql/sql_admin.cc 2010-09-03 13:49:36 +0000 @@ -488,7 +488,8 @@ static bool mysql_admin_table(THD* thd, */ if (lock_type == TL_WRITE && !table->table->s->tmp_table) { - if (wait_while_table_is_used(thd, table->table, + if (!table->table->mdl_ticket || + wait_while_table_is_used(thd, table->table, HA_EXTRA_PREPARE_FOR_RENAME)) goto err; DEBUG_SYNC(thd, "after_admin_flush"); --===============2673648246443161561== 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-bug56494/ # testament_sha1: abd12d5b3dfeb6c3df9172a1da0d6c341587f767 # timestamp: 2010-09-03 15:49:40 +0200 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: jon.hauglid@stripped\ # zesazp04nton9ozx # # Begin bundle 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 --===============2673648246443161561==--