pgsql: Fix race condition in relcache init file invalidation.
Fix race condition in relcache init file invalidation.
The previous code tried to synchronize by unlinking the init file twice,
but that doesn't actually work: it leaves a window wherein a third process
could read the already-stale init file but miss the SI messages that would
tell it the data is stale. The result would be bizarre failures in catalog
accesses, typically "could not read block 0 in file ..." later during
startup.
Instead, hold RelCacheInitLock across both the unlink and the sending of
the SI messages. This is more straightforward, and might even be a bit
faster since only one unlink call is needed.
This has been wrong since it was put in (in 2002!), so back-patch to all
supported releases.
Branch
------
REL8_2_STABLE
Details
-------
http://git.postgresql.org/pg/commitdiff/44631eec3298d25b7b6fa71fc237c076f4e2a3a3
Modified Files
--------------
src/backend/utils/cache/inval.c | 8 ++--
src/backend/utils/cache/relcache.c | 68 +++++++++++++++++++----------------
src/include/utils/relcache.h | 3 +-
3 files changed, 43 insertions(+), 36 deletions(-)