@@ -888,8 +888,8 @@ static intemode_for_corrupt_record(int emode, XLogRecPtr RecPtr);
888888static void XLogFileClose (void );
889889static void PreallocXlogFiles (XLogRecPtr endptr );
890890static void RemoveTempXlogFiles (void );
891- static void RemoveOldXlogFiles (XLogSegNo segno ,XLogRecPtr PriorRedoPtr ,XLogRecPtr endptr );
892- static void RemoveXlogFile (const char * segname ,XLogRecPtr PriorRedoPtr ,XLogRecPtr endptr );
891+ static void RemoveOldXlogFiles (XLogSegNo segno ,XLogRecPtr RedoRecPtr ,XLogRecPtr endptr );
892+ static void RemoveXlogFile (const char * segname ,XLogRecPtr RedoRecPtr ,XLogRecPtr endptr );
893893static void UpdateLastRemovedPtr (char * filename );
894894static void ValidateXLOGDirectoryStructure (void );
895895static void CleanupBackupHistory (void );
@@ -2287,7 +2287,7 @@ assign_checkpoint_completion_target(double newval, void *extra)
22872287 * XLOG segments? Returns the highest segment that should be preallocated.
22882288 */
22892289static XLogSegNo
2290- XLOGfileslop (XLogRecPtr PriorRedoPtr )
2290+ XLOGfileslop (XLogRecPtr RedoRecPtr )
22912291{
22922292XLogSegNo minSegNo ;
22932293XLogSegNo maxSegNo ;
@@ -2299,9 +2299,9 @@ XLOGfileslop(XLogRecPtr PriorRedoPtr)
22992299 * correspond to. Always recycle enough segments to meet the minimum, and
23002300 * remove enough segments to stay below the maximum.
23012301 */
2302- minSegNo = PriorRedoPtr /wal_segment_size +
2302+ minSegNo = RedoRecPtr /wal_segment_size +
23032303ConvertToXSegs (min_wal_size_mb ,wal_segment_size )- 1 ;
2304- maxSegNo = PriorRedoPtr /wal_segment_size +
2304+ maxSegNo = RedoRecPtr /wal_segment_size +
23052305ConvertToXSegs (max_wal_size_mb ,wal_segment_size )- 1 ;
23062306
23072307/*
@@ -2316,7 +2316,7 @@ XLOGfileslop(XLogRecPtr PriorRedoPtr)
23162316/* add 10% for good measure. */
23172317distance *=1.10 ;
23182318
2319- recycleSegNo = (XLogSegNo )ceil (((double )PriorRedoPtr + distance ) /
2319+ recycleSegNo = (XLogSegNo )ceil (((double )RedoRecPtr + distance ) /
23202320wal_segment_size );
23212321
23222322if (recycleSegNo < minSegNo )
@@ -3899,12 +3899,12 @@ RemoveTempXlogFiles(void)
38993899/*
39003900 * Recycle or remove all log files older or equal to passed segno.
39013901 *
3902- * endptr is current (or recent) end of xlog, andPriorRedoRecPtr is the
3903- * redo pointer of theprevious checkpoint. These are used to determine
3902+ * endptr is current (or recent) end of xlog, andRedoRecPtr is the
3903+ * redo pointer of thelast checkpoint. These are used to determine
39043904 * whether we want to recycle rather than delete no-longer-wanted log files.
39053905 */
39063906static void
3907- RemoveOldXlogFiles (XLogSegNo segno ,XLogRecPtr PriorRedoPtr ,XLogRecPtr endptr )
3907+ RemoveOldXlogFiles (XLogSegNo segno ,XLogRecPtr RedoRecPtr ,XLogRecPtr endptr )
39083908{
39093909DIR * xldir ;
39103910struct dirent * xlde ;
@@ -3947,7 +3947,7 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr PriorRedoPtr, XLogRecPtr endptr)
39473947/* Update the last removed location in shared memory first */
39483948UpdateLastRemovedPtr (xlde -> d_name );
39493949
3950- RemoveXlogFile (xlde -> d_name ,PriorRedoPtr ,endptr );
3950+ RemoveXlogFile (xlde -> d_name ,RedoRecPtr ,endptr );
39513951}
39523952}
39533953}
@@ -4021,14 +4021,14 @@ RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI)
40214021/*
40224022 * Recycle or remove a log file that's no longer needed.
40234023 *
4024- * endptr is current (or recent) end of xlog, andPriorRedoRecPtr is the
4025- * redo pointer of theprevious checkpoint. These are used to determine
4024+ * endptr is current (or recent) end of xlog, andRedoRecPtr is the
4025+ * redo pointer of thelast checkpoint. These are used to determine
40264026 * whether we want to recycle rather than delete no-longer-wanted log files.
4027- * IfPriorRedoRecPtr is not known, pass invalid, and the function will
4028- *recycle, somewhat arbitrarily, 10 future segments.
4027+ * IfRedoRecPtr is not known, pass invalid, and the function will recycle,
4028+ * somewhat arbitrarily, 10 future segments.
40294029 */
40304030static void
4031- RemoveXlogFile (const char * segname ,XLogRecPtr PriorRedoPtr ,XLogRecPtr endptr )
4031+ RemoveXlogFile (const char * segname ,XLogRecPtr RedoRecPtr ,XLogRecPtr endptr )
40324032{
40334033char path [MAXPGPATH ];
40344034#ifdef WIN32
@@ -4042,10 +4042,10 @@ RemoveXlogFile(const char *segname, XLogRecPtr PriorRedoPtr, XLogRecPtr endptr)
40424042 * Initialize info about where to try to recycle to.
40434043 */
40444044XLByteToSeg (endptr ,endlogSegNo ,wal_segment_size );
4045- if (PriorRedoPtr == InvalidXLogRecPtr )
4045+ if (RedoRecPtr == InvalidXLogRecPtr )
40464046recycleSegNo = endlogSegNo + 10 ;
40474047else
4048- recycleSegNo = XLOGfileslop (PriorRedoPtr );
4048+ recycleSegNo = XLOGfileslop (RedoRecPtr );
40494049
40504050snprintf (path ,MAXPGPATH ,XLOGDIR "/%s" ,segname );
40514051
@@ -8706,6 +8706,7 @@ CreateCheckPoint(int flags)
87068706bool shutdown ;
87078707CheckPoint checkPoint ;
87088708XLogRecPtr recptr ;
8709+ XLogSegNo _logSegNo ;
87098710XLogCtlInsert * Insert = & XLogCtl -> Insert ;
87108711uint32 freespace ;
87118712XLogRecPtr PriorRedoPtr ;
@@ -9073,21 +9074,20 @@ CreateCheckPoint(int flags)
90739074smgrpostckpt ();
90749075
90759076/*
9076- * Delete old log files and recycle them
9077+ * Update the average distance between checkpoints if the prior checkpoint
9078+ * exists.
90779079 */
90789080if (PriorRedoPtr != InvalidXLogRecPtr )
9079- {
9080- XLogSegNo _logSegNo ;
9081-
9082- /* Update the average distance between checkpoints. */
90839081UpdateCheckPointDistanceEstimate (RedoRecPtr - PriorRedoPtr );
90849082
9085- /* Trim from the last checkpoint, not the last - 1 */
9086- XLByteToSeg (RedoRecPtr ,_logSegNo ,wal_segment_size );
9087- KeepLogSeg (recptr ,& _logSegNo );
9088- _logSegNo -- ;
9089- RemoveOldXlogFiles (_logSegNo ,PriorRedoPtr ,recptr );
9090- }
9083+ /*
9084+ * Delete old log files, those no longer needed for last checkpoint to
9085+ * prevent the disk holding the xlog from growing full.
9086+ */
9087+ XLByteToSeg (RedoRecPtr ,_logSegNo ,wal_segment_size );
9088+ KeepLogSeg (recptr ,& _logSegNo );
9089+ _logSegNo -- ;
9090+ RemoveOldXlogFiles (_logSegNo ,RedoRecPtr ,recptr );
90919091
90929092/*
90939093 * Make more log segments if needed. (Do this after recycling old log
@@ -9253,6 +9253,11 @@ CreateRestartPoint(int flags)
92539253XLogRecPtr lastCheckPointEndPtr ;
92549254CheckPoint lastCheckPoint ;
92559255XLogRecPtr PriorRedoPtr ;
9256+ XLogRecPtr receivePtr ;
9257+ XLogRecPtr replayPtr ;
9258+ TimeLineID replayTLI ;
9259+ XLogRecPtr endptr ;
9260+ XLogSegNo _logSegNo ;
92569261TimestampTz xtime ;
92579262
92589263/*
@@ -9395,68 +9400,60 @@ CreateRestartPoint(int flags)
93959400LWLockRelease (ControlFileLock );
93969401
93979402/*
9398- * Delete old log files (those no longer needed even for previous
9399- * checkpoint/restartpoint) to prevent the disk holding the xlog from
9400- * growing full.
9403+ * Update the average distance between checkpoints/restartpoints if the
9404+ * prior checkpoint exists.
94019405 */
94029406if (PriorRedoPtr != InvalidXLogRecPtr )
9403- {
9404- XLogRecPtr receivePtr ;
9405- XLogRecPtr replayPtr ;
9406- TimeLineID replayTLI ;
9407- XLogRecPtr endptr ;
9408- XLogSegNo _logSegNo ;
9409-
9410- /* Update the average distance between checkpoints/restartpoints. */
94119407UpdateCheckPointDistanceEstimate (RedoRecPtr - PriorRedoPtr );
94129408
9413- XLByteToSeg (PriorRedoPtr ,_logSegNo ,wal_segment_size );
9414-
9415- /*
9416- * Get the current end of xlog replayed or received, whichever is
9417- * later.
9418- */
9419- receivePtr = GetWalRcvWriteRecPtr (NULL ,NULL );
9420- replayPtr = GetXLogReplayRecPtr (& replayTLI );
9421- endptr = (receivePtr < replayPtr ) ?replayPtr :receivePtr ;
9409+ /*
9410+ * Delete old log files, those no longer needed for last restartpoint to
9411+ * prevent the disk holding the xlog from growing full.
9412+ */
9413+ XLByteToSeg (RedoRecPtr ,_logSegNo ,wal_segment_size );
94229414
9423- KeepLogSeg (endptr ,& _logSegNo );
9424- _logSegNo -- ;
9415+ /*
9416+ * Retreat _logSegNo using the current end of xlog replayed or received,
9417+ * whichever is later.
9418+ */
9419+ receivePtr = GetWalRcvWriteRecPtr (NULL ,NULL );
9420+ replayPtr = GetXLogReplayRecPtr (& replayTLI );
9421+ endptr = (receivePtr < replayPtr ) ?replayPtr :receivePtr ;
9422+ KeepLogSeg (endptr ,& _logSegNo );
9423+ _logSegNo -- ;
94259424
9426- /*
9427- * Try to recycle segments on a useful timeline. If we've been
9428- *promoted since the beginning of this restartpoint, use the new
9429- *timeline chosen at end of recovery (RecoveryInProgress() sets
9430- *ThisTimeLineID in that case). If we're still in recovery, use the
9431- * timeline we're currently replaying.
9432- *
9433- * There is no guarantee that the WAL segments will be useful on the
9434- * current timeline; if recovery proceeds to a new timeline right
9435- *after this, the pre-allocated WAL segments on this timeline will
9436- *not be used, and will go wasted until recycled on the next
9437- * restartpoint. We'll live with that.
9438- */
9439- if (RecoveryInProgress ())
9440- ThisTimeLineID = replayTLI ;
9425+ /*
9426+ * Try to recycle segments on a useful timeline. If we've been promoted
9427+ * since the beginning of this restartpoint, use the new timeline chosen
9428+ * at end of recovery (RecoveryInProgress() sets ThisTimeLineID in that
9429+ * case). If we're still in recovery, use the timeline we're currently
9430+ * replaying.
9431+ *
9432+ * There is no guarantee that the WAL segments will be useful on the
9433+ * current timeline; if recovery proceeds to a new timeline right after
9434+ * this, the pre-allocated WAL segments on this timeline will not be used,
9435+ * and will go wasted until recycled on the next restartpoint. We'll live
9436+ * with that.
9437+ */
9438+ if (RecoveryInProgress ())
9439+ ThisTimeLineID = replayTLI ;
94419440
9442- RemoveOldXlogFiles (_logSegNo ,PriorRedoPtr ,endptr );
9441+ RemoveOldXlogFiles (_logSegNo ,RedoRecPtr ,endptr );
94439442
9444- /*
9445- * Make more log segments if needed. (Do this after recycling old log
9446- * segments, since that may supply some of the needed files.)
9447- */
9448- PreallocXlogFiles (endptr );
9443+ /*
9444+ * Make more log segments if needed. (Do this after recycling old log
9445+ * segments, since that may supply some of the needed files.)
9446+ */
9447+ PreallocXlogFiles (endptr );
94499448
9450- /*
9451- * ThisTimeLineID is normally not set when we're still in recovery.
9452- * However, recycling/preallocating segments above needed
9453- * ThisTimeLineID to determine which timeline to install the segments
9454- * on. Reset it now, to restore the normal state of affairs for
9455- * debugging purposes.
9456- */
9457- if (RecoveryInProgress ())
9458- ThisTimeLineID = 0 ;
9459- }
9449+ /*
9450+ * ThisTimeLineID is normally not set when we're still in recovery.
9451+ * However, recycling/preallocating segments above needed ThisTimeLineID
9452+ * to determine which timeline to install the segments on. Reset it now,
9453+ * to restore the normal state of affairs for debugging purposes.
9454+ */
9455+ if (RecoveryInProgress ())
9456+ ThisTimeLineID = 0 ;
94609457
94619458/*
94629459 * Truncate pg_subtrans if possible. We can throw away all data before