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_3_STABLE
Details
-------
http://git.postgresql.org/pg/commitdiff/8407a11c5a004671142a9ac2fe29de3844360b0b
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(-)