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

Commitbb203c7

Browse files
committed
Come to think of it, DropBuffers() could have the same problem as
ReleaseRelationBuffers --- need to wait if anyone is trying to flushout that buffer.
1 parent6b5d8e1 commitbb203c7

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

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

Lines changed: 28 additions & 7 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.67 1999/11/2201:19:42 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.68 1999/11/2202:03:21 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -831,7 +831,7 @@ FlushBuffer(Buffer buffer, bool release)
831831
*/
832832
if (bufHdr->flags&BM_JUST_DIRTIED)
833833
{
834-
elog(NOTICE,"FlusfBuffer: content of block %u (%s) changed while flushing",
834+
elog(NOTICE,"FlushBuffer: content of block %u (%s) changed while flushing",
835835
bufHdr->tag.blockNum,bufHdr->sb_relname);
836836
}
837837
else
@@ -1476,9 +1476,8 @@ ReleaseRelationBuffers(Relation rel)
14761476
*This function marks all the buffers in the buffer cache for a
14771477
*particular database as clean. This is used when we destroy a
14781478
*database, to avoid trying to flush data to disk when the directory
1479-
*tree no longer exists.
1480-
*
1481-
*This is an exceedingly non-public interface.
1479+
*tree no longer exists. Implementation is pretty similar to
1480+
*ReleaseRelationBuffers() which is for destroying just one relation.
14821481
* --------------------------------------------------------------------
14831482
*/
14841483
void
@@ -1491,8 +1490,30 @@ DropBuffers(Oid dbid)
14911490
for (i=1;i <=NBuffers;i++)
14921491
{
14931492
buf=&BufferDescriptors[i-1];
1494-
if ((buf->tag.relId.dbId==dbid)&& (buf->flags&BM_DIRTY))
1495-
buf->flags &= ~BM_DIRTY;
1493+
recheck:
1494+
if (buf->tag.relId.dbId==dbid)
1495+
{
1496+
/*
1497+
* If there is I/O in progress, better wait till it's done;
1498+
* don't want to delete the database out from under someone
1499+
* who's just trying to flush the buffer!
1500+
*/
1501+
if (buf->flags&BM_IO_IN_PROGRESS)
1502+
{
1503+
WaitIO(buf,BufMgrLock);
1504+
/* By now, the buffer very possibly belongs to some other
1505+
* DB, so check again before proceeding.
1506+
*/
1507+
gotorecheck;
1508+
}
1509+
/* Now we can do what we came for */
1510+
buf->flags &= ~ (BM_DIRTY |BM_JUST_DIRTIED);
1511+
/*
1512+
* The thing should be free, if caller has checked that
1513+
* no backends are running in that database.
1514+
*/
1515+
Assert(buf->flags&BM_FREE);
1516+
}
14961517
}
14971518
SpinRelease(BufMgrLock);
14981519
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp