diff options
author | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-01-16 08:11:41 +0000 |
---|---|---|
committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-01-16 08:11:41 +0000 |
commit | eb08b3ce4fa674d291d106b570a9051950077304 (patch) | |
tree | 98205a9f4db829a5c4657106c22190aa2ff4829e /src/backend/storage/buffer/bufmgr.c | |
parent | 1c297d429eca646f83c91e58ed5d360e8d70a08b (diff) | |
download | postgresql-eb08b3ce4fa674d291d106b570a9051950077304.tar.gz postgresql-eb08b3ce4fa674d291d106b570a9051950077304.zip |
No more LateWrite, but there is WriteMode;
SetBufferWriteMode () added;
FlushBuffer () fixed: now directly calls smgrflush () and
releases buffer only if required by caller.
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index aa65cd56ed8..419e8865477 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -7,7 +7,7 @@ * * * 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 @@ * * WriteNoReleaseBuffer() -- mark the buffer contents as "dirty" * 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() * @@ -74,12 +74,13 @@ #include "executor/execdebug.h" /* for NDirectFileRead */ #include "catalog/catalog.h" -extern int LateWrite; extern SPINLOCK BufMgrLock; extern int ReadBufferCount; extern int BufferHitCount; extern int BufferFlushCount; +static int WriteMode = BUFFER_LATE_WRITE; /* Delayed write is default */ + static void WaitIO(BufferDesc *buf, SPINLOCK spinlock); #ifndef HAS_TEST_AND_SET static void SignalIO(BufferDesc *buf); @@ -90,7 +91,7 @@ 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); +static int FlushBuffer (Buffer buffer, bool release); static void BufferSync(void); static int BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld); @@ -611,8 +612,8 @@ BufferAlloc(Relation reln, /* * WriteBuffer-- * - * Pushes buffer contents to disk if LateWrite is - * not set. Otherwise, marks contents as dirty. + * Pushes buffer contents to disk if WriteMode is BUFFER_FLUSH_WRITE. + * Otherwise, marks contents as dirty. * * Assume that buffer is pinned. Assume that reln is * valid. @@ -628,8 +629,8 @@ WriteBuffer(Buffer buffer) { BufferDesc *bufHdr; - if (! LateWrite) { - return(FlushBuffer(buffer)); + if (WriteMode == BUFFER_FLUSH_WRITE) { + return (FlushBuffer (buffer, TRUE)); } else { if (BufferIsLocal(buffer)) @@ -712,26 +713,41 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest) * us). */ static int -FlushBuffer(Buffer buffer) +FlushBuffer(Buffer buffer, bool release) { BufferDesc *bufHdr; + Oid bufdb; + Relation bufrel; + int status; if (BufferIsLocal(buffer)) - return FlushLocalBuffer(buffer); + return FlushLocalBuffer(buffer, release); if (BAD_BUFFER_ID(buffer)) return (STATUS_ERROR); bufHdr = &BufferDescriptors[buffer-1]; + bufdb = bufHdr->tag.relId.dbId; - if (!BufferReplace(bufHdr, false)) { - elog(WARN, "FlushBuffer: cannot flush %d", bufHdr->tag.blockNum); + Assert (bufdb == MyDatabaseId || bufdb == (Oid) NULL); + 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); } SpinAcquire(BufMgrLock); bufHdr->flags &= ~BM_DIRTY; - UnpinBuffer(bufHdr); + if ( release ) + UnpinBuffer(bufHdr); SpinRelease(BufMgrLock); return(STATUS_OK); @@ -750,8 +766,8 @@ WriteNoReleaseBuffer(Buffer buffer) { BufferDesc *bufHdr; - if (! LateWrite) { - return(FlushBuffer(buffer)); + if (WriteMode == BUFFER_FLUSH_WRITE) { + return (FlushBuffer (buffer, FALSE)); } else { if (BufferIsLocal(buffer)) @@ -899,7 +915,11 @@ BufferSync() elog(WARN, "cannot write %u for %s", 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; if (reln != (Relation)NULL) RelationDecrementReferenceCount(reln); @@ -1145,7 +1165,6 @@ BufferGetRelation(Buffer buffer) * * Flush the buffer corresponding to 'bufHdr' * - * Assumes that the BufMgrLock has NOT been acquired. */ static int BufferReplace(BufferDesc *bufHdr, bool bufferLockHeld) @@ -1655,3 +1674,11 @@ BufferRefCountRestore(int *refcountsave) } } +int SetBufferWriteMode (int mode) +{ + int old; + + old = WriteMode; + WriteMode = mode; + return (old); +} |