aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>2004-01-24 20:00:46 +0000
committerJan Wieck <JanWieck@Yahoo.com>2004-01-24 20:00:46 +0000
commitd77b63b17cb34c69b4ace1f4479566b9f9160e2b (patch)
tree0cb83cec44628e1b8db0bca809a77724af581a91 /src
parent610d33c1949005e9658863441f31083f9f3ceb9b (diff)
downloadpostgresql-d77b63b17cb34c69b4ace1f4479566b9f9160e2b.tar.gz
postgresql-d77b63b17cb34c69b4ace1f4479566b9f9160e2b.zip
Added GUC variable bgwriter_flush_method controlling the action
done by the background writer between writing dirty blocks and napping. none (default) no action sync bgwriter calls smgrsync() causing a sync(2) A global sync() is only good on dedicated database servers, so more flush methods should be added in the future. Jan
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/buffer/bufmgr.c51
-rw-r--r--src/backend/utils/misc/guc.c13
-rw-r--r--src/backend/utils/misc/postgresql.conf.sample3
-rw-r--r--src/include/storage/bufmgr.h6
4 files changed, 68 insertions, 5 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 64c5800dc49..5eee0c5bbc7 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.152 2004/01/09 21:08:49 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.153 2004/01/24 20:00:45 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,6 +55,7 @@
#include "storage/proc.h"
#include "storage/smgr.h"
#include "utils/relcache.h"
+#include "utils/guc.h"
#include "pgstat.h"
@@ -65,9 +66,23 @@
/* GUC variable */
bool zero_damaged_pages = false;
+#define BGWRITER_FLUSH_NONE 0
+#define BGWRITER_FLUSH_NONE_STR "none"
+#define BGWRITER_FLUSH_SYNC 1
+#define BGWRITER_FLUSH_SYNC_STR "sync"
+
+#define BGWRITER_FLUSH_DEFAULT BGWRITER_FLUSH_NONE
+#define BGWRITER_FLUSH_DEFAULT_STR BGWRITER_FLUSH_NONE_STR
+
int BgWriterDelay = 200;
int BgWriterPercent = 1;
int BgWriterMaxpages = 100;
+int BgWriterFlushMethod = BGWRITER_FLUSH_NONE;
+char *BgWriterFlushMethod_str = NULL;
+const char BgWriterFlushMethod_default[] = BGWRITER_FLUSH_DEFAULT_STR;
+
+const char *BgWriterAssignSyncMethod(const char *method,
+ bool doit, GucSource source);
static void WaitIO(BufferDesc *buf);
static void StartBufferIO(BufferDesc *buf, bool forInput);
@@ -1027,6 +1042,19 @@ BufferBackgroundWriter(void)
return;
/*
+ * Perform the configured buffer flush method
+ */
+ switch (BgWriterFlushMethod)
+ {
+ case BGWRITER_FLUSH_NONE:
+ break;
+
+ case BGWRITER_FLUSH_SYNC:
+ smgrsync();
+ break;
+ }
+
+ /*
* Nap for the configured time or sleep for 10 seconds if
* there was nothing to do at all.
*/
@@ -1037,6 +1065,27 @@ BufferBackgroundWriter(void)
}
}
+const char *
+BgWriterAssignSyncMethod(const char *method, bool doit, GucSource source)
+{
+ int new_flush_method;
+
+ if (strcasecmp(method, BGWRITER_FLUSH_NONE_STR) == 0)
+ new_flush_method = BGWRITER_FLUSH_NONE;
+ else
+ if (strcasecmp(method, BGWRITER_FLUSH_SYNC_STR) == 0)
+ new_flush_method = BGWRITER_FLUSH_SYNC;
+ else
+ return NULL;
+
+ if (!doit)
+ return method;
+
+ BgWriterFlushMethod = new_flush_method;
+ return method;
+}
+
+
/*
* Do whatever is needed to prepare for commit at the bufmgr and smgr levels
*/
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 04a7e7287b1..7b3bde2d0c2 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.179 2004/01/23 23:54:21 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.180 2004/01/24 20:00:45 wieck Exp $
*
*--------------------------------------------------------------------
*/
@@ -95,6 +95,8 @@ static const char *assign_msglvl(int *var, const char *newval,
static const char *assign_log_error_verbosity(const char *newval, bool doit,
GucSource source);
static bool assign_phony_autocommit(bool newval, bool doit, GucSource source);
+extern const char *BgWriterAssignSyncMethod(const char *method,
+ bool doit, GucSource source);
/*
@@ -1689,6 +1691,15 @@ static struct config_string ConfigureNamesString[] =
XLOG_sync_method_default, assign_xlog_sync_method, NULL
},
+ {
+ {"bgwriter_flush_method", PGC_SIGHUP, RESOURCES,
+ gettext_noop("Selects the method used by the bgwriter for forcing writes out to disk."),
+ NULL
+ },
+ &BgWriterFlushMethod_str,
+ BgWriterFlushMethod_default, BgWriterAssignSyncMethod, NULL
+ },
+
/* End-of-list marker */
{
{NULL, 0, 0, NULL, NULL}, NULL, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 30e7ebe1670..530e8c7952b 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -61,9 +61,12 @@
#debug_shared_buffers = 0 # 0-600 seconds
# - Background writer -
+#debug_shared_buffers = 0 # 0-600 seconds interval (0 = off)
#bgwriter_delay = 200 # 10-5000 milliseconds
#bgwriter_percent = 1 # 0-100% of dirty buffers
#bgwriter_maxpages = 100 # 1-1000 buffers max at once
+#bgwriter_flush_method = none # how the bgwriter flushes kernel buffers
+ # one of: none or sync
# - Free Space Map -
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index 7f955ceef3a..adb45b307f6 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.73 2003/12/14 00:34:47 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.74 2004/01/24 20:00:46 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -31,6 +31,8 @@ extern bool zero_damaged_pages;
extern int BgWriterDelay;
extern int BgWriterPercent;
extern int BgWriterMaxpages;
+extern char *BgWriterFlushMethod_str;
+extern const char BgWriterFlushMethod_default[];
/* in buf_init.c */
@@ -180,8 +182,6 @@ extern void AbortBufferIO(void);
extern void BufmgrCommit(void);
extern int BufferSync(int percent, int maxpages);
extern void BufferBackgroundWriter(void);
-extern const char *BgWriterAssignSyncMethod(const char *method,
- bool doid, bool interactive);
extern void InitLocalBuffer(void);