Don't open a WAL segment for writing at end of recovery.
authorHeikki Linnakangas <[email protected]>
Wed, 7 Jan 2015 14:11:33 +0000 (16:11 +0200)
committerHeikki Linnakangas <[email protected]>
Wed, 7 Jan 2015 14:20:20 +0000 (16:20 +0200)
Since commit ba94518a, we used XLogFileOpen to open the next segment for
writing, but if the end-of-recovery happens exactly at a segment boundary,
the new segment might not exist yet. (Before ba94518a, XLogFileOpen was
correct, because we would open the previous segment if the switch happened
at the boundary.)

Instead of trying to create it if necessary, it's simpler to not bother
opening the segment at all. XLogWrite() will open or create it soon anyway,
after writing the checkpoint or end-of-recovery record.

Reported by Andres Freund.

src/backend/access/transam/xlog.c

index 218de876e4df6728f00f276d25d4ef91a85b2859..839ea7c7a0559c214e4d6b021725ea75ce9f304c 100644 (file)
@@ -5646,7 +5646,6 @@ StartupXLOG(void)
    XLogRecPtr  RecPtr,
                checkPointLoc,
                EndOfLog;
-   XLogSegNo   startLogSegNo;
    TimeLineID  PrevTimeLineID;
    XLogRecord *record;
    TransactionId oldestActiveXID;
@@ -6633,7 +6632,6 @@ StartupXLOG(void)
     */
    record = ReadRecord(xlogreader, LastRec, PANIC, false);
    EndOfLog = EndRecPtr;
-   XLByteToSeg(EndOfLog, startLogSegNo);
 
    /*
     * Complain if we did not roll forward far enough to render the backup
@@ -6741,9 +6739,6 @@ StartupXLOG(void)
     * buffer cache using the block containing the last record from the
     * previous incarnation.
     */
-   openLogSegNo = startLogSegNo;
-   openLogFile = XLogFileOpen(openLogSegNo);
-   openLogOff = 0;
    Insert = &XLogCtl->Insert;
    Insert->PrevBytePos = XLogRecPtrToBytePos(LastRec);
    Insert->CurrBytePos = XLogRecPtrToBytePos(EndOfLog);