• unknown's avatar
    Bug#16986 - Deadlock condition with MyISAM tables · 1c2a13b8
    unknown authored
    Addendum fixes after changing the condition variable
    for the global read lock.
    
    The stress test suite revealed some deadlocks. Some were
    related to the new condition variable (COND_global_read_lock)
    and some were general problems with the global read lock.
    
    It is now necessary to signal COND_global_read_lock whenever 
    COND_refresh is signalled.
    
    We need to wait for the release of a global read lock if one 
    is set before every operation that requires a write lock.
    But we must not wait if we have locked tables by LOCK TABLES.
    After setting a global read lock a thread waits until all
    write locks are released.
    
    
    mysql-test/r/lock_multi.result:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Added test results.
    mysql-test/t/lock_multi.test:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Added tests for possible deadlocks that did not occur
      with the stress test suite.
    mysys/thr_lock.c:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Added a protection against an infinite loop that occurs
      with the test case for Bug #20662.
    sql/lock.cc:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Signal COND_global_read_lock whenever COND_refresh
      is signalled by using the new function broadcast_refresh().
      Added the definition of a new function that signals 
      COND_global_read_lock whenever COND_refresh is signalled.
    sql/mysql_priv.h:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Added a declaration for a new function that signals 
      COND_global_read_lock whenever COND_refresh is signalled.
    sql/sql_base.cc:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Signal COND_global_read_lock whenever COND_refresh
      is signalled by using the new function broadcast_refresh().
    sql/sql_handler.cc:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Signal COND_global_read_lock whenever COND_refresh
      is signalled by using the new function broadcast_refresh().
    sql/sql_insert.cc:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Removed global read lock handling from inside of 
      INSERT DELAYED. It is handled on a higher level now.
    sql/sql_parse.cc:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Wait for the release of a global read lock if one is set
      before every operation that requires a write lock.
      But don't wait if locked tables exist already.
    sql/sql_table.cc:
      Bug#16986 - Deadlock condition with MyISAM tables
      Addendum fixes after changing the condition variable
      for the global read lock.
      Removed global read lock handling from inside of 
      CREATE TABLE. It is handled on a higher level now.
      Signal COND_global_read_lock whenever COND_refresh
      is signalled by using the new function broadcast_refresh().
    1c2a13b8
sql_handler.cc 22.4 KB