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.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0f661f5010c..a2ad5ebfe82 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7254,10 +7254,9 @@ ReadCheckpointRecord(XLogReaderState *xlogreader, XLogRecPtr RecPtr,
}
/*
- * This must be called during startup of a backend process, except that
- * it need not be called in a standalone backend (which does StartupXLOG
- * instead). We need to initialize the local copies of ThisTimeLineID and
- * RedoRecPtr.
+ * This must be called in a backend process before creating WAL records
+ * (except in a standalone backend, which does StartupXLOG instead). We need
+ * to initialize the local copies of ThisTimeLineID and RedoRecPtr.
*
* Note: before Postgres 8.0, we went to some effort to keep the postmaster
* process's copies of ThisTimeLineID and RedoRecPtr valid too. This was
@@ -7595,6 +7594,16 @@ CreateCheckPoint(int flags)
elog(ERROR, "can't create a checkpoint during recovery");
/*
+ * Initialize InitXLogInsert working areas before entering the critical
+ * section. Normally, this is done by the first call to
+ * RecoveryInProgress() or LocalSetXLogInsertAllowed(), but when creating
+ * an end-of-recovery checkpoint, the LocalSetXLogInsertAllowed call is
+ * done below in a critical section, and InitXLogInsert cannot be called
+ * in a critical section.
+ */
+ InitXLogInsert();
+
+ /*
* Acquire CheckpointLock to ensure only one checkpoint happens at a time.
* (This is just pro forma, since in the present system structure there is
* only one process that is allowed to issue checkpoints at any given