]> granicus.if.org Git - postgresql/commit
Fix stale-pointer problem in fast-path locking logic.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 27 Nov 2013 23:10:06 +0000 (18:10 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 27 Nov 2013 23:10:06 +0000 (18:10 -0500)
commit024edb4543d4159c587e71fff3d6ab6a85a10beb
tree7cef7486435af309bfaa3ff47f18d1300664a011
parent0b132b90424646a4251ef0f51c3babc2bb0725a6
Fix stale-pointer problem in fast-path locking logic.

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.
src/backend/storage/lmgr/lock.c
src/include/storage/lock.h