aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c25
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);