aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/buf_table.c
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>2003-11-13 14:57:15 +0000
committerJan Wieck <JanWieck@Yahoo.com>2003-11-13 14:57:15 +0000
commit6b86d62b00f150766e1899c98e964b6611c00ee5 (patch)
treec1baa6c01a358bbea29153682249bb038bd10242 /src/backend/storage/buffer/buf_table.c
parent923e994d7901d7c0268725e219002af3b2d40dfc (diff)
downloadpostgresql-6b86d62b00f150766e1899c98e964b6611c00ee5.tar.gz
postgresql-6b86d62b00f150766e1899c98e964b6611c00ee5.zip
2nd try for the ARC strategy.
I added a couple more Assertions while tracking down the exact cause of the former bug. All 93 regression tests pass now. Jan
Diffstat (limited to 'src/backend/storage/buffer/buf_table.c')
-rw-r--r--src/backend/storage/buffer/buf_table.c68
1 files changed, 26 insertions, 42 deletions
diff --git a/src/backend/storage/buffer/buf_table.c b/src/backend/storage/buffer/buf_table.c
index 95db86c5348..7a0f956c6de 100644
--- a/src/backend/storage/buffer/buf_table.c
+++ b/src/backend/storage/buffer/buf_table.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/buf_table.c,v 1.31 2003/11/13 05:34:58 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/buf_table.c,v 1.32 2003/11/13 14:57:15 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -38,7 +38,7 @@ static HTAB *SharedBufHash;
* Initialize shmem hash table for mapping buffers
*/
void
-InitBufTable(void)
+InitBufTable(int size)
{
HASHCTL info;
@@ -50,7 +50,7 @@ InitBufTable(void)
info.hash = tag_hash;
SharedBufHash = ShmemInitHash("Shared Buffer Lookup Table",
- NBuffers, NBuffers,
+ size, size,
&info,
HASH_ELEM | HASH_FUNCTION);
@@ -58,79 +58,63 @@ InitBufTable(void)
elog(FATAL, "could not initialize shared buffer hash table");
}
-BufferDesc *
+/*
+ * BufTableLookup
+ */
+int
BufTableLookup(BufferTag *tagPtr)
{
BufferLookupEnt *result;
if (tagPtr->blockNum == P_NEW)
- return NULL;
+ return -1;
result = (BufferLookupEnt *)
hash_search(SharedBufHash, (void *) tagPtr, HASH_FIND, NULL);
if (!result)
- return NULL;
+ return -1;
- return &(BufferDescriptors[result->id]);
+ return result->id;
}
/*
* BufTableDelete
*/
bool
-BufTableDelete(BufferDesc *buf)
+BufTableInsert(BufferTag *tagPtr, Buffer buf_id)
{
BufferLookupEnt *result;
-
- /*
- * buffer not initialized or has been removed from table already.
- * BM_DELETED keeps us from removing buffer twice.
- */
- if (buf->flags & BM_DELETED)
- return TRUE;
-
- buf->flags |= BM_DELETED;
+ bool found;
result = (BufferLookupEnt *)
- hash_search(SharedBufHash, (void *) &(buf->tag), HASH_REMOVE, NULL);
+ hash_search(SharedBufHash, (void *) tagPtr, HASH_ENTER, &found);
- if (!result) /* shouldn't happen */
- elog(ERROR, "shared buffer hash table corrupted");
+ if (!result)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of shared memory")));
- /*
- * Clear the buffer's tag. This doesn't matter for the hash table,
- * since the buffer is already removed from it, but it ensures that
- * sequential searches through the buffer table won't think the buffer
- * is still valid for its old page.
- */
- buf->tag.rnode.relNode = InvalidOid;
- buf->tag.rnode.tblNode = InvalidOid;
+ if (found) /* found something else in the table? */
+ elog(ERROR, "shared buffer hash table corrupted");
+ result->id = buf_id;
return TRUE;
}
+/*
+ * BufTableDelete
+ */
bool
-BufTableInsert(BufferDesc *buf)
+BufTableDelete(BufferTag *tagPtr)
{
BufferLookupEnt *result;
- bool found;
-
- /* cannot insert it twice */
- Assert(buf->flags & BM_DELETED);
- buf->flags &= ~(BM_DELETED);
result = (BufferLookupEnt *)
- hash_search(SharedBufHash, (void *) &(buf->tag), HASH_ENTER, &found);
-
- if (!result)
- ereport(ERROR,
- (errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("out of shared memory")));
+ hash_search(SharedBufHash, (void *) tagPtr, HASH_REMOVE, NULL);
- if (found) /* found something else in the table? */
+ if (!result) /* shouldn't happen */
elog(ERROR, "shared buffer hash table corrupted");
- result->id = buf->buf_id;
return TRUE;
}