From ec97ce952e319049b183d711ea5f847352b072c3 Mon Sep 17 00:00:00 2001 From: Konstantin Osipov Date: Thu, 3 Jun 2010 18:32:56 +0400 Subject: [PATCH] A follow up for the previous patch, titled: A code review comment for Bug#52289. Encapsulate the deadlock detection functionality into a visitor class... Remove a race introduced by omission: initialize iterators under a read lock on the object. --- sql/mdl.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sql/mdl.cc b/sql/mdl.cc index 75970396af7..68ac0cc599d 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -1854,15 +1854,16 @@ bool MDL_lock::find_deadlock(MDL_ticket *waiting_ticket, MDL_ticket *ticket; MDL_context *src_ctx= waiting_ticket->get_ctx(); bool result= TRUE; - Ticket_iterator granted_it(m_granted); - Ticket_iterator waiting_it(m_waiting); - if (dvisitor->enter_node(src_ctx)) return TRUE; mysql_prlock_rdlock(&m_rwlock); + /* Must be initialized after taking a read lock. */ + Ticket_iterator granted_it(m_granted); + Ticket_iterator waiting_it(m_waiting); + /* We do a breadth-first search first -- that is, inspect all edges of the current node, and only then follow up to the next