diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 084401d..05fe9ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7155,6 +7155,13 @@ StartupXLOG(void) } /* + * Pre-scan prepared transactions to find out the range of XIDs present. + * We don't need this information quite yet, but if it fails for some + * reason, better to fail before we make any on-disk changes. + */ + oldestActiveXID = PrescanPreparedTransactions(NULL, NULL); + + /* * Consider whether we need to assign a new timeline ID. * * If we are doing an archive recovery, we always assign a new ID. This @@ -7208,6 +7215,24 @@ StartupXLOG(void) else snprintf(reason, sizeof(reason), "no recovery target specified"); + /* + * We are now done reading the old WAL. Turn off archive fetching if it + * was active, and make a writable copy of the last WAL segment. (Note + * that we also have a copy of the last block of the old WAL in readBuf; + * we will use that below.) + */ + exitArchiveRecovery(EndOfLogTLI, EndOfLog); + + /* + * Write the timeline history file, and have it archived. After this + * point (or rather, as soon as the file is archived), the timeline + * will appear as "taken" in the WAL archive and to any standby servers. + * If we crash before actually switching to the new timeline, standby + * servers will nevertheless think that we switched to the new timeline, + * and will try to connect to the new timeline. To minimize the window + * for that, try to do as little as possible between here and writing the + * end-of-recovery record. + */ writeTimeLineHistory(ThisTimeLineID, recoveryTargetTLI, EndRecPtr, reason); } @@ -7217,15 +7242,6 @@ StartupXLOG(void) XLogCtl->PrevTimeLineID = PrevTimeLineID; /* - * We are now done reading the old WAL. Turn off archive fetching if it - * was active, and make a writable copy of the last WAL segment. (Note - * that we also have a copy of the last block of the old WAL in readBuf; - * we will use that below.) - */ - if (ArchiveRecoveryRequested) - exitArchiveRecovery(EndOfLogTLI, EndOfLog); - - /* * Prepare to write WAL starting at EndOfLog position, and init xlog * buffer cache using the block containing the last record from the * previous incarnation. @@ -7277,9 +7293,6 @@ StartupXLOG(void) XLogCtl->LogwrtRqst.Write = EndOfLog; XLogCtl->LogwrtRqst.Flush = EndOfLog; - /* Pre-scan prepared transactions to find out the range of XIDs present */ - oldestActiveXID = PrescanPreparedTransactions(NULL, NULL); - /* * Update full_page_writes in shared memory and write an XLOG_FPW_CHANGE * record before resource manager writes cleanup WAL records or checkpoint