static bool recoveryTarget = false;
static bool recoveryTargetExact = false;
static bool recoveryTargetInclusive = true;
-static bool recoveryLogRestartpoints = false;
static TransactionId recoveryTargetXid;
static TimestampTz recoveryTargetTime;
static TimestampTz recoveryLastXTime = 0;
+/*
+ * log_restartpoints is stored in shared memory because it needs to be
+ * accessed by bgwriter when it performs restartpoints
+ */
/* if recoveryStopsHere returns true, it saves actual stop xid/time here */
static TransactionId recoveryStopXid;
XLogRecPtr lastCheckPointRecPtr;
CheckPoint lastCheckPoint;
+ /* Should restartpoints be logged? Taken from recovery.conf */
+ bool recoveryLogRestartpoints;
+
slock_t info_lck; /* locks shared variables shown above */
} XLogCtlData;
*/
if (InArchiveRecovery)
{
- uint32 nextLog = log;
- uint32 nextSeg = seg;
+ XLogRecPtr nextSegRecPtr;
+ uint32 nextLog = log;
+ uint32 nextSeg = seg;
NextLogSeg(nextLog, nextSeg);
+ nextSegRecPtr.xlogid = nextLog;
+ nextSegRecPtr.xrecoff = nextSeg * XLogSegSize;
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
- ControlFile->minSafeStartPoint.xlogid = nextLog;
- ControlFile->minSafeStartPoint.xrecoff = nextSeg * XLogSegSize;
- UpdateControlFile();
+ if (XLByteLT(ControlFile->minSafeStartPoint, nextSegRecPtr))
+ {
+ ControlFile->minSafeStartPoint = nextSegRecPtr;
+ UpdateControlFile();
+ }
LWLockRelease(ControlFileLock);
}
/*
* does nothing if a recovery_target is not also set
*/
- if (!parse_bool(tok2, &recoveryLogRestartpoints))
+ if (!parse_bool(tok2, &XLogCtl->recoveryLogRestartpoints))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("parameter \"log_restartpoints\" requires a Boolean value")));
bool recoveryContinue = true;
bool recoveryApply = true;
ErrorContextCallback errcontext;
+ XLogRecPtr minSafeStartPoint;
InRedo = true;
ereport(LOG,
(errmsg("redo starts at %X/%X",
ReadRecPtr.xlogid, ReadRecPtr.xrecoff)));
+ /*
+ * Take a local copy of minSafeStartPoint at the beginning of
+ * recovery, because it's updated as we go.
+ */
+ minSafeStartPoint = ControlFile->minSafeStartPoint;
+
/*
* main redo apply loop
*/
* latest LSN that recovery could have reached prior to crash.
*/
if (!reachedSafeStartPoint &&
- XLByteLE(ControlFile->minSafeStartPoint, EndRecPtr) &&
+ XLByteLE(minSafeStartPoint, EndRecPtr) &&
XLByteLE(ControlFile->minRecoveryPoint, EndRecPtr))
{
reachedSafeStartPoint = true;
return;
}
- if (recoveryLogRestartpoints)
+ if (XLogCtl->recoveryLogRestartpoints)
{
/*
* Prepare to accumulate statistics.
*/
/* All real work is done, but log before releasing lock. */
- if (recoveryLogRestartpoints)
+ if (XLogCtl->recoveryLogRestartpoints)
LogCheckpointEnd(flags, true);
- ereport((recoveryLogRestartpoints ? LOG : DEBUG2),
+ ereport((XLogCtl->recoveryLogRestartpoints ? LOG : DEBUG2),
(errmsg("recovery restart point at %X/%X",
lastCheckPoint.redo.xlogid, lastCheckPoint.redo.xrecoff)));
if (recoveryLastXTime)
- ereport((recoveryLogRestartpoints ? LOG : DEBUG2),
+ ereport((XLogCtl->recoveryLogRestartpoints ? LOG : DEBUG2),
(errmsg("last completed transaction was at log time %s",
timestamptz_to_str(recoveryLastXTime))));