static TimestampTz XLogReceiptTime = 0;
static XLogSource XLogReceiptSource = XLOG_FROM_ANY;
-/* State information for XLOG reading */
-static XLogRecPtr ReadRecPtr; /* start of last record read */
-static XLogRecPtr EndRecPtr; /* end+1 of last record read */
-
/*
* Local copies of equivalent fields in the control file. When running
* crash recovery, minRecoveryPoint is set to InvalidXLogRecPtr as we
char *errormsg;
record = XLogReadRecord(xlogreader, &errormsg);
- ReadRecPtr = xlogreader->ReadRecPtr;
- EndRecPtr = xlogreader->EndRecPtr;
if (record == NULL)
{
/*
* shouldn't loop anymore in that case.
*/
if (errormsg)
- ereport(emode_for_corrupt_record(emode, EndRecPtr),
+ ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
(errmsg_internal("%s", errormsg) /* already translated */ ));
}
wal_segment_size);
XLogFileName(fname, xlogreader->seg.ws_tli, segno,
wal_segment_size);
- ereport(emode_for_corrupt_record(emode, EndRecPtr),
+ ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
(errmsg("unexpected timeline ID %u in log segment %s, offset %u",
xlogreader->latestPageTLI,
fname,
/* initialize minRecoveryPoint to this record */
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
ControlFile->state = DB_IN_ARCHIVE_RECOVERY;
- if (ControlFile->minRecoveryPoint < EndRecPtr)
+ if (ControlFile->minRecoveryPoint < xlogreader->EndRecPtr)
{
- ControlFile->minRecoveryPoint = EndRecPtr;
+ ControlFile->minRecoveryPoint = xlogreader->EndRecPtr;
ControlFile->minRecoveryPointTLI = replayTLI;
}
/* update local copy */
if (checkPoint.redo < RecPtr)
XLogCtl->replayEndRecPtr = checkPoint.redo;
else
- XLogCtl->replayEndRecPtr = EndRecPtr;
+ XLogCtl->replayEndRecPtr = xlogreader->EndRecPtr;
XLogCtl->replayEndTLI = replayTLI;
XLogCtl->lastReplayedEndRecPtr = XLogCtl->replayEndRecPtr;
XLogCtl->lastReplayedTLI = XLogCtl->replayEndTLI;
ereport(LOG,
(errmsg("redo starts at %X/%X",
- LSN_FORMAT_ARGS(ReadRecPtr))));
+ LSN_FORMAT_ARGS(xlogreader->ReadRecPtr))));
/* Prepare to report progress of the redo phase. */
if (!StandbyMode)
if (!StandbyMode)
ereport_startup_progress("redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X",
- LSN_FORMAT_ARGS(ReadRecPtr));
+ LSN_FORMAT_ARGS(xlogreader->ReadRecPtr));
#ifdef WAL_DEBUG
if (XLOG_DEBUG ||
if (newReplayTLI != replayTLI)
{
/* Check that it's OK to switch to this TLI */
- checkTimeLineSwitch(EndRecPtr, newReplayTLI,
+ checkTimeLineSwitch(xlogreader->EndRecPtr,
+ newReplayTLI,
prevReplayTLI, replayTLI);
/* Following WAL records should be run with new TLI */
* so that XLogFlush will update minRecoveryPoint correctly.
*/
SpinLockAcquire(&XLogCtl->info_lck);
- XLogCtl->replayEndRecPtr = EndRecPtr;
+ XLogCtl->replayEndRecPtr = xlogreader->EndRecPtr;
XLogCtl->replayEndTLI = replayTLI;
SpinLockRelease(&XLogCtl->info_lck);
* successfully replayed.
*/
SpinLockAcquire(&XLogCtl->info_lck);
- XLogCtl->lastReplayedEndRecPtr = EndRecPtr;
+ XLogCtl->lastReplayedEndRecPtr = xlogreader->EndRecPtr;
XLogCtl->lastReplayedTLI = replayTLI;
SpinLockRelease(&XLogCtl->info_lck);
}
/* Remember this record as the last-applied one */
- LastRec = ReadRecPtr;
+ LastRec = xlogreader->ReadRecPtr;
/* Allow read-only connections if we're consistent now */
CheckRecoveryConsistency();
* (possibly bogus) future WAL segments on the old
* timeline.
*/
- RemoveNonParentXlogFiles(EndRecPtr, replayTLI);
+ RemoveNonParentXlogFiles(xlogreader->EndRecPtr, replayTLI);
/*
* Wake up any walsenders to notice that we are on a new
ereport(LOG,
(errmsg("redo done at %X/%X system usage: %s",
- LSN_FORMAT_ARGS(ReadRecPtr),
+ LSN_FORMAT_ARGS(xlogreader->ReadRecPtr),
pg_rusage_show(&ru0))));
xtime = GetLatestXTime();
if (xtime)
*/
XLogBeginRead(xlogreader, LastRec);
record = ReadRecord(xlogreader, PANIC, false, replayTLI);
- EndOfLog = EndRecPtr;
+ EndOfLog = xlogreader->EndRecPtr;
/*
* EndOfLogTLI is the TLI in the filename of the XLOG segment containing
* between here and writing the end-of-recovery record.
*/
writeTimeLineHistory(newTLI, recoveryTargetTLI,
- EndRecPtr, reason);
+ xlogreader->EndRecPtr, reason);
/*
* Since there might be a partial WAL segment named RECOVERYXLOG, get
* startup process.)
*/
static void
-RecoveryRestartPoint(const CheckPoint *checkPoint)
+RecoveryRestartPoint(const CheckPoint *checkPoint, XLogReaderState *record)
{
/*
* Also refrain from creating a restartpoint if we have seen any
* work out the next time it wants to perform a restartpoint.
*/
SpinLockAcquire(&XLogCtl->info_lck);
- XLogCtl->lastCheckPointRecPtr = ReadRecPtr;
- XLogCtl->lastCheckPointEndPtr = EndRecPtr;
+ XLogCtl->lastCheckPointRecPtr = record->ReadRecPtr;
+ XLogCtl->lastCheckPointEndPtr = record->EndRecPtr;
XLogCtl->lastCheckPoint = *checkPoint;
SpinLockRelease(&XLogCtl->info_lck);
}
(errmsg("unexpected timeline ID %u (should be %u) in checkpoint record",
checkPoint.ThisTimeLineID, replayTLI)));
- RecoveryRestartPoint(&checkPoint);
+ RecoveryRestartPoint(&checkPoint, record);
}
else if (info == XLOG_CHECKPOINT_ONLINE)
{
(errmsg("unexpected timeline ID %u (should be %u) in checkpoint record",
checkPoint.ThisTimeLineID, replayTLI)));
- RecoveryRestartPoint(&checkPoint);
+ RecoveryRestartPoint(&checkPoint, record);
}
else if (info == XLOG_OVERWRITE_CONTRECORD)
{
if (!fpw)
{
SpinLockAcquire(&XLogCtl->info_lck);
- if (XLogCtl->lastFpwDisableRecPtr < ReadRecPtr)
- XLogCtl->lastFpwDisableRecPtr = ReadRecPtr;
+ if (XLogCtl->lastFpwDisableRecPtr < record->ReadRecPtr)
+ XLogCtl->lastFpwDisableRecPtr = record->ReadRecPtr;
SpinLockRelease(&XLogCtl->info_lck);
}
* errmsg_internal() because the message was already translated.
*/
if (xlogreader->errormsg_buf[0])
- ereport(emode_for_corrupt_record(emode, EndRecPtr),
+ ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
(errmsg_internal("%s", xlogreader->errormsg_buf)));
/* reset any error XLogReaderValidatePageHeader() might have set */