aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-09-26 22:58:34 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-09-26 22:58:34 +0000
commitb2ab1e6bc9a61a2e5add59da298ec755ba75ab5c (patch)
treebb3be2527c94154e02a290655b9584d00a940879
parentc87469e64a9b893b72254a1850c366fb04777430 (diff)
downloadpostgresql-b2ab1e6bc9a61a2e5add59da298ec755ba75ab5c.tar.gz
postgresql-b2ab1e6bc9a61a2e5add59da298ec755ba75ab5c.zip
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.
-rw-r--r--src/backend/access/transam/clog.c6
-rw-r--r--src/backend/access/transam/xlog.c25
-rw-r--r--src/backend/bootstrap/bootstrap.c6
-rw-r--r--src/backend/tcop/utility.c10
-rw-r--r--src/include/access/xlog.h4
5 files changed, 26 insertions, 25 deletions
diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c
index 4b935492ea5..b72fb5d651e 100644
--- a/src/backend/access/transam/clog.c
+++ b/src/backend/access/transam/clog.c
@@ -13,7 +13,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/clog.c,v 1.10 2002/09/02 02:47:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.11 2002/09/26 22:58:33 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -809,8 +809,8 @@ TruncateCLOG(TransactionId oldestXact)
if (!ScanCLOGDirectory(cutoffPage, false))
return; /* nothing to remove */
- /* Perform a CHECKPOINT */
- CreateCheckPoint(false);
+ /* Perform a forced CHECKPOINT */
+ CreateCheckPoint(false, true);
/*
* Scan CLOG shared memory and remove any pages preceding the cutoff
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0ff60292e68..1944e557708 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -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;
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 4df563b4285..a2b26bcdb00 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.143 2002/09/25 20:31:40 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.144 2002/09/26 22:58:33 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -390,7 +390,7 @@ BootstrapMain(int argc, char *argv[])
case BS_XLOG_CHECKPOINT:
CreateDummyCaches();
- CreateCheckPoint(false);
+ CreateCheckPoint(false, false);
SetSavedRedoRecPtr(); /* pass redo ptr back to
* postmaster */
proc_exit(0); /* done */
@@ -445,7 +445,7 @@ BootstrapMain(int argc, char *argv[])
Int_yyparse();
SetProcessingMode(NormalProcessing);
- CreateCheckPoint(true);
+ CreateCheckPoint(true, true);
SetProcessingMode(BootstrapProcessing);
/* clean up processing */
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 92d876b265b..c6bd3050825 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.177 2002/09/04 20:31:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.178 2002/09/26 22:58:33 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -831,11 +831,9 @@ ProcessUtility(Node *parsetree,
break;
case T_CheckPointStmt:
- {
- if (!superuser())
- elog(ERROR, "permission denied");
- CreateCheckPoint(false);
- }
+ if (!superuser())
+ elog(ERROR, "permission denied");
+ CreateCheckPoint(false, false);
break;
case T_ReindexStmt:
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index c8c49936803..f5c3e59cbce 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: xlog.h,v 1.38 2002/09/26 22:46:29 tgl Exp $
+ * $Id: xlog.h,v 1.39 2002/09/26 22:58:34 tgl Exp $
*/
#ifndef XLOG_H
#define XLOG_H
@@ -204,7 +204,7 @@ extern void XLOGPathInit(void);
extern void BootStrapXLOG(void);
extern void StartupXLOG(void);
extern void ShutdownXLOG(void);
-extern void CreateCheckPoint(bool shutdown);
+extern void CreateCheckPoint(bool shutdown, bool force);
extern void SetThisStartUpID(void);
extern void XLogPutNextOid(Oid nextOid);
extern void SetSavedRedoRecPtr(void);