• Jan Lindström's avatar
    MDEV-33278 : Assertion failure in thd_get_thread_id at lock_wait_wsrep · b762541d
    Jan Lindström authored
    Problem is that not all conflicting transactions have THD object.
    Therefore, it must be checked that victim has THD
    before it's identification is added to victim list as victim's
    thread identification is later requested using thd_get_thread_id
    function that requires that we have valid pointer to THD object
    in trx->mysql_thd.
    
    Victim might not have trx->mysql_thd in two cases:
    
    (1) An incomplete transaction that was recovered from undo logs
    on server startup (and not yet rolled back).
    
    (2) Transaction that is in XA PREPARE state and whose client
    connection was disconnected.
    
    Neither of these can complete before lock_wait_wsrep()
    releases lock_sys.latch.
    
    (1) trx_t::commit_in_memory() is clearing both
    trx_t::state and trx_t::is_recovered before it invokes
    lock_release(trx_t*) (which would be blocked by the exclusive
    lock_sys.latch that we are holding here). Hence, it is not
    possible to write a debug assertion to document this scenario.
    
    (2) If is in XA PREPARE state, it would eventually be rolled
    back and the lock conflict would be resolved when an XA COMMIT
    or XA ROLLBACK statement is executed in some other connection.
    Signed-off-by: default avatarJulius Goryavsky <julius.goryavsky@mariadb.com>
    b762541d
lock0lock.cc 215 KB