Commit eb08b3ce authored by Vadim B. Mikheev's avatar Vadim B. Mikheev

No more LateWrite, but there is WriteMode;

SetBufferWriteMode () added;
FlushBuffer () fixed: now directly calls smgrflush () and
	releases buffer only if required by caller.
parent 1c297d42
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.7 1997/01/14 05:40:45 vadim Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.8 1997/01/16 08:11:41 vadim Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* *
* WriteNoReleaseBuffer() -- mark the buffer contents as "dirty" * WriteNoReleaseBuffer() -- mark the buffer contents as "dirty"
* but don't unpin. The disk IO is delayed until buffer * but don't unpin. The disk IO is delayed until buffer
* replacement if LateWrite flag is set. * replacement if WriteMode is BUFFER_LATE_WRITE.
* *
* WriteBuffer() -- WriteNoReleaseBuffer() + ReleaseBuffer() * WriteBuffer() -- WriteNoReleaseBuffer() + ReleaseBuffer()
* *
...@@ -74,12 +74,13 @@ ...@@ -74,12 +74,13 @@
#include "executor/execdebug.h" /* for NDirectFileRead */ #include "executor/execdebug.h" /* for NDirectFileRead */
#include "catalog/catalog.h" #include "catalog/catalog.h"
extern int LateWrite;
extern SPINLOCK BufMgrLock; extern SPINLOCK BufMgrLock;
extern int ReadBufferCount; extern int ReadBufferCount;
extern int BufferHitCount; extern int BufferHitCount;
extern int BufferFlushCount; extern int BufferFlushCount;
static int WriteMode = BUFFER_LATE_WRITE; /* Delayed write is default */
static void WaitIO(BufferDesc *buf, SPINLOCK spinlock); static void WaitIO(BufferDesc *buf, SPINLOCK spinlock);
#ifndef HAS_TEST_AND_SET #ifndef HAS_TEST_AND_SET
static void SignalIO(BufferDesc *buf); static void SignalIO(BufferDesc *buf);
...@@ -90,7 +91,7 @@ static Buffer ReadBufferWithBufferLock(Relation relation, BlockNumber blockNum, ...@@ -90,7 +91,7 @@ static Buffer ReadBufferWithBufferLock(Relation relation, BlockNumber blockNum,
bool bufferLockHeld); bool bufferLockHeld);
static BufferDesc *BufferAlloc(Relation reln, BlockNumber blockNum, static BufferDesc *BufferAlloc(Relation reln, BlockNumber blockNum,
bool *foundPtr, bool bufferLockHeld); bool *foundPtr, bool bufferLockHeld);
static int FlushBuffer(Buffer buffer); static int FlushBuffer (Buffer buffer, bool release);
static void BufferSync(void); static void BufferSync(void);
static int BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld); static int BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld);
...@@ -611,8 +612,8 @@ BufferAlloc(Relation reln, ...@@ -611,8 +612,8 @@ BufferAlloc(Relation reln,
/* /*
* WriteBuffer-- * WriteBuffer--
* *
* Pushes buffer contents to disk if LateWrite is * Pushes buffer contents to disk if WriteMode is BUFFER_FLUSH_WRITE.
* not set. Otherwise, marks contents as dirty. * Otherwise, marks contents as dirty.
* *
* Assume that buffer is pinned. Assume that reln is * Assume that buffer is pinned. Assume that reln is
* valid. * valid.
...@@ -628,8 +629,8 @@ WriteBuffer(Buffer buffer) ...@@ -628,8 +629,8 @@ WriteBuffer(Buffer buffer)
{ {
BufferDesc *bufHdr; BufferDesc *bufHdr;
if (! LateWrite) { if (WriteMode == BUFFER_FLUSH_WRITE) {
return(FlushBuffer(buffer)); return (FlushBuffer (buffer, TRUE));
} else { } else {
if (BufferIsLocal(buffer)) if (BufferIsLocal(buffer))
...@@ -712,25 +713,40 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest) ...@@ -712,25 +713,40 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest)
* us). * us).
*/ */
static int static int
FlushBuffer(Buffer buffer) FlushBuffer(Buffer buffer, bool release)
{ {
BufferDesc *bufHdr; BufferDesc *bufHdr;
Oid bufdb;
Relation bufrel;
int status;
if (BufferIsLocal(buffer)) if (BufferIsLocal(buffer))
return FlushLocalBuffer(buffer); return FlushLocalBuffer(buffer, release);
if (BAD_BUFFER_ID(buffer)) if (BAD_BUFFER_ID(buffer))
return (STATUS_ERROR); return (STATUS_ERROR);
bufHdr = &BufferDescriptors[buffer-1]; bufHdr = &BufferDescriptors[buffer-1];
bufdb = bufHdr->tag.relId.dbId;
if (!BufferReplace(bufHdr, false)) { Assert (bufdb == MyDatabaseId || bufdb == (Oid) NULL);
elog(WARN, "FlushBuffer: cannot flush %d", bufHdr->tag.blockNum); bufrel = RelationIdCacheGetRelation (bufHdr->tag.relId.relId);
Assert (bufrel != (Relation) NULL);
status = smgrflush(bufHdr->bufsmgr, bufrel, bufHdr->tag.blockNum,
(char *) MAKE_PTR(bufHdr->data));
if (status == SM_FAIL)
{
elog(WARN, "FlushBuffer: cannot flush block %u of the relation %.*s",
bufHdr->tag.blockNum,
NAMEDATALEN, bufrel->rd_rel->relname.data);
return (STATUS_ERROR); return (STATUS_ERROR);
} }
SpinAcquire(BufMgrLock); SpinAcquire(BufMgrLock);
bufHdr->flags &= ~BM_DIRTY; bufHdr->flags &= ~BM_DIRTY;
if ( release )
UnpinBuffer(bufHdr); UnpinBuffer(bufHdr);
SpinRelease(BufMgrLock); SpinRelease(BufMgrLock);
...@@ -750,8 +766,8 @@ WriteNoReleaseBuffer(Buffer buffer) ...@@ -750,8 +766,8 @@ WriteNoReleaseBuffer(Buffer buffer)
{ {
BufferDesc *bufHdr; BufferDesc *bufHdr;
if (! LateWrite) { if (WriteMode == BUFFER_FLUSH_WRITE) {
return(FlushBuffer(buffer)); return (FlushBuffer (buffer, FALSE));
} else { } else {
if (BufferIsLocal(buffer)) if (BufferIsLocal(buffer))
...@@ -899,7 +915,11 @@ BufferSync() ...@@ -899,7 +915,11 @@ BufferSync()
elog(WARN, "cannot write %u for %s", elog(WARN, "cannot write %u for %s",
bufHdr->tag.blockNum, bufHdr->sb_relname); bufHdr->tag.blockNum, bufHdr->sb_relname);
} }
/*
* What if someone has marked this buffer as DIRTY after
* smgr[blind]write but before SpinAcquire(BufMgrLock)
* ??? - vadim 01/16/97
*/
bufHdr->flags &= ~BM_DIRTY; bufHdr->flags &= ~BM_DIRTY;
if (reln != (Relation)NULL) if (reln != (Relation)NULL)
RelationDecrementReferenceCount(reln); RelationDecrementReferenceCount(reln);
...@@ -1145,7 +1165,6 @@ BufferGetRelation(Buffer buffer) ...@@ -1145,7 +1165,6 @@ BufferGetRelation(Buffer buffer)
* *
* Flush the buffer corresponding to 'bufHdr' * Flush the buffer corresponding to 'bufHdr'
* *
* Assumes that the BufMgrLock has NOT been acquired.
*/ */
static int static int
BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld) BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld)
...@@ -1655,3 +1674,11 @@ BufferRefCountRestore(int *refcountsave) ...@@ -1655,3 +1674,11 @@ BufferRefCountRestore(int *refcountsave)
} }
} }
int SetBufferWriteMode (int mode)
{
int old;
old = WriteMode;
WriteMode = mode;
return (old);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment