1
0
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:
Tom Lane
2002-09-26 22:58:34 +00:00
parent c87469e64a
commit b2ab1e6bc9
5 changed files with 26 additions and 25 deletions

View File

@ -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;