aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/clog.c4
-rw-r--r--src/backend/access/transam/xlog.c6
-rw-r--r--src/backend/commands/dbcommands.c6
-rw-r--r--src/backend/postmaster/bgwriter.c50
-rw-r--r--src/backend/tcop/utility.c4
-rw-r--r--src/include/postmaster/bgwriter.h4
6 files changed, 45 insertions, 29 deletions
diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c
index 2da835dbbe5..3768570ad3d 100644
--- a/src/backend/access/transam/clog.c
+++ b/src/backend/access/transam/clog.c
@@ -24,7 +24,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.30 2005/06/06 20:22:57 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.31 2005/06/30 00:00:50 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -336,7 +336,7 @@ TruncateCLOG(TransactionId oldestXact)
return; /* nothing to remove */
/* Perform a CHECKPOINT */
- RequestCheckpoint(true);
+ RequestCheckpoint(true, false);
/* Now we can remove the old CLOG segment(s) */
SimpleLruTruncate(ClogCtl, cutoffPage);
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 93f8d75e6cc..4c2f6a69a70 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.204 2005/06/29 22:51:53 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.205 2005/06/30 00:00:50 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1337,7 +1337,7 @@ XLogWrite(XLogwrtRqst WriteRqst)
if (XLOG_DEBUG)
elog(LOG, "time for a checkpoint, signaling bgwriter");
#endif
- RequestCheckpoint(false);
+ RequestCheckpoint(false, true);
}
}
}
@@ -5496,7 +5496,7 @@ pg_start_backup(PG_FUNCTION_ARGS)
* will have different checkpoint positions and hence different
* history file names, even if nothing happened in between.
*/
- RequestCheckpoint(true);
+ RequestCheckpoint(true, false);
/*
* Now we need to fetch the checkpoint record location, and also its
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index 96f964fb95f..ba5ce9200b4 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.163 2005/06/29 20:34:13 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.164 2005/06/30 00:00:50 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -542,7 +542,7 @@ createdb(const CreatedbStmt *stmt)
* Perhaps if we ever implement CREATE DATABASE in a less cheesy
* way, we can avoid this.
*/
- RequestCheckpoint(true);
+ RequestCheckpoint(true, false);
/*
* Set flag to update flat database file at commit.
@@ -668,7 +668,7 @@ dropdb(const char *dbname)
* open files, which would cause rmdir() to fail.
*/
#ifdef WIN32
- RequestCheckpoint(true);
+ RequestCheckpoint(true, false);
#endif
/*
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c
index 0cd694ef529..d826a6190de 100644
--- a/src/backend/postmaster/bgwriter.c
+++ b/src/backend/postmaster/bgwriter.c
@@ -37,7 +37,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/bgwriter.c,v 1.16 2005/05/28 17:21:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/bgwriter.c,v 1.17 2005/06/30 00:00:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -86,8 +86,14 @@
* 6. If ckpt_failed is different from the originally saved value,
* assume request failed; otherwise it was definitely successful.
*
+ * An additional field is ckpt_time_warn; this is also sig_atomic_t for
+ * simplicity, but is only used as a boolean. If a backend is requesting
+ * a checkpoint for which a checkpoints-too-close-together warning is
+ * reasonable, it should set this field TRUE just before sending the signal.
+ *
* The requests array holds fsync requests sent by backends and not yet
- * absorbed by the bgwriter.
+ * absorbed by the bgwriter. Unlike the checkpoint fields, the requests
+ * fields are protected by BgWriterCommLock.
*----------
*/
typedef struct
@@ -105,6 +111,8 @@ typedef struct
sig_atomic_t ckpt_done; /* advances when checkpoint done */
sig_atomic_t ckpt_failed; /* advances when checkpoint fails */
+ sig_atomic_t ckpt_time_warn; /* warn if too soon since last ckpt? */
+
int num_requests; /* current # of requests */
int max_requests; /* allocated array size */
BgWriterRequest requests[1]; /* VARIABLE LENGTH ARRAY */
@@ -319,20 +327,20 @@ BackgroundWriterMain(void)
*/
if (do_checkpoint)
{
- if (CheckPointWarning != 0)
- {
- /*
- * Ideally we should only warn if this checkpoint was
- * requested due to running out of segment files, and not
- * if it was manually requested. However we can't tell
- * the difference with the current signalling mechanism.
- */
- if (elapsed_secs < CheckPointWarning)
- ereport(LOG,
- (errmsg("checkpoints are occurring too frequently (%d seconds apart)",
- elapsed_secs),
- errhint("Consider increasing the configuration parameter \"checkpoint_segments\".")));
- }
+ /*
+ * We will warn if (a) too soon since last checkpoint (whatever
+ * caused it) and (b) somebody has set the ckpt_time_warn flag
+ * since the last checkpoint start. Note in particular that
+ * this implementation will not generate warnings caused by
+ * CheckPointTimeout < CheckPointWarning.
+ */
+ if (BgWriterShmem->ckpt_time_warn &&
+ elapsed_secs < CheckPointWarning)
+ ereport(LOG,
+ (errmsg("checkpoints are occurring too frequently (%d seconds apart)",
+ elapsed_secs),
+ errhint("Consider increasing the configuration parameter \"checkpoint_segments\".")));
+ BgWriterShmem->ckpt_time_warn = false;
/*
* Indicate checkpoint start to any waiting backends.
@@ -497,9 +505,13 @@ BgWriterShmemInit(void)
* If waitforit is true, wait until the checkpoint is completed
* before returning; otherwise, just signal the request and return
* immediately.
+ *
+ * If warnontime is true, and it's "too soon" since the last checkpoint,
+ * the bgwriter will log a warning. This should be true only for checkpoints
+ * caused due to xlog filling, else the warning will be misleading.
*/
void
-RequestCheckpoint(bool waitforit)
+RequestCheckpoint(bool waitforit, bool warnontime)
{
/* use volatile pointer to prevent code rearrangement */
volatile BgWriterShmemStruct *bgs = BgWriterShmem;
@@ -523,6 +535,10 @@ RequestCheckpoint(bool waitforit)
return;
}
+ /* Set warning request flag if appropriate */
+ if (warnontime)
+ bgs->ckpt_time_warn = true;
+
/*
* Send signal to request checkpoint. When waitforit is false, we
* consider failure to send the signal to be nonfatal.
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 40d5e7d7ce6..becd2793384 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.239 2005/06/28 05:09:00 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.240 2005/06/30 00:00:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -989,7 +989,7 @@ ProcessUtility(Node *parsetree,
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
errmsg("must be superuser to do CHECKPOINT")));
- RequestCheckpoint(true);
+ RequestCheckpoint(true, false);
break;
case T_ReindexStmt:
diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h
index dc1260de182..3cdfef1750f 100644
--- a/src/include/postmaster/bgwriter.h
+++ b/src/include/postmaster/bgwriter.h
@@ -5,7 +5,7 @@
*
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/include/postmaster/bgwriter.h,v 1.5 2005/03/04 20:21:06 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/postmaster/bgwriter.h,v 1.6 2005/06/30 00:00:52 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -23,7 +23,7 @@ extern int CheckPointWarning;
extern void BackgroundWriterMain(void);
-extern void RequestCheckpoint(bool waitforit);
+extern void RequestCheckpoint(bool waitforit, bool warnontime);
extern bool ForwardFsyncRequest(RelFileNode rnode, BlockNumber segno);
extern void AbsorbFsyncRequests(void);