• Marko Mäkelä's avatar
    MDEV-24167 fixup: Wake up all update_lock() in u_unlock() · 07e4b6b2
    Marko Mäkelä authored
    It turns out that the hang that was fixed in
    commit 43d3dad1
    for the SRW_LOCK_DUMMY implementation is also possible in the futex
    implementation. We have observed hangs of ssux_lock_low::u_unlock()
    on Windows where the undesirable value is rw_lock::UPDATER, in the
    test mariabackup.xb_compressed_encrypted.
    
    The exact sequence of events to the hang is not known, but
    it seems that u_unlock() had better always wake up one thread.
    Possibly, the case involves multiple blocked u_unlock().
    
    On a busy server, the hang might be 'rescued' by a subsequent
    lock acquisition and release that is executed by another thread.
    
    rw_lock::update_unlock(): Change the return type to void.
    
    ssux_lock_low::u_unlock(): Always invoke readers_wake() [sic],
    to wake up any pending update_lock() or write_lock().
    On futex implementation, this will wake up all waiters.
    On SRW_LOCK_DUMMY, writer_wake() and readers_wake() do the same
    thing: wake up one write_lock(), or all update_lock() waiters.
    07e4b6b2
rw_lock.h 6.55 KB