aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/bufmgr.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-08-02 20:52:08 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-08-02 20:52:08 +0000
commit6eac4e69cf348fcce13e8d8d63196876bf80d730 (patch)
tree00efe9362a0adba97226011bb2194a13961465b9 /src/backend/storage/buffer/bufmgr.c
parent688784f671b39643c43d3a006af19363c1a5c4c6 (diff)
downloadpostgresql-6eac4e69cf348fcce13e8d8d63196876bf80d730.tar.gz
postgresql-6eac4e69cf348fcce13e8d8d63196876bf80d730.zip
Tweak BgBufferSync() so that a persistent write error on a dirty buffer
doesn't block the bgwriter from making progress writing out other buffers. This was a hard problem in the context of the ARC/2Q design, but it's trivial in the context of clock sweep ... just advance the sweep counter before we try to write not after.
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r--src/backend/storage/buffer/bufmgr.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 1fe681e1aba..4fb16eb6145 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.189 2005/05/19 21:35:46 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.190 2005/08/02 20:52:08 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -903,6 +903,11 @@ BgBufferSync(void)
/*
* This loop runs over all buffers, including pinned ones. The
* starting point advances through the buffer pool on successive calls.
+ *
+ * Note that we advance the static counter *before* trying to write.
+ * This ensures that, if we have a persistent write failure on a dirty
+ * buffer, we'll still be able to make progress writing other buffers.
+ * (The bgwriter will catch the error and just call us again later.)
*/
if (bgwriter_all_percent > 0.0 && bgwriter_all_maxpages > 0)
{
@@ -911,12 +916,13 @@ BgBufferSync(void)
while (num_to_scan-- > 0)
{
- if (SyncOneBuffer(buf_id1, false))
- num_written++;
if (++buf_id1 >= NBuffers)
buf_id1 = 0;
- if (num_written >= bgwriter_all_maxpages)
- break;
+ if (SyncOneBuffer(buf_id1, false))
+ {
+ if (++num_written >= bgwriter_all_maxpages)
+ break;
+ }
}
}
@@ -934,11 +940,12 @@ BgBufferSync(void)
while (num_to_scan-- > 0)
{
if (SyncOneBuffer(buf_id2, true))
- num_written++;
+ {
+ if (++num_written >= bgwriter_lru_maxpages)
+ break;
+ }
if (++buf_id2 >= NBuffers)
buf_id2 = 0;
- if (num_written >= bgwriter_lru_maxpages)
- break;
}
}
}