Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit ca05ba2

Browse files
committed
Get rid of SetBufferWriteMode(), which was an accident waiting to happen.
In the event of an elog() while the mode was set to immediate write, there was no way for it to be set back to the normal delayed write. The mechanism was a waste of space and cycles anyway, since the only user was varsup.c, which could perfectly well call FlushBuffer directly. Now it does just that, and the notion of a write mode is gone.
1 parent 5717dcb commit ca05ba2

File tree

3 files changed

+37
-75
lines changed

3 files changed

+37
-75
lines changed

src/backend/access/transam/varsup.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.26 2000/01/26 05:56:04 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.27 2000/03/31 02:43:31 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -88,7 +88,6 @@ VariableRelationPutNextXid(TransactionId xid)
8888
{
8989
Buffer buf;
9090
VariableRelationContents var;
91-
int flushmode;
9291

9392
/* ----------------
9493
* We assume that a spinlock has been acquire to guarantee
@@ -105,7 +104,7 @@ VariableRelationPutNextXid(TransactionId xid)
105104

106105
/* ----------------
107106
* read the variable page, update the nextXid field and
108-
* write the page back out to disk.
107+
* write the page back out to disk (with immediate write).
109108
* ----------------
110109
*/
111110
buf = ReadBuffer(VariableRelation, 0);
@@ -120,9 +119,7 @@ VariableRelationPutNextXid(TransactionId xid)
120119

121120
TransactionIdStore(xid, &(var->nextXidData));
122121

123-
flushmode = SetBufferWriteMode(BUFFER_FLUSH_WRITE);
124-
WriteBuffer(buf);
125-
SetBufferWriteMode(flushmode);
122+
FlushBuffer(buf, TRUE);
126123
}
127124

128125
/* --------------------------------

src/backend/storage/buffer/bufmgr.c

Lines changed: 32 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,31 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.76 2000/03/14 22:46:27 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.77 2000/03/31 02:43:31 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
1515
/*
1616
*
1717
* BufferAlloc() -- lookup a buffer in the buffer table. If
18-
* it isn't there add it, but do not read it into memory.
18+
* it isn't there add it, but do not read data into memory.
1919
* This is used when we are about to reinitialize the
2020
* buffer so don't care what the current disk contents are.
21-
* BufferAlloc() pins the new buffer in memory.
21+
* BufferAlloc() also pins the new buffer in memory.
2222
*
23-
* ReadBuffer() -- same as BufferAlloc() but reads the data
23+
* ReadBuffer() -- like BufferAlloc() but reads the data
2424
* on a buffer cache miss.
2525
*
2626
* ReleaseBuffer() -- unpin the buffer
2727
*
2828
* WriteNoReleaseBuffer() -- mark the buffer contents as "dirty"
2929
* but don't unpin. The disk IO is delayed until buffer
30-
* replacement if WriteMode is BUFFER_LATE_WRITE.
30+
* replacement.
3131
*
3232
* WriteBuffer() -- WriteNoReleaseBuffer() + ReleaseBuffer()
3333
*
34-
* FlushBuffer() -- as above but never delayed write.
34+
* FlushBuffer() -- Write buffer immediately. Can unpin, or not,
35+
* depending on parameter.
3536
*
3637
* BufferSync() -- flush all dirty buffers in the buffer pool.
3738
*
@@ -70,11 +71,7 @@ extern long int LocalBufferFlushCount;
7071
*/
7172
bool SharedBufferChanged = false;
7273

73-
static int WriteMode = BUFFER_LATE_WRITE; /* Delayed write is
74-
* default */
75-
7674
static void WaitIO(BufferDesc *buf, SPINLOCK spinlock);
77-
7875
static void StartBufferIO(BufferDesc *buf, bool forInput);
7976
static void TerminateBufferIO(BufferDesc *buf);
8077
static void ContinueBufferIO(BufferDesc *buf, bool forInput);
@@ -97,7 +94,6 @@ static Buffer ReadBufferWithBufferLock(Relation relation, BlockNumber blockNum,
9794
bool bufferLockHeld);
9895
static BufferDesc *BufferAlloc(Relation reln, BlockNumber blockNum,
9996
bool *foundPtr, bool bufferLockHeld);
100-
static int FlushBuffer(Buffer buffer, bool release);
10197
static void BufferSync(void);
10298
static int BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld);
10399
void PrintBufferDescs(void);
@@ -658,8 +654,7 @@ BufferAlloc(Relation reln,
658654
/*
659655
* WriteBuffer
660656
*
661-
* Pushes buffer contents to disk if WriteMode is BUFFER_FLUSH_WRITE.
662-
* Otherwise, marks contents as dirty.
657+
* Marks buffer contents as dirty (actual write happens later).
663658
*
664659
* Assume that buffer is pinned. Assume that reln is
665660
* valid.
@@ -675,28 +670,23 @@ WriteBuffer(Buffer buffer)
675670
{
676671
BufferDesc *bufHdr;
677672

678-
if (WriteMode == BUFFER_FLUSH_WRITE)
679-
return FlushBuffer(buffer, TRUE);
680-
else
681-
{
673+
if (BufferIsLocal(buffer))
674+
return WriteLocalBuffer(buffer, TRUE);
682675

683-
if (BufferIsLocal(buffer))
684-
return WriteLocalBuffer(buffer, TRUE);
676+
if (BAD_BUFFER_ID(buffer))
677+
return FALSE;
685678

686-
if (BAD_BUFFER_ID(buffer))
687-
return FALSE;
679+
bufHdr = &BufferDescriptors[buffer - 1];
688680

689-
bufHdr = &BufferDescriptors[buffer - 1];
681+
SharedBufferChanged = true;
690682

691-
SharedBufferChanged = true;
683+
SpinAcquire(BufMgrLock);
684+
Assert(bufHdr->refcount > 0);
685+
bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
686+
UnpinBuffer(bufHdr);
687+
SpinRelease(BufMgrLock);
688+
CommitInfoNeedsSave[buffer - 1] = 0;
692689

693-
SpinAcquire(BufMgrLock);
694-
Assert(bufHdr->refcount > 0);
695-
bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
696-
UnpinBuffer(bufHdr);
697-
SpinRelease(BufMgrLock);
698-
CommitInfoNeedsSave[buffer - 1] = 0;
699-
}
700690
return TRUE;
701691
}
702692

@@ -778,9 +768,9 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest)
778768
* 'buffer' is known to be dirty/pinned, so there should not be a
779769
* problem reading the BufferDesc members without the BufMgrLock
780770
* (nobody should be able to change tags, flags, etc. out from under
781-
* us).
771+
* us). Unpin if 'release' is TRUE.
782772
*/
783-
static int
773+
int
784774
FlushBuffer(Buffer buffer, bool release)
785775
{
786776
BufferDesc *bufHdr;
@@ -850,36 +840,27 @@ FlushBuffer(Buffer buffer, bool release)
850840
/*
851841
* WriteNoReleaseBuffer -- like WriteBuffer, but do not unpin the buffer
852842
* when the operation is complete.
853-
*
854-
* We know that the buffer is for a relation in our private cache,
855-
* because this routine is called only to write out buffers that
856-
* were changed by the executing backend.
857843
*/
858844
int
859845
WriteNoReleaseBuffer(Buffer buffer)
860846
{
861847
BufferDesc *bufHdr;
862848

863-
if (WriteMode == BUFFER_FLUSH_WRITE)
864-
return FlushBuffer(buffer, FALSE);
865-
else
866-
{
849+
if (BufferIsLocal(buffer))
850+
return WriteLocalBuffer(buffer, FALSE);
867851

868-
if (BufferIsLocal(buffer))
869-
return WriteLocalBuffer(buffer, FALSE);
852+
if (BAD_BUFFER_ID(buffer))
853+
return STATUS_ERROR;
870854

871-
if (BAD_BUFFER_ID(buffer))
872-
return STATUS_ERROR;
855+
bufHdr = &BufferDescriptors[buffer - 1];
873856

874-
bufHdr = &BufferDescriptors[buffer - 1];
857+
SharedBufferChanged = true;
875858

876-
SharedBufferChanged = true;
859+
SpinAcquire(BufMgrLock);
860+
bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
861+
SpinRelease(BufMgrLock);
862+
CommitInfoNeedsSave[buffer - 1] = 0;
877863

878-
SpinAcquire(BufMgrLock);
879-
bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
880-
SpinRelease(BufMgrLock);
881-
CommitInfoNeedsSave[buffer - 1] = 0;
882-
}
883864
return STATUS_OK;
884865
}
885866

@@ -2002,16 +1983,6 @@ _bm_die(Oid dbId, Oid relId, int blkNo, int bufNo,
20021983

20031984
#endif /* BMTRACE */
20041985

2005-
int
2006-
SetBufferWriteMode(int mode)
2007-
{
2008-
int old;
2009-
2010-
old = WriteMode;
2011-
WriteMode = mode;
2012-
return old;
2013-
}
2014-
20151986
void
20161987
SetBufferCommitInfoNeedsSave(Buffer buffer)
20171988
{

src/include/storage/bufmgr.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: bufmgr.h,v 1.34 2000/01/26 05:58:32 momjian Exp $
10+
* $Id: bufmgr.h,v 1.35 2000/03/31 02:43:30 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -56,12 +56,6 @@ typedef bits16 BufferLock;
5656

5757
extern int ShowPinTrace;
5858

59-
/*
60-
* BufferWriteModes (settable via SetBufferWriteMode)
61-
*/
62-
#define BUFFER_FLUSH_WRITE 0 /* immediate write */
63-
#define BUFFER_LATE_WRITE 1 /* delayed write: mark as DIRTY */
64-
6559
/*
6660
* Buffer context lock modes
6761
*/
@@ -165,6 +159,7 @@ extern int WriteBuffer(Buffer buffer);
165159
extern int WriteNoReleaseBuffer(Buffer buffer);
166160
extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
167161
BlockNumber blockNum);
162+
extern int FlushBuffer(Buffer buffer, bool release);
168163

169164
extern void InitBufferPool(IPCKey key);
170165
extern void PrintBufferUsage(FILE *statfp);
@@ -182,7 +177,6 @@ extern void PrintPinnedBufs(void);
182177
extern int BufferShmemSize(void);
183178
extern int ReleaseBuffer(Buffer buffer);
184179

185-
extern int SetBufferWriteMode(int mode);
186180
extern void SetBufferCommitInfoNeedsSave(Buffer buffer);
187181

188182
extern void UnlockBuffers(void);

0 commit comments

Comments
 (0)