• Vladislav Vaintroub's avatar
    MDEV-15636 mariabackup --lock-ddl-per-table hangs if ALTER table is running · 27c24808
    Vladislav Vaintroub authored
    concurrently.
    
    There is a deadlock between
    
    C1 mariabackup's connection that holds MDL locks
    C2 Online ALTER TABLE that wants to have MDL exclusively
       and tries to upgrade its mdl lock.
    C3 another mariabackup's connection that does FLUSH TABLES (or FTWRL)
    
    C3 waits waits for C2,  which waits for C1, which waits for C3,
    thus the deadlock.
    
    
    MDL locks cannot be released until FLUSH  succeeds, because
    otherwise it would allow ALTER to sneak in, causing backup to abort and
    breaking lock-ddl-per-table's promise.
    
    The fix here workarounds the deadlock, by killing connections in
    "Waiting for metadata lock" status (i.e ALTER). This killing continues
    until FTWRL succeeds.
    
    Killing connections is skipped in case --no-locks parameter
    was  passed to backup, because there won't be a FLUSH.
    
    For the reference,in Percona's xtrabackup --lock-ddl-per-connection
    silently implies --no-lock ie FLUSH is always skipped there.
    
    A rather large part of fix is introducing DBUG capability to start
    a query  the new connection at the right moment of backup
    compensating somewhat for mariabackup' lack of send_query or DBUG_SYNC.
    27c24808
backup_copy.cc 44.9 KB