• Sujatha's avatar
    MDEV-17515: GTID Replication in optimistic mode deadlock · 410e3c1a
    Sujatha authored
    Problem:
    =======
    In slave_parallel_mode=optimistic configuration, when admin commands and
    DML operation on the same table are scheduled simultaneously for execution,
    it results in lock conflict and slave server either hangs due to
    deadlock or goes down with an assert.
    
    Analysis:
    ========
    Admin commands OPTIMIZE, REPAIR and ANALYZE are written to binary log as
    ordinary transactions. When 'slave_parallel_mode' is 'optimistic' DMLs are
    allowed to run in parallel. But these locks are not detected by parallel
    replication deadlock detection-and-handling mechanism. At times they result
    in deadlock or assertion.
    
    Fix:
    ===
    Flag admin commands as DDL in Gtid_log_event at the time of writing to
    binary log. Add a new bit EXECUTED_TABLE_ADMIN_CMD to
    'm_unsafe_rollback_flags'. During 'mysql_admin_table' command execution it
    accepts a list of tables to be processed and executes them in a loop. Upon
    successful execution enable 'EXECUTED_TABLE_ADMIN_CMD' bit in
    thd->transaction.stmt_unsafe_rollback_flags. Gtid_log_event constructor
    will notice this flag and mark the current transaction with 'FL_DDL' flag.
    Gtid_log_events marked as FL_DDL will not be scheduled parallel execution,
    on the slave. They will execute in isolation to prevent deadlocks.
    
    Note: Removed the call to 'trans_commit_implicit' from 'mysql_admin_table'
    function as 'mysql_execute_command' will take care of invoking
    'trans_commit_implicit'.
    410e3c1a
rpl_mark_optimize_tbl_ddl.test 4.1 KB