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
------
REL9_1_STABLE
Details
-------
http://git.postgresql.org/pg/commitdiff/45476031a54c12bebf2f209ea2b6fb3bfc905193
Modified Files
--------------
src/backend/access/transam/twophase.c | 4 +-
src/backend/utils/cache/inval.c | 33 ++++++++--------
src/backend/utils/cache/relcache.c | 66 ++++++++++++++++++---------------
src/include/utils/relcache.h | 3 +-
4 files changed, 57 insertions(+), 49 deletions(-)