• Dmitry Lenev's avatar
    Fix for bug #50908 "Assertion `handler_tables_hash.records == 0' · 249be178
    Dmitry Lenev authored
    failed in enter_locked_tables_mode".
    
    Server was aborted due to assertion failure when one tried to 
    execute statement requiring prelocking (i.e. firing triggers
    or using stored functions) while having open HANDLERs.
    
    The problem was that THD::enter_locked_tables_mode() method
    which was called at the beginning of execution of prelocked 
    statement assumed there are no open HANDLERs. It had to do 
    so because corresponding THD::leave_locked_tables_mode()
    method was unable to properly restore MDL sentinel when
    leaving LOCK TABLES/prelocked mode in the presence of open 
    HANDLERs.
    
    This patch solves this problem by changing the latter method
    to properly restore MDL sentinel and thus removing need for 
    this assumption. As a side-effect, it lifts unjustified
    limitation by allowing to keep HANDLERs open when entering 
    LOCK TABLES mode.
    
    mysql-test/include/handler.inc:
      Adjusted tests after making LOCK TABLES not to close
      open HANDLERs. Added coverage for bug #50908
      "Assertion `handler_tables_hash.records == 0' failed
      in enter_locked_tables_mode".
    mysql-test/r/handler_innodb.result:
      Updated test results (see include/handler.inc).
    mysql-test/r/handler_myisam.result:
      Updated test results (see include/handler.inc).
    sql/mysql_priv.h:
      Introduced mysql_ha_move_tickets_after_trans_sentinel()
      routine which allows to move tickets for metadata locks
      corresponding to open HANDLERs after transaction sentinel.
    sql/sql_class.cc:
      Changed THD::leave_locked_tables_mode() to correctly restore 
      MDL sentinel value in the presence of open HANDLERs.
    sql/sql_class.h:
      Removed assert from THD::enter_locked_tables_mode() as we
      no longer have to close HANDLERs when entering LOCK TABLES 
      or prelocked modes. Instead we keep them open and correctly
      restore MDL sentinel value after leaving them.
      Removal of assert also fixes problem from the bug report.
    sql/sql_handler.cc:
      Introduced mysql_ha_move_tickets_after_trans_sentinel()
      routine which allows to move tickets for metadata locks
      corresponding to open HANDLERs after transaction sentinel.
    sql/sql_parse.cc:
      We no longer have to close HANDLERs when entering LOCK TABLES 
      mode. Instead we keep them open and simply correctly restore 
      MDL sentinel value after leaving this mode.
    249be178
sql_handler.cc 24.6 KB