From: Jon Olav Hauglid Date: December 16 2009 11:32am Subject: bzr commit into mysql-5.6-next-mr branch (jon.hauglid:3040) Bug#48541 List-Archive: http://lists.mysql.com/commits/94462 X-Bug: 48541 Message-Id: <200912161132.nBGBWGM7028655@dm-uk-02.uk.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2427795791103472591==" --===============2427795791103472591== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/z/mysql-next-4284-bug48541/ based on revid:kostja@stripped 3040 Jon Olav Hauglid 2009-12-16 Bug #48541 Deadlock between LOCK_open and LOCK_mdl The reason for the deadlock was an improper exit from MDL_context::wait_for_locks() which caused mysys_var->current_mutex to remain LOCK_mdl even though LOCK_mdl was no longer held by that connection. This could for example lead to a deadlock in the following way: 1) INSERT DELAYED tries to open a table but fails, and trying to recover it calls wait_for_locks(). 2) Due to a pending exclusive request, wait_for_locks() fails and exits without resetting mysys_var->current_mutex for the delayed insert handler thread. So it continues to point to LOCK_mdl. 3) The handler thread manages to open a table. 4) A different connection takes LOCK_open and tries to take LOCK_mdl. 5) FLUSH TABLES from a third connection notices that the handler thread has a table open, and tries to kill it. This involves locking mysys_var->current_mutex while having LOCK_open locked. Since current_mutex mistakenly points to LOCK_mdl, we have a deadlock. This patch makes sure MDL_EXIT_COND() is called before exiting wait_for_locks(). This clears mysys->current_mutex which resolves the issue. An assert is added to recover_from_failed_open_table_attempt() after wait_for_locks() is called, to check that current_mutex is indeed reset. With this assert in place, existing tests in (e.g.) mdl_sync.test will fail without this patch. modified: sql/mdl.cc sql/sql_base.cc === modified file 'sql/mdl.cc' --- a/sql/mdl.cc 2009-12-10 10:53:20 +0000 +++ b/sql/mdl.cc 2009-12-16 11:32:11 +0000 @@ -1254,7 +1254,8 @@ MDL_context::wait_for_locks(MDL_request_ } if (!mdl_request) { - pthread_mutex_unlock(&LOCK_mdl); + /* As a side-effect MDL_EXIT_COND() unlocks LOCK_mdl. */ + MDL_EXIT_COND(m_thd, mysys_var, old_msg); break; } pthread_cond_wait(&COND_mdl, &LOCK_mdl); === modified file 'sql/sql_base.cc' --- a/sql/sql_base.cc 2009-12-16 08:33:54 +0000 +++ b/sql/sql_base.cc 2009-12-16 11:32:11 +0000 @@ -3693,6 +3693,7 @@ recover_from_failed_open_table_attempt(T case OT_WAIT: result= (thd->mdl_context.wait_for_locks(&m_mdl_requests) || tdc_wait_for_old_versions(thd, &m_mdl_requests)); + DBUG_ASSERT(thd->mysys_var->current_mutex == NULL); break; case OT_DISCOVER: { --===============2427795791103472591== 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/z/mysql-next-4284-bug48541/ # testament_sha1: 55d271ca44d3e29de620ae0bd2b0bd04a4407399 # timestamp: 2009-12-16 12:32:16 +0100 # base_revision_id: kostja@stripped # # Begin bundle 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 KcKEhP6UdzA= --===============2427795791103472591==--