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.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index f8c714b7b7a..eddb13d13a7 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -8111,13 +8111,6 @@ StartupXLOG(void)
/* Reload shared-memory state for prepared transactions */
RecoverPreparedTransactions();
- /*
- * Shutdown the recovery environment. This must occur after
- * RecoverPreparedTransactions(), see notes for lock_twophase_recover()
- */
- if (standbyState != STANDBY_DISABLED)
- ShutdownRecoveryTransactionEnvironment();
-
/* Shut down xlogreader */
if (readFile >= 0)
{
@@ -8166,6 +8159,18 @@ StartupXLOG(void)
LWLockRelease(ControlFileLock);
/*
+ * Shutdown the recovery environment. This must occur after
+ * RecoverPreparedTransactions() (see notes in lock_twophase_recover())
+ * and after switching SharedRecoveryState to RECOVERY_STATE_DONE so as
+ * any session building a snapshot will not rely on KnownAssignedXids as
+ * RecoveryInProgress() would return false at this stage. This is
+ * particularly critical for prepared 2PC transactions, that would still
+ * need to be included in snapshots once recovery has ended.
+ */
+ if (standbyState != STANDBY_DISABLED)
+ ShutdownRecoveryTransactionEnvironment();
+
+ /*
* If there were cascading standby servers connected to us, nudge any wal
* sender processes to notice that we've been promoted.
*/