@ -7646,10 +7646,6 @@ CreateCheckPoint(int flags)
uint32 freespace ;
uint32 _logId ;
uint32 _logSeg ;
uint32 redo_logId ;
uint32 redo_logSeg ;
uint32 insert_logId ;
uint32 insert_logSeg ;
TransactionId * inCommitXids ;
int nInCommit ;
@ -7726,8 +7722,8 @@ CreateCheckPoint(int flags)
LWLockAcquire ( WALInsertLock , LW_EXCLUSIVE ) ;
/*
* If this isn ' t a shutdown or forced checkpoint , and we have not sw itch ed
* to the next WAL file since the start of the last checkpoint , skip the
* If this isn ' t a shutdown or forced checkpoint , and we have not inser ted
* any XLOG records since the start of the last checkpoint , skip the
* checkpoint . The idea here is to avoid inserting duplicate checkpoints
* when the system is idle . That wastes log space , and more importantly it
* exposes us to possible loss of both current and previous checkpoint
@ -7735,11 +7731,10 @@ CreateCheckPoint(int flags)
* ( Perhaps it ' d make even more sense to checkpoint only when the previous
* checkpoint record is in a different xlog page ? )
*
* While holding the WALInsertLock we find the current WAL insertion point
* and compare that with the starting point of the last checkpoint , which
* is the redo pointer . We use the redo pointer because the start and end
* points of a checkpoint can be hundreds of files apart on large systems
* when checkpoint writes are spread out over time .
* We have to make two tests to determine that nothing has happened since
* the start of the last checkpoint : current insertion point must match
* the end of the last checkpoint record , and its redo pointer must point
* to itself .
*/
if ( ( flags & ( CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY |
CHECKPOINT_FORCE ) ) = = 0 )
@ -7747,10 +7742,13 @@ CreateCheckPoint(int flags)
XLogRecPtr curInsert ;
INSERT_RECPTR ( curInsert , Insert , Insert - > curridx ) ;
XLByteToSeg ( curInsert , insert_logId , insert_logSeg ) ;
XLByteToSeg ( ControlFile - > checkPointCopy . redo , redo_logId , redo_logSeg ) ;
if ( insert_logId = = redo_logId & &
insert_logSeg = = redo_logSeg )
if ( curInsert . xlogid = = ControlFile - > checkPoint . xlogid & &
curInsert . xrecoff = = ControlFile - > checkPoint . xrecoff +
MAXALIGN ( SizeOfXLogRecord + sizeof ( CheckPoint ) ) & &
ControlFile - > checkPoint . xlogid = =
ControlFile - > checkPointCopy . redo . xlogid & &
ControlFile - > checkPoint . xrecoff = =
ControlFile - > checkPointCopy . redo . xrecoff )
{
LWLockRelease ( WALInsertLock ) ;
LWLockRelease ( CheckpointLock ) ;