mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Ensure that before truncating CLOG, we force a checkpoint even if no
recent WAL activity has occurred. Without this, it's possible that a later crash might leave tuples on disk with un-updated commit status bits.
This commit is contained in:
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.106 2002/09/04 20:31:13 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.107 2002/09/26 22:58:33 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -2743,7 +2743,7 @@ StartupXLOG(void)
|
||||
* checkpoint to become prevCheckPoint...
|
||||
*/
|
||||
ControlFile->checkPoint = checkPointLoc;
|
||||
CreateCheckPoint(true);
|
||||
CreateCheckPoint(true, true);
|
||||
XLogCloseRelationCache();
|
||||
}
|
||||
|
||||
@ -2901,7 +2901,7 @@ ShutdownXLOG(void)
|
||||
|
||||
CritSectionCount++;
|
||||
CreateDummyCaches();
|
||||
CreateCheckPoint(true);
|
||||
CreateCheckPoint(true, true);
|
||||
ShutdownCLOG();
|
||||
CritSectionCount--;
|
||||
|
||||
@ -2910,9 +2910,12 @@ ShutdownXLOG(void)
|
||||
|
||||
/*
|
||||
* Perform a checkpoint --- either during shutdown, or on-the-fly
|
||||
*
|
||||
* If force is true, we force a checkpoint regardless of whether any XLOG
|
||||
* activity has occurred since the last one.
|
||||
*/
|
||||
void
|
||||
CreateCheckPoint(bool shutdown)
|
||||
CreateCheckPoint(bool shutdown, bool force)
|
||||
{
|
||||
CheckPoint checkPoint;
|
||||
XLogRecPtr recptr;
|
||||
@ -2955,21 +2958,21 @@ CreateCheckPoint(bool shutdown)
|
||||
LWLockAcquire(WALInsertLock, LW_EXCLUSIVE);
|
||||
|
||||
/*
|
||||
* If this isn't a shutdown, and we have not inserted 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
|
||||
* If this isn't a shutdown or forced checkpoint, and we have not inserted
|
||||
* 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
|
||||
* records if the machine crashes just as we're writing the update.
|
||||
* (Perhaps it'd make even more sense to checkpoint only when the
|
||||
* previous checkpoint record is in a different xlog page?)
|
||||
* (Perhaps it'd make even more sense to checkpoint only when the previous
|
||||
* checkpoint record is in a different xlog page?)
|
||||
*
|
||||
* 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 (!shutdown)
|
||||
if (!shutdown && !force)
|
||||
{
|
||||
XLogRecPtr curInsert;
|
||||
|
||||
|
Reference in New Issue
Block a user