postgresql/src/include/storage
Tom Lane 66321ae61b Fix longstanding recursion hazard in sinval message processing.
LockRelationOid and sibling routines supposed that, if our session already
holds the lock they were asked to acquire, they could skip calling
AcceptInvalidationMessages on the grounds that we must have already read
any remote sinval messages issued against the relation being locked.
This is normally true, but there's a critical special case where it's not:
processing inside AcceptInvalidationMessages might attempt to access system
relations, resulting in a recursive call to acquire a relation lock.

Hence, if the outer call had acquired that same system catalog lock, we'd
fall through, despite the possibility that there's an as-yet-unread sinval
message for that system catalog.  This could, for example, result in
failure to access a system catalog or index that had just been processed
by VACUUM FULL.  This is the explanation for buildfarm failures we've been
seeing intermittently for the past three months.  The bug is far older
than that, but commits a54e1f158 et al added a new recursion case within
AcceptInvalidationMessages that is apparently easier to hit than any
previous case.

To fix this, we must not skip calling AcceptInvalidationMessages until
we have *finished* a call to it since acquiring a relation lock, not
merely acquired the lock.  (There's already adequate logic inside
AcceptInvalidationMessages to deal with being called recursively.)
Fortunately, we can implement that at trivial cost, by adding a flag
to LOCALLOCK hashtable entries that tracks whether we know we have
completed such a call.

There is an API hazard added by this patch for external callers of
LockAcquire: if anything is testing for LOCKACQUIRE_ALREADY_HELD,
it might be fooled by the new return code LOCKACQUIRE_ALREADY_CLEAR
into thinking the lock wasn't already held.  This should be a fail-soft
condition, though, unless something very bizarre is being done in
response to the test.

Also, I added an additional output argument to LockAcquireExtended,
assuming that that probably isn't called by any outside code given
the very limited usefulness of its additional functionality.

Back-patch to all supported branches.

Discussion: https://postgr.es/m/12259.1532117714@sss.pgh.pa.us
2018-09-07 18:04:38 -04:00
..
backendid.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
barrier.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
block.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
buf.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
buf_internals.h Fix failure to mark init buffers as BM_PERMANENT. 2017-03-14 12:03:29 -04:00
buffile.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
bufmgr.h Fix bug leading to restoring unlogged relations from empty files. 2015-12-10 16:39:25 +01:00
bufpage.h Fix PageAddItem BRIN bug 2016-05-30 14:47:22 -04:00
checksum.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
checksum_impl.h Make checksum_impl.h safe to compile with -fstrict-aliasing. 2018-08-31 12:27:07 -04:00
copydir.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
dsm.h Add flags argument to dsm_create. 2015-03-19 13:03:03 -04:00
dsm_impl.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
fd.h Mark assorted variables PGDLLIMPORT. 2017-12-05 09:30:57 -05:00
freespace.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
fsm_internals.h Use FLEXIBLE_ARRAY_MEMBER in a bunch more places. 2015-02-20 00:11:42 -05:00
indexfsm.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
ipc.h Tweak __attribute__-wrapping macros for better pgindent results. 2015-03-26 14:03:25 -04:00
item.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
itemid.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
itemptr.h Improve packing/alignment annotation for ItemPointerData. 2015-05-21 17:21:46 -04:00
large_object.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
latch.h Don't CHECK_FOR_INTERRUPTS between WaitLatch and ResetLatch. 2016-08-01 15:13:53 -04:00
lmgr.h pgindent run for 9.5 2015-05-23 21:35:49 -04:00
lock.h Fix longstanding recursion hazard in sinval message processing. 2018-09-07 18:04:38 -04:00
lwlock.h Rework the way multixact truncations work. 2015-09-26 19:04:25 +02:00
off.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
pg_sema.h Remove the option to service interrupts during PGSemaphoreLock(). 2015-02-03 23:25:00 +01:00
pg_shmem.h On Windows, ensure shared memory handle gets closed if not being used. 2015-10-13 11:21:33 -04:00
pmsignal.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
pos.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
predicate.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
predicate_internals.h Define integer limits independently from the system definitions. 2015-04-02 17:43:35 +02:00
proc.h Mark assorted variables PGDLLIMPORT. 2017-12-05 09:30:57 -05:00
procarray.h Preserve required !catalog tuples while computing initial decoding snapshot. 2017-04-27 13:13:37 -07:00
procsignal.h Prevent possibility of panics during shutdown checkpoint. 2017-06-05 19:18:16 -07:00
reinit.h reinit.h: Fix typo in identification comment 2015-01-22 12:26:51 -03:00
relfilenode.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
s_lock.h Add support for Motorola 88K to s_lock.h. 2017-11-20 17:57:46 -05:00
shm_mq.h Don't send protocol messages to a shm_mq that no longer exists. 2015-10-16 09:49:08 -04:00
shm_toc.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
shmem.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
sinval.h Introduce and use infrastructure for interrupt processing during client reads. 2015-02-03 22:25:20 +01:00
sinvaladt.h Update copyright for 2015 2015-01-06 11:43:47 -05:00
smgr.h Improve the performance of relation deletes during recovery. 2018-07-05 02:27:46 +09:00
spin.h Remove cautions about using volatile from spin.h. 2015-10-16 14:10:28 -04:00
standby.h Use FLEXIBLE_ARRAY_MEMBER in a bunch more places. 2015-02-20 00:11:42 -05:00