diff options
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 387 |
1 files changed, 197 insertions, 190 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 40916571ac0..d753a31cb35 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.378 2010/02/25 02:17:50 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.379 2010/02/26 02:00:35 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -70,7 +70,7 @@ int XLOGbuffers = 8; int XLogArchiveTimeout = 0; bool XLogArchiveMode = false; char *XLogArchiveCommand = NULL; -bool XLogRequestRecoveryConnections = true; +bool XLogRequestRecoveryConnections = true; int MaxStandbyDelay = 30; bool fullPageWrites = true; bool log_checkpoints = false; @@ -140,9 +140,9 @@ TimeLineID ThisTimeLineID = 0; bool InRecovery = false; /* Are we in Hot Standby mode? Only valid in startup process, see xlog.h */ -HotStandbyState standbyState = STANDBY_DISABLED; +HotStandbyState standbyState = STANDBY_DISABLED; -static XLogRecPtr LastRec; +static XLogRecPtr LastRec; /* * Local copy of SharedRecoveryInProgress variable. True actually means "not @@ -156,7 +156,7 @@ static bool LocalRecoveryInProgress = true; * 0: unconditionally not allowed to insert XLOG * -1: must check RecoveryInProgress(); disallow until it is false * Most processes start with -1 and transition to 1 after seeing that recovery - * is not in progress. But we can also force the value for special cases. + * is not in progress. But we can also force the value for special cases. * The coding in XLogInsertAllowed() depends on the first two of these states * being numerically the same as bool true and false. */ @@ -181,7 +181,7 @@ static TimestampTz recoveryLastXTime = 0; /* options taken from recovery.conf for XLOG streaming */ static bool StandbyMode = false; static char *PrimaryConnInfo = NULL; -char *TriggerFile = NULL; +char *TriggerFile = NULL; /* if recoveryStopsHere returns true, it saves actual stop xid/time here */ static TransactionId recoveryStopXid; @@ -389,7 +389,7 @@ typedef struct XLogCtlData /* end+1 of the last record replayed (or being replayed) */ XLogRecPtr replayEndRecPtr; /* timestamp of last record replayed (or being replayed) */ - TimestampTz recoveryLastXTime; + TimestampTz recoveryLastXTime; /* end+1 of the last record replayed */ XLogRecPtr recoveryLastRecPtr; @@ -456,6 +456,7 @@ static uint32 readId = 0; static uint32 readSeg = 0; static uint32 readOff = 0; static uint32 readLen = 0; + /* Is the currently open segment being streamed from primary? */ static bool readStreamed = false; @@ -510,9 +511,9 @@ static void XLogWrite(XLogwrtRqst WriteRqst, bool flexible, bool xlog_switch); static bool InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath, bool find_free, int *max_advance, bool use_lock); -static int XLogFileRead(uint32 log, uint32 seg, int emode, TimeLineID tli, +static int XLogFileRead(uint32 log, uint32 seg, int emode, TimeLineID tli, bool fromArchive, bool notexistOk); -static int XLogFileReadAnyTLI(uint32 log, uint32 seg, int emode, +static int XLogFileReadAnyTLI(uint32 log, uint32 seg, int emode, bool fromArchive); static bool XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt, bool randAccess); @@ -1867,10 +1868,10 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force) * to not need a valid 'lsn' value. * * Another important reason for doing it this way is that the passed - * 'lsn' value could be bogus, i.e., past the end of available WAL, - * if the caller got it from a corrupted heap page. Accepting such - * a value as the min recovery point would prevent us from coming up - * at all. Instead, we just log a warning and continue with recovery. + * 'lsn' value could be bogus, i.e., past the end of available WAL, if + * the caller got it from a corrupted heap page. Accepting such a + * value as the min recovery point would prevent us from coming up at + * all. Instead, we just log a warning and continue with recovery. * (See also the comments about corrupt LSNs in XLogFlush.) */ SpinLockAcquire(&xlogctl->info_lck); @@ -1879,7 +1880,7 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force) if (!force && XLByteLT(newMinRecoveryPoint, lsn)) elog(WARNING, - "xlog min recovery request %X/%X is past current point %X/%X", + "xlog min recovery request %X/%X is past current point %X/%X", lsn.xlogid, lsn.xrecoff, newMinRecoveryPoint.xlogid, newMinRecoveryPoint.xrecoff); @@ -1912,10 +1913,10 @@ XLogFlush(XLogRecPtr record) /* * During REDO, we are reading not writing WAL. Therefore, instead of - * trying to flush the WAL, we should update minRecoveryPoint instead. - * We test XLogInsertAllowed(), not InRecovery, because we need the - * bgwriter to act this way too, and because when the bgwriter tries - * to write the end-of-recovery checkpoint, it should indeed flush. + * trying to flush the WAL, we should update minRecoveryPoint instead. We + * test XLogInsertAllowed(), not InRecovery, because we need the bgwriter + * to act this way too, and because when the bgwriter tries to write the + * end-of-recovery checkpoint, it should indeed flush. */ if (!XLogInsertAllowed()) { @@ -2007,16 +2008,16 @@ XLogFlush(XLogRecPtr record) * the whole system due to corruption on one data page. In particular, if * the bad page is encountered again during recovery then we would be * unable to restart the database at all! (This scenario actually - * happened in the field several times with 7.1 releases.) As of 8.4, - * bad LSNs encountered during recovery are UpdateMinRecoveryPoint's - * problem; the only time we can reach here during recovery is while - * flushing the end-of-recovery checkpoint record, and we don't expect - * that to have a bad LSN. + * happened in the field several times with 7.1 releases.) As of 8.4, bad + * LSNs encountered during recovery are UpdateMinRecoveryPoint's problem; + * the only time we can reach here during recovery is while flushing the + * end-of-recovery checkpoint record, and we don't expect that to have a + * bad LSN. * - * Note that for calls from xact.c, the ERROR will - * be promoted to PANIC since xact.c calls this routine inside a critical - * section. However, calls from bufmgr.c are not within critical sections - * and so we will not force a restart for a bad LSN on a data page. + * Note that for calls from xact.c, the ERROR will be promoted to PANIC + * since xact.c calls this routine inside a critical section. However, + * calls from bufmgr.c are not within critical sections and so we will not + * force a restart for a bad LSN on a data page. */ if (XLByteLT(LogwrtResult.Flush, record)) elog(ERROR, @@ -2136,9 +2137,10 @@ XLogNeedsFlush(XLogRecPtr record) LWLockRelease(ControlFileLock); /* - * An invalid minRecoveryPoint means that we need to recover all the WAL, - * i.e., we're doing crash recovery. We never modify the control file's - * value in that case, so we can short-circuit future checks here too. + * An invalid minRecoveryPoint means that we need to recover all the + * WAL, i.e., we're doing crash recovery. We never modify the control + * file's value in that case, so we can short-circuit future checks + * here too. */ if (minRecoveryPoint.xlogid == 0 && minRecoveryPoint.xrecoff == 0) updateMinRecoveryPoint = false; @@ -2572,46 +2574,46 @@ XLogFileRead(uint32 log, uint32 seg, int emode, TimeLineID tli, char path[MAXPGPATH]; int fd; - XLogFileName(xlogfname, tli, log, seg); + XLogFileName(xlogfname, tli, log, seg); - if (fromArchive) - { - /* Report recovery progress in PS display */ - snprintf(activitymsg, sizeof(activitymsg), "waiting for %s", - xlogfname); - set_ps_display(activitymsg, false); - - restoredFromArchive = RestoreArchivedFile(path, xlogfname, - "RECOVERYXLOG", - XLogSegSize); - if (!restoredFromArchive) - return -1; - } - else - { - XLogFilePath(path, tli, log, seg); - restoredFromArchive = false; - } + if (fromArchive) + { + /* Report recovery progress in PS display */ + snprintf(activitymsg, sizeof(activitymsg), "waiting for %s", + xlogfname); + set_ps_display(activitymsg, false); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY, 0); - if (fd >= 0) - { - /* Success! */ - curFileTLI = tli; + restoredFromArchive = RestoreArchivedFile(path, xlogfname, + "RECOVERYXLOG", + XLogSegSize); + if (!restoredFromArchive) + return -1; + } + else + { + XLogFilePath(path, tli, log, seg); + restoredFromArchive = false; + } - /* Report recovery progress in PS display */ - snprintf(activitymsg, sizeof(activitymsg), "recovering %s", - xlogfname); - set_ps_display(activitymsg, false); + fd = BasicOpenFile(path, O_RDONLY | PG_BINARY, 0); + if (fd >= 0) + { + /* Success! */ + curFileTLI = tli; - return fd; - } - if (errno != ENOENT || !notfoundOk) /* unexpected failure? */ - ereport(PANIC, - (errcode_for_file_access(), - errmsg("could not open file \"%s\" (log file %u, segment %u): %m", - path, log, seg))); - return -1; + /* Report recovery progress in PS display */ + snprintf(activitymsg, sizeof(activitymsg), "recovering %s", + xlogfname); + set_ps_display(activitymsg, false); + + return fd; + } + if (errno != ENOENT || !notfoundOk) /* unexpected failure? */ + ereport(PANIC, + (errcode_for_file_access(), + errmsg("could not open file \"%s\" (log file %u, segment %u): %m", + path, log, seg))); + return -1; } /* @@ -2653,8 +2655,8 @@ XLogFileReadAnyTLI(uint32 log, uint32 seg, int emode, bool fromArchive) * If not in StandbyMode, fall back to searching pg_xlog. In * StandbyMode we're streaming segments from the primary to pg_xlog, * and we mustn't confuse the (possibly partial) segments in pg_xlog - * with complete segments ready to be applied. We rather wait for - * the records to arrive through streaming. + * with complete segments ready to be applied. We rather wait for the + * records to arrive through streaming. */ if (!StandbyMode && fromArchive) { @@ -2685,8 +2687,8 @@ XLogFileClose(void) /* * WAL segment files will not be re-read in normal operation, so we advise * the OS to release any cached pages. But do not do so if WAL archiving - * or streaming is active, because archiver and walsender process could use - * the cache to read the WAL segment. + * or streaming is active, because archiver and walsender process could + * use the cache to read the WAL segment. */ #if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED) if (!XLogIsNeeded()) @@ -2893,7 +2895,7 @@ RestoreArchivedFile(char *path, const char *xlogfname, { if (expectedSize > 0 && stat_buf.st_size != expectedSize) { - int elevel; + int elevel; /* * If we find a partial file in standby mode, we assume it's @@ -2901,11 +2903,11 @@ RestoreArchivedFile(char *path, const char *xlogfname, * trying. * * Otherwise treat a wrong-sized file as FATAL to ensure the - * DBA would notice it, but is that too strong? We could try + * DBA would notice it, but is that too strong? We could try * to plow ahead with a local copy of the file ... but the * problem is that there probably isn't one, and we'd - * incorrectly conclude we've reached the end of WAL and - * we're done recovering ... + * incorrectly conclude we've reached the end of WAL and we're + * done recovering ... */ if (StandbyMode && stat_buf.st_size < expectedSize) elevel = DEBUG1; @@ -2975,6 +2977,7 @@ RestoreArchivedFile(char *path, const char *xlogfname, xlogfname, rc))); not_available: + /* * if an archived file is not available, there might still be a version of * this file in XLOGDIR, so return that as the filename to open. @@ -3141,6 +3144,7 @@ RemoveOldXlogFiles(uint32 log, uint32 seg, XLogRecPtr endptr) struct dirent *xlde; char lastoff[MAXFNAMELEN]; char path[MAXPGPATH]; + #ifdef WIN32 char newpath[MAXPGPATH]; #endif @@ -3218,21 +3222,22 @@ RemoveOldXlogFiles(uint32 log, uint32 seg, XLogRecPtr endptr) else { /* No need for any more future segments... */ - int rc; + int rc; ereport(DEBUG2, (errmsg("removing transaction log file \"%s\"", xlde->d_name))); #ifdef WIN32 + /* * On Windows, if another process (e.g another backend) * holds the file open in FILE_SHARE_DELETE mode, unlink * will succeed, but the file will still show up in - * directory listing until the last handle is closed. - * To avoid confusing the lingering deleted file for a - * live WAL file that needs to be archived, rename it - * before deleting it. + * directory listing until the last handle is closed. To + * avoid confusing the lingering deleted file for a live + * WAL file that needs to be archived, rename it before + * deleting it. * * If another process holds the file open without * FILE_SHARE_DELETE flag, rename will fail. We'll try @@ -3553,8 +3558,8 @@ ReadRecord(XLogRecPtr *RecPtr, int emode_arg, bool fetching_ckpt) RecPtr = &tmpRecPtr; /* - * Align recptr to next page if no more records can fit on the - * current page. + * Align recptr to next page if no more records can fit on the current + * page. */ if (XLOG_BLCKSZ - (RecPtr->xrecoff % XLOG_BLCKSZ) < SizeOfXLogRecord) { @@ -5093,8 +5098,8 @@ exitArchiveRecovery(TimeLineID endTLI, uint32 endLogId, uint32 endLogSeg) UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); /* - * If the ending log segment is still open, close it (to avoid - * problems on Windows with trying to rename or delete an open file). + * If the ending log segment is still open, close it (to avoid problems on + * Windows with trying to rename or delete an open file). */ if (readFile >= 0) { @@ -5376,17 +5381,17 @@ CheckRequiredParameterValues(CheckPoint checkPoint) { /* We ignore autovacuum_max_workers when we make this test. */ RecoveryRequiresIntParameter("max_connections", - MaxConnections, checkPoint.MaxConnections); + MaxConnections, checkPoint.MaxConnections); RecoveryRequiresIntParameter("max_prepared_xacts", - max_prepared_xacts, checkPoint.max_prepared_xacts); + max_prepared_xacts, checkPoint.max_prepared_xacts); RecoveryRequiresIntParameter("max_locks_per_xact", - max_locks_per_xact, checkPoint.max_locks_per_xact); + max_locks_per_xact, checkPoint.max_locks_per_xact); if (!checkPoint.XLogStandbyInfoMode) ereport(ERROR, - (errmsg("recovery connections cannot start because the recovery_connections " - "parameter is disabled on the WAL source server"))); + (errmsg("recovery connections cannot start because the recovery_connections " + "parameter is disabled on the WAL source server"))); } /* @@ -5464,12 +5469,12 @@ StartupXLOG(void) ValidateXLOGDirectoryStructure(); /* - * Clear out any old relcache cache files. This is *necessary* if we - * do any WAL replay, since that would probably result in the cache files - * being out of sync with database reality. In theory we could leave - * them in place if the database had been cleanly shut down, but it - * seems safest to just remove them always and let them be rebuilt - * during the first backend startup. + * Clear out any old relcache cache files. This is *necessary* if we do + * any WAL replay, since that would probably result in the cache files + * being out of sync with database reality. In theory we could leave them + * in place if the database had been cleanly shut down, but it seems + * safest to just remove them always and let them be rebuilt during the + * first backend startup. */ RelationCacheInitFileRemove(); @@ -5648,8 +5653,8 @@ StartupXLOG(void) { if (recoveryTargetExact) ereport(LOG, - (errmsg("starting point-in-time recovery to XID %u", - recoveryTargetXid))); + (errmsg("starting point-in-time recovery to XID %u", + recoveryTargetXid))); else ereport(LOG, (errmsg("starting point-in-time recovery to %s", @@ -5676,6 +5681,7 @@ StartupXLOG(void) if (XLByteLT(ControlFile->minRecoveryPoint, checkPoint.redo)) ControlFile->minRecoveryPoint = checkPoint.redo; } + /* * set backupStartupPoint if we're starting archive recovery from a * base backup @@ -5714,14 +5720,14 @@ StartupXLOG(void) /* * Initialize recovery connections, if enabled. We won't let backends - * in yet, not until we've reached the min recovery point specified - * in control file and we've established a recovery snapshot from a + * in yet, not until we've reached the min recovery point specified in + * control file and we've established a recovery snapshot from a * running-xacts WAL record. */ if (InArchiveRecovery && XLogRequestRecoveryConnections) { TransactionId *xids; - int nxids; + int nxids; CheckRequiredParameterValues(checkPoint); @@ -5814,7 +5820,7 @@ StartupXLOG(void) { #ifdef WAL_DEBUG if (XLOG_DEBUG || - (rmid == RM_XACT_ID && trace_recovery_messages <= DEBUG2) || + (rmid == RM_XACT_ID && trace_recovery_messages <= DEBUG2) || (rmid != RM_XACT_ID && trace_recovery_messages <= DEBUG3)) { StringInfoData buf; @@ -5845,14 +5851,14 @@ StartupXLOG(void) { reachedMinRecoveryPoint = true; ereport(LOG, - (errmsg("consistent recovery state reached at %X/%X", - EndRecPtr.xlogid, EndRecPtr.xrecoff))); + (errmsg("consistent recovery state reached at %X/%X", + EndRecPtr.xlogid, EndRecPtr.xrecoff))); } /* * Have we got a valid starting snapshot that will allow - * queries to be run? If so, we can tell postmaster that - * the database is consistent now, enabling connections. + * queries to be run? If so, we can tell postmaster that the + * database is consistent now, enabling connections. */ if (standbyState == STANDBY_SNAPSHOT_READY && !backendsAllowed && @@ -5950,9 +5956,8 @@ StartupXLOG(void) /* * We are now done reading the xlog from stream. Turn off streaming - * recovery to force fetching the files (which would be required - * at end of recovery, e.g., timeline history file) from archive or - * pg_xlog. + * recovery to force fetching the files (which would be required at end of + * recovery, e.g., timeline history file) from archive or pg_xlog. */ StandbyMode = false; @@ -6155,8 +6160,8 @@ StartupXLOG(void) TransactionIdRetreat(ShmemVariableCache->latestCompletedXid); /* - * Start up the commit log and related stuff, too. In hot standby mode - * we did this already before WAL replay. + * Start up the commit log and related stuff, too. In hot standby mode we + * did this already before WAL replay. */ if (standbyState == STANDBY_DISABLED) { @@ -6194,7 +6199,7 @@ StartupXLOG(void) } /* - * All done. Allow backends to write WAL. (Although the bool flag is + * All done. Allow backends to write WAL. (Although the bool flag is * probably atomic in itself, we use the info_lck here to ensure that * there are no race conditions concerning visibility of other recent * updates to shared memory.) @@ -6222,9 +6227,9 @@ bool RecoveryInProgress(void) { /* - * We check shared state each time only until we leave recovery mode. - * We can't re-enter recovery, so there's no need to keep checking after - * the shared variable has once been seen false. + * We check shared state each time only until we leave recovery mode. We + * can't re-enter recovery, so there's no need to keep checking after the + * shared variable has once been seen false. */ if (!LocalRecoveryInProgress) return false; @@ -6241,7 +6246,7 @@ RecoveryInProgress(void) /* * Initialize TimeLineID and RedoRecPtr when we discover that recovery * is finished. InitPostgres() relies upon this behaviour to ensure - * that InitXLOGAccess() is called at backend startup. (If you change + * that InitXLOGAccess() is called at backend startup. (If you change * this, see also LocalSetXLogInsertAllowed.) */ if (!LocalRecoveryInProgress) @@ -6262,9 +6267,9 @@ bool XLogInsertAllowed(void) { /* - * If value is "unconditionally true" or "unconditionally false", - * just return it. This provides the normal fast path once recovery - * is known done. + * If value is "unconditionally true" or "unconditionally false", just + * return it. This provides the normal fast path once recovery is known + * done. */ if (LocalXLogInsertAllowed >= 0) return (bool) LocalXLogInsertAllowed; @@ -6276,8 +6281,8 @@ XLogInsertAllowed(void) return false; /* - * On exit from recovery, reset to "unconditionally true", since there - * is no need to keep checking. + * On exit from recovery, reset to "unconditionally true", since there is + * no need to keep checking. */ LocalXLogInsertAllowed = 1; return true; @@ -6938,9 +6943,9 @@ CreateCheckPoint(int flags) CheckPointGuts(checkPoint.redo, flags); /* - * Take a snapshot of running transactions and write this to WAL. - * This allows us to reconstruct the state of running transactions - * during archive recovery, if required. Skip, if this info disabled. + * Take a snapshot of running transactions and write this to WAL. This + * allows us to reconstruct the state of running transactions during + * archive recovery, if required. Skip, if this info disabled. * * If we are shutting down, or Startup process is completing crash * recovery we don't need to write running xact data. @@ -6948,7 +6953,7 @@ CreateCheckPoint(int flags) * Update checkPoint.nextXid since we have a later value */ if (!shutdown && XLogStandbyInfoActive()) - LogStandbySnapshot(&checkPoint.oldestActiveXid, &checkPoint.nextXid); + LogStandbySnapshot(&checkPoint.oldestActiveXid, &checkPoint.nextXid); else checkPoint.oldestActiveXid = InvalidTransactionId; @@ -6970,18 +6975,18 @@ CreateCheckPoint(int flags) XLogFlush(recptr); /* - * We mustn't write any new WAL after a shutdown checkpoint, or it will - * be overwritten at next startup. No-one should even try, this just - * allows sanity-checking. In the case of an end-of-recovery checkpoint, - * we want to just temporarily disable writing until the system has exited + * We mustn't write any new WAL after a shutdown checkpoint, or it will be + * overwritten at next startup. No-one should even try, this just allows + * sanity-checking. In the case of an end-of-recovery checkpoint, we want + * to just temporarily disable writing until the system has exited * recovery. */ if (shutdown) { if (flags & CHECKPOINT_END_OF_RECOVERY) - LocalXLogInsertAllowed = -1; /* return to "check" state */ + LocalXLogInsertAllowed = -1; /* return to "check" state */ else - LocalXLogInsertAllowed = 0; /* never again write WAL */ + LocalXLogInsertAllowed = 0; /* never again write WAL */ } /* @@ -7036,18 +7041,17 @@ CreateCheckPoint(int flags) smgrpostckpt(); /* - * If there's connected standby servers doing XLOG streaming, don't - * delete XLOG files that have not been streamed to all of them yet. - * This does nothing to prevent them from being deleted when the - * standby is disconnected (e.g because of network problems), but at - * least it avoids an open replication connection from failing because - * of that. + * If there's connected standby servers doing XLOG streaming, don't delete + * XLOG files that have not been streamed to all of them yet. This does + * nothing to prevent them from being deleted when the standby is + * disconnected (e.g because of network problems), but at least it avoids + * an open replication connection from failing because of that. */ if ((_logId || _logSeg) && MaxWalSenders > 0) { - XLogRecPtr oldest; - uint32 log; - uint32 seg; + XLogRecPtr oldest; + uint32 log; + uint32 seg; oldest = GetOldestWALSendPointer(); if (oldest.xlogid != 0 || oldest.xrecoff != 0) @@ -7055,15 +7059,15 @@ CreateCheckPoint(int flags) XLByteToSeg(oldest, log, seg); if (log < _logId || (log == _logId && seg < _logSeg)) { - _logId = log; - _logSeg = seg; + _logId = log; + _logSeg = seg; } } } /* - * Delete old log files (those no longer needed even for - * previous checkpoint or the standbys in XLOG streaming). + * Delete old log files (those no longer needed even for previous + * checkpoint or the standbys in XLOG streaming). */ if (_logId || _logSeg) { @@ -7262,8 +7266,8 @@ CreateRestartPoint(int flags) /* * Update pg_control, using current time. Check that it still shows * IN_ARCHIVE_RECOVERY state and an older checkpoint, else do nothing; - * this is a quick hack to make sure nothing really bad happens if - * somehow we get here after the end-of-recovery checkpoint. + * this is a quick hack to make sure nothing really bad happens if somehow + * we get here after the end-of-recovery checkpoint. */ LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY && @@ -7312,9 +7316,9 @@ CreateRestartPoint(int flags) LogCheckpointEnd(true); ereport((log_checkpoints ? LOG : DEBUG2), - (errmsg("recovery restart point at %X/%X with latest known log time %s", - lastCheckPoint.redo.xlogid, lastCheckPoint.redo.xrecoff, - timestamptz_to_str(GetLatestXLogTime())))); + (errmsg("recovery restart point at %X/%X with latest known log time %s", + lastCheckPoint.redo.xlogid, lastCheckPoint.redo.xrecoff, + timestamptz_to_str(GetLatestXLogTime())))); LWLockRelease(CheckpointLock); return true; @@ -7522,6 +7526,7 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record) else if (info == XLOG_BACKUP_END) { XLogRecPtr startpoint; + memcpy(&startpoint, XLogRecGetData(record), sizeof(startpoint)); if (XLByteEQ(ControlFile->backupStartPoint, startpoint)) @@ -7550,12 +7555,12 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record) if (InArchiveRecovery) { /* - * Note: We don't print the reason string from the record, - * because that gets added as a line using xlog_desc() + * Note: We don't print the reason string from the record, because + * that gets added as a line using xlog_desc() */ ereport(WARNING, - (errmsg("unlogged operation performed, data may be missing"), - errhint("This can happen if you temporarily disable archive_mode without taking a new base backup."))); + (errmsg("unlogged operation performed, data may be missing"), + errhint("This can happen if you temporarily disable archive_mode without taking a new base backup."))); } } } @@ -7601,7 +7606,7 @@ xlog_desc(StringInfo buf, uint8 xl_info, char *rec) } else if (info == XLOG_BACKUP_END) { - XLogRecPtr startpoint; + XLogRecPtr startpoint; memcpy(&startpoint, rec, sizeof(XLogRecPtr)); appendStringInfo(buf, "backup end: %X/%X", @@ -7609,7 +7614,7 @@ xlog_desc(StringInfo buf, uint8 xl_info, char *rec) } else if (info == XLOG_UNLOGGED) { - char *reason = rec; + char *reason = rec; appendStringInfo(buf, "unlogged operation: %s", reason); } @@ -7649,7 +7654,7 @@ xlog_outrec(StringInfo buf, XLogRecord *record) static int get_sync_bit(int method) { - int o_direct_flag = 0; + int o_direct_flag = 0; /* If fsync is disabled, never open in sync mode */ if (!enableFsync) @@ -7658,11 +7663,11 @@ get_sync_bit(int method) /* * Optimize writes by bypassing kernel cache with O_DIRECT when using * O_SYNC, O_DSYNC or O_FSYNC. But only if archiving and streaming are - * disabled, otherwise the archive command or walsender process will - * read the WAL soon after writing it, which is guaranteed to cause a - * physical read if we bypassed the kernel cache. We also skip the - * posix_fadvise(POSIX_FADV_DONTNEED) call in XLogFileClose() for the - * same reason. + * disabled, otherwise the archive command or walsender process will read + * the WAL soon after writing it, which is guaranteed to cause a physical + * read if we bypassed the kernel cache. We also skip the + * posix_fadvise(POSIX_FADV_DONTNEED) call in XLogFileClose() for the same + * reason. * * Never use O_DIRECT in walreceiver process for similar reasons; the WAL * written by walreceiver is normally read by the startup process soon @@ -7985,7 +7990,7 @@ pg_stop_backup(PG_FUNCTION_ARGS) { XLogRecPtr startpoint; XLogRecPtr stoppoint; - XLogRecData rdata; + XLogRecData rdata; pg_time_t stamp_time; char strfbuf[128]; char histfilepath[MAXPGPATH]; @@ -8132,8 +8137,8 @@ pg_stop_backup(PG_FUNCTION_ARGS) * * We wait forever, since archive_command is supposed to work and we * assume the admin wanted his backup to work completely. If you don't - * wish to wait, you can set statement_timeout. Also, some notices - * are issued to clue in anyone who might be doing this interactively. + * wish to wait, you can set statement_timeout. Also, some notices are + * issued to clue in anyone who might be doing this interactively. */ XLByteToPrevSeg(stoppoint, _logId, _logSeg); XLogFileName(lastxlogfilename, ThisTimeLineID, _logId, _logSeg); @@ -8161,9 +8166,9 @@ pg_stop_backup(PG_FUNCTION_ARGS) ereport(WARNING, (errmsg("pg_stop_backup still waiting for all required WAL segments to be archived (%d seconds elapsed)", waits), - errhint("Check that your archive_command is executing properly. " - "pg_stop_backup can be cancelled safely, " - "but the database backup will not be usable without all the WAL segments."))); + errhint("Check that your archive_command is executing properly. " + "pg_stop_backup can be cancelled safely, " + "but the database backup will not be usable without all the WAL segments."))); } } @@ -8621,6 +8626,7 @@ HandleStartupProcInterrupts(void) got_SIGHUP = false; ProcessConfigFile(PGC_SIGHUP); } + /* * Check if we were requested to exit without finishing recovery. */ @@ -8653,10 +8659,11 @@ StartupProcessMain(void) */ pqsignal(SIGHUP, StartupProcSigHupHandler); /* reload config file */ pqsignal(SIGINT, SIG_IGN); /* ignore query cancel */ - pqsignal(SIGTERM, StartupProcShutdownHandler); /* request shutdown */ - pqsignal(SIGQUIT, startupproc_quickdie); /* hard crash time */ + pqsignal(SIGTERM, StartupProcShutdownHandler); /* request shutdown */ + pqsignal(SIGQUIT, startupproc_quickdie); /* hard crash time */ if (XLogRequestRecoveryConnections) - pqsignal(SIGALRM, handle_standby_sig_alarm); /* ignored unless InHotStandby */ + pqsignal(SIGALRM, handle_standby_sig_alarm); /* ignored unless + * InHotStandby */ else pqsignal(SIGALRM, SIG_IGN); pqsignal(SIGPIPE, SIG_IGN); @@ -8731,20 +8738,20 @@ XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt, { if (StandbyMode) { - bool last_restore_failed = false; + bool last_restore_failed = false; /* * In standby mode, wait for the requested record to become - * available, either via restore_command succeeding to restore - * the segment, or via walreceiver having streamed the record. + * available, either via restore_command succeeding to restore the + * segment, or via walreceiver having streamed the record. */ for (;;) { if (WalRcvInProgress()) { /* - * While walreceiver is active, wait for new WAL to - * arrive from primary. + * While walreceiver is active, wait for new WAL to arrive + * from primary. */ receivedUpto = GetWalRcvWriteRecPtr(); if (XLByteLT(*RecPtr, receivedUpto)) @@ -8798,10 +8805,10 @@ XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt, /* * If we succeeded restoring some segments from archive - * since the last connection attempt (or we haven't - * tried streaming yet, retry immediately. But if we - * haven't, assume the problem is persistent, so be - * less aggressive. + * since the last connection attempt (or we haven't tried + * streaming yet, retry immediately. But if we haven't, + * assume the problem is persistent, so be less + * aggressive. */ if (last_restore_failed) { @@ -8813,7 +8820,7 @@ XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt, */ if (CheckForStandbyTrigger()) goto next_record_is_invalid; - pg_usleep(5000000L); /* 5 seconds */ + pg_usleep(5000000L); /* 5 seconds */ } last_restore_failed = true; @@ -8832,8 +8839,8 @@ XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt, } /* - * This possibly-long loop needs to handle interrupts of startup - * process. + * This possibly-long loop needs to handle interrupts of + * startup process. */ HandleStartupProcInterrupts(); } @@ -8857,16 +8864,16 @@ XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt, } /* - * At this point, we have the right segment open and we know the - * requested record is in it. + * At this point, we have the right segment open and we know the requested + * record is in it. */ Assert(readFile != -1); /* - * If the current segment is being streamed from master, calculate - * how much of the current page we have received already. We know the - * requested record has been received, but this is for the benefit - * of future calls, to allow quick exit at the top of this function. + * If the current segment is being streamed from master, calculate how + * much of the current page we have received already. We know the + * requested record has been received, but this is for the benefit of + * future calls, to allow quick exit at the top of this function. */ if (readStreamed) { @@ -8909,16 +8916,16 @@ XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt, { ereport(emode, (errcode_for_file_access(), - errmsg("could not seek in log file %u, segment %u to offset %u: %m", - readId, readSeg, readOff))); + errmsg("could not seek in log file %u, segment %u to offset %u: %m", + readId, readSeg, readOff))); goto next_record_is_invalid; } if (read(readFile, readBuf, XLOG_BLCKSZ) != XLOG_BLCKSZ) { ereport(emode, (errcode_for_file_access(), - errmsg("could not read from log file %u, segment %u, offset %u: %m", - readId, readSeg, readOff))); + errmsg("could not read from log file %u, segment %u, offset %u: %m", + readId, readSeg, readOff))); goto next_record_is_invalid; } if (!ValidXLOGHeader((XLogPageHeader) readBuf, emode)) |