diff options
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 7654ad76de1..f1a795bba9f 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -70,6 +70,7 @@ #include "storage/proc.h" #include "storage/procarray.h" #include "storage/reinit.h" +#include "storage/sinvaladt.h" #include "storage/smgr.h" #include "storage/spin.h" #include "storage/sync.h" @@ -8020,6 +8021,30 @@ StartupXLOG(void) } /* + * Invalidate all sinval-managed caches before READ WRITE transactions + * begin. The xl_heap_inplace WAL record doesn't store sufficient data + * for invalidations. The commit record, if any, has the invalidations. + * However, the inplace update is permanent, whether or not we reach a + * commit record. Fortunately, read-only transactions tolerate caches not + * reflecting the latest inplace updates. Read-only transactions + * experience the notable inplace updates as follows: + * + * - relhasindex=true affects readers only after the CREATE INDEX + * transaction commit makes an index fully available to them. + * + * - datconnlimit=DATCONNLIMIT_INVALID_DB affects readers only at + * InitPostgres() time, and that read does not use a cache. + * + * - relfrozenxid, datfrozenxid, relminmxid, and datminmxid have no effect + * on readers. + * + * Hence, hot standby queries (all READ ONLY) function correctly without + * the missing invalidations. This avoided changing the WAL format in + * back branches. + */ + SIResetAll(); + + /* * Preallocate additional log files, if wanted. */ PreallocXlogFiles(EndOfLog); |