• Marko Mäkelä's avatar
    MDEV-25512 Deadlock between sux_lock::u_x_upgrade() and sux_lock::u_lock() · b8138288
    Marko Mäkelä authored
    In the SUX_LOCK_GENERIC implementation, we can remember at most
    one pending exclusive lock request. If multiple exclusive lock
    requests are pending, the WRITER_WAITING flag will be cleared when
    the first waiting writer acquires the exclusive lock.
    
    ssux_lock_low::update_lock(): If WRITER_WAITING is set, wake up
    the writer even if the UPDATER flag is set, because the waiting
    writer may be in the process of upgrading its U lock to X.
    
    rw_lock::read_unlock(): Also indicate that an X lock waiter must
    be woken up if an U lock exists.
    
    This fix may cause unnecessary wake-ups and system calls, but this
    is the best that we can do. Ideally we would use the MDEV-25404
    idea of a separate 'writer' mutex, but there is no portable way to
    request that a non-recursive mutex be created, and InnoDB requires
    the ability to transfer buf_block_t::lock ownership to an I/O thread.
    
    To allow problems like this to be caught more reliably in the future,
    we add a unit test for srw_mutex, srw_lock, ssux_lock, sux_lock.
    b8138288
CMakeLists.txt 1.07 KB