• Monty's avatar
    MDEV-21953 deadlock between BACKUP STAGE BLOCK_COMMIT and parallel repl. · fc48c8ff
    Monty authored
    The issue was:
    T1, a parallel slave worker thread, is waiting for another worker thread to
    commit. While waiting, it has the MDL_BACKUP_COMMIT lock.
    T2, working for mariabackup, is doing BACKUP STAGE BLOCK_COMMIT and blocks
    all commits.
    This causes a deadlock as the thread T1 is waiting for can't commit.
    
    Fixed by moving locking of MDL_BACKUP_COMMIT from ha_commit_trans() to
    commit_one_phase_2()
    
    Other things:
    - Added a new argument to ha_comit_one_phase() to signal if the
      transaction was a write transaction.
    - Ensured that ha_maria::implicit_commit() is always called under
      MDL_BACKUP_COMMIT. This code is not needed in 10.5
    - Ensure that MDL_Request values 'type' and 'ticket' are always
      initialized. This makes it easier to check the state of the MDL_Request.
    - Moved thd->store_globals() earlier in handle_rpl_parallel_thread() as
      thd->init_for_queries() could use a MDL that could crash if store_globals
      where not called.
    - Don't call ha_enable_transactions() in THD::init_for_queries() as this
      is both slow (uses MDL locks) and not needed.
    fc48c8ff
sql_class.cc 229 KB