Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commiteb08b3c

Browse files
committed
No more LateWrite, but there is WriteMode;
SetBufferWriteMode () added;FlushBuffer () fixed: now directly calls smgrflush () andreleases buffer only if required by caller.
1 parent1c297d4 commiteb08b3c

File tree

1 file changed

+44
-17
lines changed

1 file changed

+44
-17
lines changed

‎src/backend/storage/buffer/bufmgr.c

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* 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 $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -26,7 +26,7 @@
2626
*
2727
* WriteNoReleaseBuffer() -- mark the buffer contents as "dirty"
2828
*but don't unpin. The disk IO is delayed until buffer
29-
*replacement ifLateWrite flagisset.
29+
*replacement ifWriteModeisBUFFER_LATE_WRITE.
3030
*
3131
* WriteBuffer() -- WriteNoReleaseBuffer() + ReleaseBuffer()
3232
*
@@ -74,12 +74,13 @@
7474
#include"executor/execdebug.h"/* for NDirectFileRead */
7575
#include"catalog/catalog.h"
7676

77-
externintLateWrite;
7877
externSPINLOCKBufMgrLock;
7978
externintReadBufferCount;
8079
externintBufferHitCount;
8180
externintBufferFlushCount;
8281

82+
staticintWriteMode=BUFFER_LATE_WRITE;/* Delayed write is default */
83+
8384
staticvoidWaitIO(BufferDesc*buf,SPINLOCKspinlock);
8485
#ifndefHAS_TEST_AND_SET
8586
staticvoidSignalIO(BufferDesc*buf);
@@ -90,7 +91,7 @@ static Buffer ReadBufferWithBufferLock(Relation relation, BlockNumber blockNum,
9091
boolbufferLockHeld);
9192
staticBufferDesc*BufferAlloc(Relationreln,BlockNumberblockNum,
9293
bool*foundPtr,boolbufferLockHeld);
93-
staticintFlushBuffer(Bufferbuffer);
94+
staticintFlushBuffer(Bufferbuffer,boolrelease);
9495
staticvoidBufferSync(void);
9596
staticintBufferReplace(BufferDesc*bufHdr,boolbufferLockHeld);
9697

@@ -611,8 +612,8 @@ BufferAlloc(Relation reln,
611612
/*
612613
* WriteBuffer--
613614
*
614-
*Pushes buffer contents to disk ifLateWrite is
615-
* not set.Otherwise, marks contents as dirty.
615+
*Pushes buffer contents to disk ifWriteMode is BUFFER_FLUSH_WRITE.
616+
*Otherwise, marks contents as dirty.
616617
*
617618
* Assume that buffer is pinned. Assume that reln is
618619
*valid.
@@ -628,8 +629,8 @@ WriteBuffer(Buffer buffer)
628629
{
629630
BufferDesc*bufHdr;
630631

631-
if (!LateWrite) {
632-
return(FlushBuffer(buffer));
632+
if (WriteMode==BUFFER_FLUSH_WRITE) {
633+
return(FlushBuffer(buffer, TRUE));
633634
}else {
634635

635636
if (BufferIsLocal(buffer))
@@ -712,26 +713,41 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest)
712713
* us).
713714
*/
714715
staticint
715-
FlushBuffer(Bufferbuffer)
716+
FlushBuffer(Bufferbuffer,boolrelease)
716717
{
717718
BufferDesc*bufHdr;
719+
Oidbufdb;
720+
Relationbufrel;
721+
intstatus;
718722

719723
if (BufferIsLocal(buffer))
720-
returnFlushLocalBuffer(buffer);
724+
returnFlushLocalBuffer(buffer,release);
721725

722726
if (BAD_BUFFER_ID(buffer))
723727
return (STATUS_ERROR);
724728

725729
bufHdr=&BufferDescriptors[buffer-1];
730+
bufdb=bufHdr->tag.relId.dbId;
726731

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);
729744
return (STATUS_ERROR);
730745
}
731746

732747
SpinAcquire(BufMgrLock);
733748
bufHdr->flags &= ~BM_DIRTY;
734-
UnpinBuffer(bufHdr);
749+
if (release )
750+
UnpinBuffer(bufHdr);
735751
SpinRelease(BufMgrLock);
736752

737753
return(STATUS_OK);
@@ -750,8 +766,8 @@ WriteNoReleaseBuffer(Buffer buffer)
750766
{
751767
BufferDesc*bufHdr;
752768

753-
if (!LateWrite) {
754-
return(FlushBuffer(buffer));
769+
if (WriteMode==BUFFER_FLUSH_WRITE) {
770+
return(FlushBuffer(buffer, FALSE));
755771
}else {
756772

757773
if (BufferIsLocal(buffer))
@@ -899,7 +915,11 @@ BufferSync()
899915
elog(WARN,"cannot write %u for %s",
900916
bufHdr->tag.blockNum,bufHdr->sb_relname);
901917
}
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+
*/
903923
bufHdr->flags &= ~BM_DIRTY;
904924
if (reln!= (Relation)NULL)
905925
RelationDecrementReferenceCount(reln);
@@ -1145,7 +1165,6 @@ BufferGetRelation(Buffer buffer)
11451165
*
11461166
* Flush the buffer corresponding to 'bufHdr'
11471167
*
1148-
* Assumes that the BufMgrLock has NOT been acquired.
11491168
*/
11501169
staticint
11511170
BufferReplace(BufferDesc*bufHdr,boolbufferLockHeld)
@@ -1655,3 +1674,11 @@ BufferRefCountRestore(int *refcountsave)
16551674
}
16561675
}
16571676

1677+
intSetBufferWriteMode (intmode)
1678+
{
1679+
intold;
1680+
1681+
old=WriteMode;
1682+
WriteMode=mode;
1683+
return (old);
1684+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp