aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/bufmgr.c
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>2000-10-23 04:10:24 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>2000-10-23 04:10:24 +0000
commit4b65a2840b124b881ce4f260f9cc35927863b2ae (patch)
tree0b4f2cb3b57ca6246d450984401d72a9eabebc62 /src/backend/storage/buffer/bufmgr.c
parentc82c9559a771f58dc42ce93f227cccd368eb46e6 (diff)
downloadpostgresql-4b65a2840b124b881ce4f260f9cc35927863b2ae.tar.gz
postgresql-4b65a2840b124b881ce4f260f9cc35927863b2ae.zip
New relcache hash table with RelFileNode as key to be used
from bufmgr - it would be nice to have separate hash in smgr for node <--> fd mappings, but for the moment it's easy to add new hash to relcache. Fixed small bug in xlog.c:ReadRecord.
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r--src/backend/storage/buffer/bufmgr.c66
1 files changed, 12 insertions, 54 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 9161c485296..c0a320986ce 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.90 2000/10/22 20:20:49 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.91 2000/10/23 04:10:06 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -54,6 +54,10 @@
#include "storage/smgr.h"
#include "utils/relcache.h"
+#ifdef XLOG
+#include "catalog/pg_database.h"
+#endif
+
extern SPINLOCK BufMgrLock;
extern long int ReadBufferCount;
extern long int ReadLocalBufferCount;
@@ -611,7 +615,6 @@ BufferAlloc(Relation reln,
/* record the database name and relation name for this buffer */
strcpy(buf->blind.dbname, (DatabaseName) ? DatabaseName : "Recovery");
strcpy(buf->blind.relname, RelationGetPhysicalRelationName(reln));
- buf->relId = reln->rd_lockInfo.lockRelId;
INIT_BUFFERTAG(&(buf->tag), reln, blockNum);
if (!BufTableInsert(buf))
@@ -711,7 +714,6 @@ int
FlushBuffer(Buffer buffer, bool release)
{
BufferDesc *bufHdr;
- Oid bufdb;
Relation bufrel;
int status;
@@ -725,10 +727,7 @@ FlushBuffer(Buffer buffer, bool release)
bufHdr = &BufferDescriptors[buffer - 1];
- bufdb = bufHdr->relId.dbId;
-
- Assert(bufdb == MyDatabaseId || bufdb == (Oid) NULL);
- bufrel = RelationIdCacheGetRelation(bufHdr->relId.relId);
+ bufrel = RelationNodeCacheGetRelation(bufHdr->tag.rnode);
Assert(bufrel != (Relation) NULL);
@@ -904,7 +903,7 @@ SetBufferDirtiedByMe(Buffer buffer, BufferDesc *bufHdr)
SpinRelease(BufMgrLock);
#endif /* OPTIMIZE_SINGLE */
- reln = RelationIdCacheGetRelation(BufferRelidLastDirtied[buffer - 1].relId);
+ reln = RelationNodeCacheGetRelation(tagLastDirtied->rnode);
if (reln == (Relation) NULL)
{
@@ -938,7 +937,6 @@ SetBufferDirtiedByMe(Buffer buffer, BufferDesc *bufHdr)
}
*tagLastDirtied = bufHdr->tag;
- BufferRelidLastDirtied[buffer - 1] = bufHdr->relId;
BufferBlindLastDirtied[buffer - 1] = bufHdr->blind;
BufferDirtiedByMe[buffer - 1] = true;
}
@@ -1010,15 +1008,14 @@ BufferSync()
if (RelFileNodeEquals(bufHdr->tag.rnode, BufferTagLastDirtied[i].rnode) &&
bufHdr->tag.blockNum == BufferTagLastDirtied[i].blockNum)
{
- Oid bufrel = bufHdr->relId.relId;
-
/*
* Try to find relation for buf. This could fail, if the
* rel has been flushed from the relcache since we dirtied
* the page. That should be uncommon, so paying the extra
* cost of a blind write when it happens seems OK.
*/
- reln = RelationIdCacheGetRelation(bufrel);
+ if (!InRecovery)
+ reln = RelationNodeCacheGetRelation(bufHdr->tag.rnode);
/*
* We have to pin buffer to keep anyone from stealing it
@@ -1083,8 +1080,6 @@ BufferSync()
}
else
{
- Assert(RelFileNodeEquals(reln->rd_node,
- BufferTagLastDirtied[i].rnode));
status = smgrwrite(DEFAULT_SMGR, reln,
bufHdr->tag.blockNum,
(char *) MAKE_PTR(bufHdr->data));
@@ -1138,7 +1133,7 @@ BufferSync()
SpinRelease(BufMgrLock);
#endif /* OPTIMIZE_SINGLE */
- reln = RelationIdCacheGetRelation(BufferRelidLastDirtied[i].relId);
+ reln = RelationNodeCacheGetRelation(BufferTagLastDirtied[i].rnode);
if (reln == (Relation) NULL)
{
status = smgrblindmarkdirty(DEFAULT_SMGR,
@@ -1147,8 +1142,6 @@ BufferSync()
}
else
{
- Assert(RelFileNodeEquals(reln->rd_node,
- BufferTagLastDirtied[i].rnode));
status = smgrmarkdirty(DEFAULT_SMGR, reln,
BufferTagLastDirtied[i].blockNum);
@@ -1420,21 +1413,14 @@ static int
BufferReplace(BufferDesc *bufHdr)
{
Relation reln;
- Oid bufdb,
- bufrel;
int status;
/*
* first try to find the reldesc in the cache, if no luck, don't
* bother to build the reldesc from scratch, just do a blind write.
*/
- bufdb = bufHdr->relId.dbId;
- bufrel = bufHdr->relId.relId;
- if (bufdb == MyDatabaseId || bufdb == (Oid) NULL)
- reln = RelationIdCacheGetRelation(bufrel);
- else
- reln = (Relation) NULL;
+ reln = RelationNodeCacheGetRelation(bufHdr->tag.rnode);
/* To check if block content changed while flushing. - vadim 01/17/97 */
bufHdr->flags &= ~BM_JUST_DIRTIED;
@@ -1450,7 +1436,6 @@ BufferReplace(BufferDesc *bufHdr)
if (reln != (Relation) NULL)
{
- Assert(RelFileNodeEquals(bufHdr->tag.rnode, reln->rd_node));
status = smgrwrite(DEFAULT_SMGR, reln, bufHdr->tag.blockNum,
(char *) MAKE_PTR(bufHdr->data));
}
@@ -1519,7 +1504,6 @@ RelationGetNumberOfBlocks(Relation relation)
void
ReleaseRelationBuffers(Relation rel)
{
- Oid relid = RelationGetRelid(rel);
int i;
BufferDesc *bufHdr;
@@ -1534,10 +1518,6 @@ ReleaseRelationBuffers(Relation rel)
LocalRefCount[i] = 0;
bufHdr->tag.rnode.relNode = InvalidOid;
}
- else
- {
- Assert(bufHdr->relId.relId != relid);
- }
}
return;
}
@@ -1590,12 +1570,6 @@ recheck:
*/
BufTableDelete(bufHdr);
}
- else
- {
- Assert(bufHdr->relId.relId != relid ||
- (bufHdr->relId.dbId != MyDatabaseId &&
- bufHdr->relId.dbId != InvalidOid));
- }
/*
* Also check to see if BufferDirtiedByMe info for this buffer
@@ -1608,7 +1582,7 @@ recheck:
* this rel, since we hold exclusive lock on this rel.
*/
if (RelFileNodeEquals(rel->rd_node,
- BufferTagLastDirtied[i - 1].rnode))
+ BufferTagLastDirtied[i - 1].rnode))
BufferDirtiedByMe[i - 1] = false;
}
@@ -1673,11 +1647,6 @@ recheck:
*/
BufTableDelete(bufHdr);
}
- else
- {
- Assert(bufHdr->relId.dbId != dbid);
- }
-
/*
* Also check to see if BufferDirtiedByMe info for this buffer
* refers to the target database, and clear it if so. This is
@@ -1824,7 +1793,6 @@ BufferPoolBlowaway()
int
FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
{
- Oid relid = RelationGetRelid(rel);
int i;
BufferDesc *bufHdr;
@@ -1857,10 +1825,6 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
bufHdr->tag.rnode.relNode = InvalidOid;
}
}
- else
- {
- Assert(bufHdr->relId.relId != relid);
- }
}
return 0;
}
@@ -1906,12 +1870,6 @@ recheck:
BufTableDelete(bufHdr);
}
}
- else
- {
- Assert(bufHdr->relId.relId != relid ||
- (bufHdr->relId.dbId != MyDatabaseId &&
- bufHdr->relId.dbId != InvalidOid));
- }
}
SpinRelease(BufMgrLock);
return 0;