diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-11-17 17:42:02 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-11-17 17:42:02 +0000 |
commit | c859308aba7edef428994e6de90ff35f35a328c5 (patch) | |
tree | 14940f255a6c69d44a41f1211d6c8787524abd5e /src/backend/storage/buffer/bufmgr.c | |
parent | 84bb3876bc6efad2c6b36198d6562797af6b0549 (diff) | |
download | postgresql-c859308aba7edef428994e6de90ff35f35a328c5.tar.gz postgresql-c859308aba7edef428994e6de90ff35f35a328c5.zip |
DropRelFileNodeBuffers failed to fix the state of the lookup hash table
that was added to localbuf.c in 8.1; therefore, applying it to a temp table
left corrupt lookup state in memory. The only case where this had a
significant chance of causing problems was an ON COMMIT DELETE ROWS temp
table; the other possible paths left bogus state that was unlikely to
be used again. Per report from Csaba Nagy.
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 25 |
1 files changed, 4 insertions, 21 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 4d2c869860f..b7331f9abe6 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.198 2005/10/27 17:07:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.199 2005/11/17 17:42:02 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1384,34 +1384,17 @@ DropRelFileNodeBuffers(RelFileNode rnode, bool istemp, BlockNumber firstDelBlock) { int i; - volatile BufferDesc *bufHdr; if (istemp) { - for (i = 0; i < NLocBuffer; i++) - { - bufHdr = &LocalBufferDescriptors[i]; - if (RelFileNodeEquals(bufHdr->tag.rnode, rnode) && - bufHdr->tag.blockNum >= firstDelBlock) - { - if (LocalRefCount[i] != 0) - elog(ERROR, "block %u of %u/%u/%u is still referenced (local %u)", - bufHdr->tag.blockNum, - bufHdr->tag.rnode.spcNode, - bufHdr->tag.rnode.dbNode, - bufHdr->tag.rnode.relNode, - LocalRefCount[i]); - CLEAR_BUFFERTAG(bufHdr->tag); - bufHdr->flags = 0; - bufHdr->usage_count = 0; - } - } + DropRelFileNodeLocalBuffers(rnode, firstDelBlock); return; } for (i = 0; i < NBuffers; i++) { - bufHdr = &BufferDescriptors[i]; + volatile BufferDesc *bufHdr = &BufferDescriptors[i]; + LockBufHdr(bufHdr); if (RelFileNodeEquals(bufHdr->tag.rnode, rnode) && bufHdr->tag.blockNum >= firstDelBlock) |