From: Vadim B. Mikheev Date: Fri, 22 Dec 2000 20:04:43 +0000 (+0000) Subject: Avoid XLogFlush for clean buffers in BufferSync. X-Git-Url: http://waps.l3s.uni-hannover.de/gitweb/?a=commitdiff_plain;h=2d95d3a35141b92adaea51d580b931d36afece49;p=users%2Fbernd%2Fpostgres.git Avoid XLogFlush for clean buffers in BufferSync. --- diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index afc8c8cc05..9395f068d6 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -723,6 +723,7 @@ BufferSync() RelFileNode rnode; XLogRecPtr recptr; Relation reln = NULL; + bool dirty = false; for (i = 0, bufHdr = BufferDescriptors; i < NBuffers; i++, bufHdr++) { @@ -745,6 +746,7 @@ BufferSync() buffer = BufferDescriptorGetBuffer(bufHdr); rnode = bufHdr->tag.rnode; + dirty = bufHdr->flags & BM_DIRTY; SpinRelease(BufMgrLock); @@ -758,6 +760,17 @@ BufferSync() */ LockBuffer(buffer, BUFFER_LOCK_SHARE); + if (!dirty && !(bufHdr->cntxDirty)) + { + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + SpinAcquire(BufMgrLock); + UnpinBuffer(bufHdr); + SpinRelease(BufMgrLock); + if (reln != (Relation) NULL) + RelationDecrementReferenceCount(reln); + continue; + } + /* * Force XLOG flush for buffer' LSN */ @@ -766,9 +779,8 @@ BufferSync() /* * Now it's safe to write buffer to disk - * (if needed at all -:)) + * (if no one else already) */ - SpinAcquire(BufMgrLock); if (bufHdr->flags & BM_IO_IN_PROGRESS) WaitIO(bufHdr, BufMgrLock); @@ -824,20 +836,19 @@ BufferSync() */ if (!(bufHdr->flags & BM_JUST_DIRTIED)) bufHdr->flags &= ~BM_DIRTY; + UnpinBuffer(bufHdr); + SpinRelease(BufMgrLock); } else + { + UnpinBuffer(bufHdr); + SpinRelease(BufMgrLock); LockBuffer(buffer, BUFFER_LOCK_UNLOCK); - - UnpinBuffer(bufHdr); - - SpinRelease(BufMgrLock); + } /* drop refcnt obtained by RelationNodeCacheGetRelation */ if (reln != (Relation) NULL) - { RelationDecrementReferenceCount(reln); - reln = NULL; - } } }