diff options
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 11e83812d0c..41ca4c14495 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.202 2006/01/06 00:04:20 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.203 2006/03/03 00:02:01 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -42,6 +42,7 @@ #include "lib/stringinfo.h" #include "miscadmin.h" +#include "postmaster/bgwriter.h" #include "storage/buf_internals.h" #include "storage/bufmgr.h" #include "storage/bufpage.h" @@ -61,6 +62,9 @@ #define LocalBufHdrGetBlock(bufHdr) \ LocalBufferBlockPointers[-((bufHdr)->buf_id + 2)] +/* interval for calling AbsorbFsyncRequests in BufferSync */ +#define WRITES_PER_ABSORB 1000 + /* GUC variables */ bool zero_damaged_pages = false; @@ -892,6 +896,7 @@ BufferSync(void) { int buf_id; int num_to_scan; + int absorb_counter; /* * Find out where to start the circular scan. @@ -905,9 +910,23 @@ BufferSync(void) * Loop over all buffers. */ num_to_scan = NBuffers; + absorb_counter = WRITES_PER_ABSORB; while (num_to_scan-- > 0) { - (void) SyncOneBuffer(buf_id, false); + if (SyncOneBuffer(buf_id, false)) + { + /* + * If in bgwriter, absorb pending fsync requests after each + * WRITES_PER_ABSORB write operations, to prevent overflow of + * the fsync request queue. If not in bgwriter process, this is + * a no-op. + */ + if (--absorb_counter <= 0) + { + AbsorbFsyncRequests(); + absorb_counter = WRITES_PER_ABSORB; + } + } if (++buf_id >= NBuffers) buf_id = 0; } |