• Andrei Elkin's avatar
    Bug#11763573 - 56299: MUTEX DEADLOCK WITH COM_BINLOG_DUMP, BINLOG PURGE, AND PROCESSLIST/KILL · 8b987dfd
    Andrei Elkin authored
    The bug case is similar to one fixed earlier bug_49536.
    Deadlock involving LOCK_log appears to be possible because the purge running thread
    is holding LOCK_log whereas there is no sense of doing that and which fact was
    exploited by the earlier bug fixes.
    
    Fixed with small reengineering of rotate_and_purge(), adding two new methods and
    setting up a policy to execute those instead of the former
    rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED).
    The policy for using rotate(), purge() is that if the caller acquires LOCK_log itself,
    it should call rotate(), release the mutex and run purge().
    
    Side effect of this patch is refining error message of bug@11747416 to print
    the whole path.
    
    
    
    mysql-test/suite/rpl/r/rpl_cant_read_event_incident.result:
      the file name printing is changed to a relative path instead of just the file name.
    mysql-test/suite/rpl/r/rpl_log_pos.result:
      the file name printing is changed to a relative path instead of just the file name.
    mysql-test/suite/rpl/r/rpl_manual_change_index_file.result:
      the file name printing is changed to a relative path instead of just the file name.
    mysql-test/suite/rpl/r/rpl_packet.result:
      the file name printing is changed to a relative path instead of just the file name.
    mysql-test/suite/rpl/r/rpl_rotate_purge_deadlock.result:
      new result file is added.
    mysql-test/suite/rpl/t/rpl_cant_read_event_incident.test:
      The test of that bug can't satisfy windows and unix backslash interpretation so windows
      execution is chosen to bypass.
    mysql-test/suite/rpl/t/rpl_rotate_purge_deadlock-master.opt:
      new opt file is added.
    mysql-test/suite/rpl/t/rpl_rotate_purge_deadlock.test:
      regression test is added as well as verification of a 
      possible side effect of the fixes is tried.
    sql/log.cc:
      LOCK_log is never taken during execution of log purging routine.
      The former MYSQL_BIN_LOG::rotate_and_purge is made to necessarily 
      acquiring and releasing LOCK_log. 
      If caller takes the mutex itself it has to use a new rotate(), purge() 
      methods combination and to never let purge() be run with LOCK_log grabbed.
      
      
      
      split apart to allow
      the caller to chose either it
      Simulation of concurrently rotating/purging threads is added.
    sql/log.h:
      new rotate(), purge() methods are added to be used instead of
      the former rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED).
      rotate_and_purge() signature is changed. Caller should not call rotate_and_purge()
      but rather {rotate(), purge()} if LOCK_log is acquired by it.
    sql/rpl_injector.cc:
      changes to reflect the new rotate_and_purge() signature.
    sql/sql_class.h:
      unnecessary constants are removed.
    sql/sql_parse.cc:
      changes to reflect the new rotate_and_purge() signature.
    sql/sql_reload.cc:
      changes to reflect the new rotate_and_purge() signature.
    sql/sql_repl.cc:
      followup for bug@11747416: the file name printing is changed to a relative 
      path instead of just the file name.
    8b987dfd
sql_repl.cc 62.2 KB