aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/bufmgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r--src/backend/storage/buffer/bufmgr.c93
1 files changed, 32 insertions, 61 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 74378e9ea72..acc719ca4b6 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -8,30 +8,31 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.76 2000/03/14 22:46:27 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.77 2000/03/31 02:43:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/*
*
* BufferAlloc() -- lookup a buffer in the buffer table. If
- * it isn't there add it, but do not read it into memory.
+ * it isn't there add it, but do not read data into memory.
* This is used when we are about to reinitialize the
* buffer so don't care what the current disk contents are.
- * BufferAlloc() pins the new buffer in memory.
+ * BufferAlloc() also pins the new buffer in memory.
*
- * ReadBuffer() -- same as BufferAlloc() but reads the data
+ * ReadBuffer() -- like BufferAlloc() but reads the data
* on a buffer cache miss.
*
* ReleaseBuffer() -- unpin the buffer
*
* WriteNoReleaseBuffer() -- mark the buffer contents as "dirty"
* but don't unpin. The disk IO is delayed until buffer
- * replacement if WriteMode is BUFFER_LATE_WRITE.
+ * replacement.
*
* WriteBuffer() -- WriteNoReleaseBuffer() + ReleaseBuffer()
*
- * FlushBuffer() -- as above but never delayed write.
+ * FlushBuffer() -- Write buffer immediately. Can unpin, or not,
+ * depending on parameter.
*
* BufferSync() -- flush all dirty buffers in the buffer pool.
*
@@ -70,11 +71,7 @@ extern long int LocalBufferFlushCount;
*/
bool SharedBufferChanged = false;
-static int WriteMode = BUFFER_LATE_WRITE; /* Delayed write is
- * default */
-
static void WaitIO(BufferDesc *buf, SPINLOCK spinlock);
-
static void StartBufferIO(BufferDesc *buf, bool forInput);
static void TerminateBufferIO(BufferDesc *buf);
static void ContinueBufferIO(BufferDesc *buf, bool forInput);
@@ -97,7 +94,6 @@ static Buffer ReadBufferWithBufferLock(Relation relation, BlockNumber blockNum,
bool bufferLockHeld);
static BufferDesc *BufferAlloc(Relation reln, BlockNumber blockNum,
bool *foundPtr, bool bufferLockHeld);
-static int FlushBuffer(Buffer buffer, bool release);
static void BufferSync(void);
static int BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld);
void PrintBufferDescs(void);
@@ -658,8 +654,7 @@ BufferAlloc(Relation reln,
/*
* WriteBuffer
*
- * Pushes buffer contents to disk if WriteMode is BUFFER_FLUSH_WRITE.
- * Otherwise, marks contents as dirty.
+ * Marks buffer contents as dirty (actual write happens later).
*
* Assume that buffer is pinned. Assume that reln is
* valid.
@@ -675,28 +670,23 @@ WriteBuffer(Buffer buffer)
{
BufferDesc *bufHdr;
- if (WriteMode == BUFFER_FLUSH_WRITE)
- return FlushBuffer(buffer, TRUE);
- else
- {
+ if (BufferIsLocal(buffer))
+ return WriteLocalBuffer(buffer, TRUE);
- if (BufferIsLocal(buffer))
- return WriteLocalBuffer(buffer, TRUE);
+ if (BAD_BUFFER_ID(buffer))
+ return FALSE;
- if (BAD_BUFFER_ID(buffer))
- return FALSE;
+ bufHdr = &BufferDescriptors[buffer - 1];
- bufHdr = &BufferDescriptors[buffer - 1];
+ SharedBufferChanged = true;
- SharedBufferChanged = true;
+ SpinAcquire(BufMgrLock);
+ Assert(bufHdr->refcount > 0);
+ bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
+ UnpinBuffer(bufHdr);
+ SpinRelease(BufMgrLock);
+ CommitInfoNeedsSave[buffer - 1] = 0;
- SpinAcquire(BufMgrLock);
- Assert(bufHdr->refcount > 0);
- bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
- UnpinBuffer(bufHdr);
- SpinRelease(BufMgrLock);
- CommitInfoNeedsSave[buffer - 1] = 0;
- }
return TRUE;
}
@@ -778,9 +768,9 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest)
* 'buffer' is known to be dirty/pinned, so there should not be a
* problem reading the BufferDesc members without the BufMgrLock
* (nobody should be able to change tags, flags, etc. out from under
- * us).
+ * us). Unpin if 'release' is TRUE.
*/
-static int
+int
FlushBuffer(Buffer buffer, bool release)
{
BufferDesc *bufHdr;
@@ -850,36 +840,27 @@ FlushBuffer(Buffer buffer, bool release)
/*
* WriteNoReleaseBuffer -- like WriteBuffer, but do not unpin the buffer
* when the operation is complete.
- *
- * We know that the buffer is for a relation in our private cache,
- * because this routine is called only to write out buffers that
- * were changed by the executing backend.
*/
int
WriteNoReleaseBuffer(Buffer buffer)
{
BufferDesc *bufHdr;
- if (WriteMode == BUFFER_FLUSH_WRITE)
- return FlushBuffer(buffer, FALSE);
- else
- {
+ if (BufferIsLocal(buffer))
+ return WriteLocalBuffer(buffer, FALSE);
- if (BufferIsLocal(buffer))
- return WriteLocalBuffer(buffer, FALSE);
+ if (BAD_BUFFER_ID(buffer))
+ return STATUS_ERROR;
- if (BAD_BUFFER_ID(buffer))
- return STATUS_ERROR;
+ bufHdr = &BufferDescriptors[buffer - 1];
- bufHdr = &BufferDescriptors[buffer - 1];
+ SharedBufferChanged = true;
- SharedBufferChanged = true;
+ SpinAcquire(BufMgrLock);
+ bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
+ SpinRelease(BufMgrLock);
+ CommitInfoNeedsSave[buffer - 1] = 0;
- SpinAcquire(BufMgrLock);
- bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
- SpinRelease(BufMgrLock);
- CommitInfoNeedsSave[buffer - 1] = 0;
- }
return STATUS_OK;
}
@@ -2002,16 +1983,6 @@ _bm_die(Oid dbId, Oid relId, int blkNo, int bufNo,
#endif /* BMTRACE */
-int
-SetBufferWriteMode(int mode)
-{
- int old;
-
- old = WriteMode;
- WriteMode = mode;
- return old;
-}
-
void
SetBufferCommitInfoNeedsSave(Buffer buffer)
{