• Tom Lane's avatar
    Fix stale-pointer problem in fast-path locking logic. · 7db285af
    Tom Lane authored
    When acquiring a lock in fast-path mode, we must reset the locallock
    object's lock and proclock fields to NULL.  They are not necessarily that
    way to start with, because the locallock could be left over from a failed
    lock acquisition attempt earlier in the transaction.  Failure to do this
    led to all sorts of interesting misbehaviors when LockRelease tried to
    clean up no-longer-related lock and proclock objects in shared memory.
    Per report from Dan Wood.
    
    In passing, modify LockRelease to elog not just Assert if it doesn't find
    lock and proclock objects for a formerly fast-path lock, matching the code
    in FastPathGetRelationLockEntry and LockRefindAndRelease.  This isn't a
    bug but it will help in diagnosing any future bugs in this area.
    
    Also, modify FastPathTransferRelationLocks and FastPathGetRelationLockEntry
    to break out of their loops over the fastpath array once they've found the
    sole matching entry.  This was inconsistently done in some search loops
    and not others.
    
    Improve assorted related comments, too.
    
    Back-patch to 9.2 where the fast-path mechanism was introduced.
    7db285af
lock.c 119 KB