Skip to content

Commit 369aace

Browse files
committed
Avoid XLogFlush for clean buffers in BufferSync.
1 parent 387d431 commit 369aace

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

src/backend/storage/buffer/bufmgr.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.98 2000/11/30 19:03:25 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.99 2000/12/22 20:04:43 vadim Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -723,6 +723,7 @@ BufferSync()
723723
RelFileNode rnode;
724724
XLogRecPtr recptr;
725725
Relation reln = NULL;
726+
bool dirty = false;
726727

727728
for (i = 0, bufHdr = BufferDescriptors; i < NBuffers; i++, bufHdr++)
728729
{
@@ -745,6 +746,7 @@ BufferSync()
745746

746747
buffer = BufferDescriptorGetBuffer(bufHdr);
747748
rnode = bufHdr->tag.rnode;
749+
dirty = bufHdr->flags & BM_DIRTY;
748750

749751
SpinRelease(BufMgrLock);
750752

@@ -758,6 +760,17 @@ BufferSync()
758760
*/
759761
LockBuffer(buffer, BUFFER_LOCK_SHARE);
760762

763+
if (!dirty && !(bufHdr->cntxDirty))
764+
{
765+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
766+
SpinAcquire(BufMgrLock);
767+
UnpinBuffer(bufHdr);
768+
SpinRelease(BufMgrLock);
769+
if (reln != (Relation) NULL)
770+
RelationDecrementReferenceCount(reln);
771+
continue;
772+
}
773+
761774
/*
762775
* Force XLOG flush for buffer' LSN
763776
*/
@@ -766,9 +779,8 @@ BufferSync()
766779

767780
/*
768781
* Now it's safe to write buffer to disk
769-
* (if needed at all -:))
782+
* (if no one else already)
770783
*/
771-
772784
SpinAcquire(BufMgrLock);
773785
if (bufHdr->flags & BM_IO_IN_PROGRESS)
774786
WaitIO(bufHdr, BufMgrLock);
@@ -824,20 +836,19 @@ BufferSync()
824836
*/
825837
if (!(bufHdr->flags & BM_JUST_DIRTIED))
826838
bufHdr->flags &= ~BM_DIRTY;
839+
UnpinBuffer(bufHdr);
840+
SpinRelease(BufMgrLock);
827841
}
828842
else
843+
{
844+
UnpinBuffer(bufHdr);
845+
SpinRelease(BufMgrLock);
829846
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
830-
831-
UnpinBuffer(bufHdr);
832-
833-
SpinRelease(BufMgrLock);
847+
}
834848

835849
/* drop refcnt obtained by RelationNodeCacheGetRelation */
836850
if (reln != (Relation) NULL)
837-
{
838851
RelationDecrementReferenceCount(reln);
839-
reln = NULL;
840-
}
841852
}
842853

843854
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy