7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.7 1997/01/14 05:40:45 vadim Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.8 1997/01/16 08:11:41 vadim Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
26
26
*
27
27
* WriteNoReleaseBuffer() -- mark the buffer contents as "dirty"
28
28
* but don't unpin. The disk IO is delayed until buffer
29
- * replacement if LateWrite flag is set .
29
+ * replacement if WriteMode is BUFFER_LATE_WRITE .
30
30
*
31
31
* WriteBuffer() -- WriteNoReleaseBuffer() + ReleaseBuffer()
32
32
*
74
74
#include "executor/execdebug.h" /* for NDirectFileRead */
75
75
#include "catalog/catalog.h"
76
76
77
- extern int LateWrite ;
78
77
extern SPINLOCK BufMgrLock ;
79
78
extern int ReadBufferCount ;
80
79
extern int BufferHitCount ;
81
80
extern int BufferFlushCount ;
82
81
82
+ static int WriteMode = BUFFER_LATE_WRITE ; /* Delayed write is default */
83
+
83
84
static void WaitIO (BufferDesc * buf , SPINLOCK spinlock );
84
85
#ifndef HAS_TEST_AND_SET
85
86
static void SignalIO (BufferDesc * buf );
@@ -90,7 +91,7 @@ static Buffer ReadBufferWithBufferLock(Relation relation, BlockNumber blockNum,
90
91
bool bufferLockHeld );
91
92
static BufferDesc * BufferAlloc (Relation reln , BlockNumber blockNum ,
92
93
bool * foundPtr , bool bufferLockHeld );
93
- static int FlushBuffer (Buffer buffer );
94
+ static int FlushBuffer (Buffer buffer , bool release );
94
95
static void BufferSync (void );
95
96
static int BufferReplace (BufferDesc * bufHdr , bool bufferLockHeld );
96
97
@@ -611,8 +612,8 @@ BufferAlloc(Relation reln,
611
612
/*
612
613
* WriteBuffer--
613
614
*
614
- * Pushes buffer contents to disk if LateWrite is
615
- * not set. Otherwise, marks contents as dirty.
615
+ * Pushes buffer contents to disk if WriteMode is BUFFER_FLUSH_WRITE.
616
+ * Otherwise, marks contents as dirty.
616
617
*
617
618
* Assume that buffer is pinned. Assume that reln is
618
619
* valid.
@@ -628,8 +629,8 @@ WriteBuffer(Buffer buffer)
628
629
{
629
630
BufferDesc * bufHdr ;
630
631
631
- if (! LateWrite ) {
632
- return (FlushBuffer (buffer ));
632
+ if (WriteMode == BUFFER_FLUSH_WRITE ) {
633
+ return (FlushBuffer (buffer , TRUE ));
633
634
} else {
634
635
635
636
if (BufferIsLocal (buffer ))
@@ -712,26 +713,41 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest)
712
713
* us).
713
714
*/
714
715
static int
715
- FlushBuffer (Buffer buffer )
716
+ FlushBuffer (Buffer buffer , bool release )
716
717
{
717
718
BufferDesc * bufHdr ;
719
+ Oid bufdb ;
720
+ Relation bufrel ;
721
+ int status ;
718
722
719
723
if (BufferIsLocal (buffer ))
720
- return FlushLocalBuffer (buffer );
724
+ return FlushLocalBuffer (buffer , release );
721
725
722
726
if (BAD_BUFFER_ID (buffer ))
723
727
return (STATUS_ERROR );
724
728
725
729
bufHdr = & BufferDescriptors [buffer - 1 ];
730
+ bufdb = bufHdr -> tag .relId .dbId ;
726
731
727
- if (!BufferReplace (bufHdr , false)) {
728
- elog (WARN , "FlushBuffer: cannot flush %d" , bufHdr -> tag .blockNum );
732
+ Assert (bufdb == MyDatabaseId || bufdb == (Oid ) NULL );
733
+ bufrel = RelationIdCacheGetRelation (bufHdr -> tag .relId .relId );
734
+ Assert (bufrel != (Relation ) NULL );
735
+
736
+ status = smgrflush (bufHdr -> bufsmgr , bufrel , bufHdr -> tag .blockNum ,
737
+ (char * ) MAKE_PTR (bufHdr -> data ));
738
+
739
+ if (status == SM_FAIL )
740
+ {
741
+ elog (WARN , "FlushBuffer: cannot flush block %u of the relation %.*s" ,
742
+ bufHdr -> tag .blockNum ,
743
+ NAMEDATALEN , bufrel -> rd_rel -> relname .data );
729
744
return (STATUS_ERROR );
730
745
}
731
746
732
747
SpinAcquire (BufMgrLock );
733
748
bufHdr -> flags &= ~BM_DIRTY ;
734
- UnpinBuffer (bufHdr );
749
+ if ( release )
750
+ UnpinBuffer (bufHdr );
735
751
SpinRelease (BufMgrLock );
736
752
737
753
return (STATUS_OK );
@@ -750,8 +766,8 @@ WriteNoReleaseBuffer(Buffer buffer)
750
766
{
751
767
BufferDesc * bufHdr ;
752
768
753
- if (! LateWrite ) {
754
- return (FlushBuffer (buffer ));
769
+ if (WriteMode == BUFFER_FLUSH_WRITE ) {
770
+ return (FlushBuffer (buffer , FALSE ));
755
771
} else {
756
772
757
773
if (BufferIsLocal (buffer ))
@@ -899,7 +915,11 @@ BufferSync()
899
915
elog (WARN , "cannot write %u for %s" ,
900
916
bufHdr -> tag .blockNum , bufHdr -> sb_relname );
901
917
}
902
-
918
+ /*
919
+ * What if someone has marked this buffer as DIRTY after
920
+ * smgr[blind]write but before SpinAcquire(BufMgrLock)
921
+ * ??? - vadim 01/16/97
922
+ */
903
923
bufHdr -> flags &= ~BM_DIRTY ;
904
924
if (reln != (Relation )NULL )
905
925
RelationDecrementReferenceCount (reln );
@@ -1145,7 +1165,6 @@ BufferGetRelation(Buffer buffer)
1145
1165
*
1146
1166
* Flush the buffer corresponding to 'bufHdr'
1147
1167
*
1148
- * Assumes that the BufMgrLock has NOT been acquired.
1149
1168
*/
1150
1169
static int
1151
1170
BufferReplace (BufferDesc * bufHdr , bool bufferLockHeld )
@@ -1655,3 +1674,11 @@ BufferRefCountRestore(int *refcountsave)
1655
1674
}
1656
1675
}
1657
1676
1677
+ int SetBufferWriteMode (int mode )
1678
+ {
1679
+ int old ;
1680
+
1681
+ old = WriteMode ;
1682
+ WriteMode = mode ;
1683
+ return (old );
1684
+ }
0 commit comments