• Andres Freund's avatar
    Fix issues around the "variable" support in the lwlock infrastructure. · 70397601
    Andres Freund authored
    The lwlock scalability work introduced two race conditions into the
    lwlock variable support provided for xlog.c. First, and harmlessly on
    most platforms, it set/read the variable without the spinlock in some
    places. Secondly, due to the removal of the spinlock, it was possible
    that a backend missed changes to the variable's state if it changed in
    the wrong moment because checking the lock's state, the variable's state
    and the queuing are not protected by a single spinlock acquisition
    anymore.
    
    To fix first move resetting the variable's from LWLockAcquireWithVar to
    WALInsertLockRelease, via a new function LWLockReleaseClearVar. That
    prevents issues around waiting for a variable's value to change when a
    new locker has acquired the lock, but not yet set the value. Secondly
    re-check that the variable hasn't changed after enqueing, that prevents
    the issue that the lock has been released and already re-acquired by the
    time the woken up backend checks for the lock's state.
    
    Reported-By: Jeff Janes
    Analyzed-By: Heikki Linnakangas
    Reviewed-By: Heikki Linnakangas
    Discussion: 5592DB35.2060401@iki.fi
    Backpatch: 9.5, where the lwlock scalability went in
    70397601
lwlock.h 9.45 KB