• Heikki Linnakangas's avatar
    Fix race condition between hot standby and restoring a full-page image. · 81c45081
    Heikki Linnakangas authored
    There was a window in RestoreBackupBlock where a page would be zeroed out,
    but not yet locked. If a backend pinned and locked the page in that window,
    it saw the zeroed page instead of the old page or new page contents, which
    could lead to missing rows in a result set, or errors.
    
    To fix, replace RBM_ZERO with RBM_ZERO_AND_LOCK, which atomically pins,
    zeroes, and locks the page, if it's not in the buffer cache already.
    
    In stable branches, the old RBM_ZERO constant is renamed to RBM_DO_NOT_USE,
    to avoid breaking any 3rd party extensions that might use RBM_ZERO. More
    importantly, this avoids renumbering the other enum values, which would
    cause even bigger confusion in extensions that use ReadBufferExtended, but
    haven't been recompiled.
    
    Backpatch to all supported versions; this has been racy since hot standby
    was introduced.
    81c45081
xlogutils.c 20.9 KB