• Tom Lane's avatar
    Don't ignore locktable-full failures in StandbyAcquireAccessExclusiveLock. · 8f0de712
    Tom Lane authored
    Commit 37c54863 removed the code in StandbyAcquireAccessExclusiveLock
    that checked the return value of LockAcquireExtended.  That created a
    bug, because it's still passing reportMemoryError = false to
    LockAcquireExtended, meaning that LOCKACQUIRE_NOT_AVAIL will be returned
    if we're out of shared memory for the lock table.
    
    In such a situation, the startup process would believe it had acquired an
    exclusive lock even though it hadn't, with potentially dire consequences.
    
    To fix, just drop the use of reportMemoryError = false, which allows us
    to simplify the call into a plain LockAcquire().  It's unclear that the
    locktable-full situation arises often enough that it's worth having a
    better recovery method than crash-and-restart.  (I strongly suspect that
    the only reason the code path existed at all was that it was relatively
    simple to do in the pre-37c54863 implementation.  But now it's not.)
    
    LockAcquireExtended's reportMemoryError parameter is now dead code and
    could be removed.  I refrained from doing so, however, because there
    was some interest in resurrecting the behavior if we do get reports of
    locktable-full failures in the field.  Also, it seems unwise to remove
    the parameter concurrently with shipping commit f868a814, which added a
    parameter; if there are any third-party callers of LockAcquireExtended,
    we want them to get a wrong-number-of-parameters compile error rather
    than a possibly-silent misinterpretation of its last parameter.
    
    Back-patch to 9.6 where the bug was introduced.
    
    Discussion: https://postgr.es/m/6202.1536359835@sss.pgh.pa.us
    8f0de712
lock.c 134 KB