8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -723,6 +723,7 @@ BufferSync()
723
723
RelFileNode rnode ;
724
724
XLogRecPtr recptr ;
725
725
Relation reln = NULL ;
726
+ bool dirty = false;
726
727
727
728
for (i = 0 , bufHdr = BufferDescriptors ; i < NBuffers ; i ++ , bufHdr ++ )
728
729
{
@@ -745,6 +746,7 @@ BufferSync()
745
746
746
747
buffer = BufferDescriptorGetBuffer (bufHdr );
747
748
rnode = bufHdr -> tag .rnode ;
749
+ dirty = bufHdr -> flags & BM_DIRTY ;
748
750
749
751
SpinRelease (BufMgrLock );
750
752
@@ -758,6 +760,17 @@ BufferSync()
758
760
*/
759
761
LockBuffer (buffer , BUFFER_LOCK_SHARE );
760
762
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
+
761
774
/*
762
775
* Force XLOG flush for buffer' LSN
763
776
*/
@@ -766,9 +779,8 @@ BufferSync()
766
779
767
780
/*
768
781
* Now it's safe to write buffer to disk
769
- * (if needed at all -:) )
782
+ * (if no one else already )
770
783
*/
771
-
772
784
SpinAcquire (BufMgrLock );
773
785
if (bufHdr -> flags & BM_IO_IN_PROGRESS )
774
786
WaitIO (bufHdr , BufMgrLock );
@@ -824,20 +836,19 @@ BufferSync()
824
836
*/
825
837
if (!(bufHdr -> flags & BM_JUST_DIRTIED ))
826
838
bufHdr -> flags &= ~BM_DIRTY ;
839
+ UnpinBuffer (bufHdr );
840
+ SpinRelease (BufMgrLock );
827
841
}
828
842
else
843
+ {
844
+ UnpinBuffer (bufHdr );
845
+ SpinRelease (BufMgrLock );
829
846
LockBuffer (buffer , BUFFER_LOCK_UNLOCK );
830
-
831
- UnpinBuffer (bufHdr );
832
-
833
- SpinRelease (BufMgrLock );
847
+ }
834
848
835
849
/* drop refcnt obtained by RelationNodeCacheGetRelation */
836
850
if (reln != (Relation ) NULL )
837
- {
838
851
RelationDecrementReferenceCount (reln );
839
- reln = NULL ;
840
- }
841
852
}
842
853
843
854
}
0 commit comments