aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/heap/hio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/heap/hio.c')
-rw-r--r--src/backend/access/heap/hio.c43
1 files changed, 15 insertions, 28 deletions
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c
index 9181a7984d7..04725b4a7b4 100644
--- a/src/backend/access/heap/hio.c
+++ b/src/backend/access/heap/hio.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Id: hio.c,v 1.32 2000/07/03 02:54:15 vadim Exp $
+ * $Id: hio.c,v 1.33 2000/09/07 09:58:35 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -67,16 +67,19 @@ RelationPutHeapTuple(Relation relation,
/*
* RelationGetBufferForTuple
*
- * Returns (locked) buffer to add tuple with given len.
- * If Ubuf is valid then no attempt to lock it should be made -
- * this is for heap_update...
+ * Returns (locked) buffer with free space >= given len.
+ *
+ * Note that we use LockPage to lock relation for extension. We can
+ * do this as long as in all other places we use page-level locking
+ * for indices only. Alternatively, we could define pseudo-table as
+ * we do for transactions with XactLockTable.
*
* ELOG(ERROR) is allowed here, so this routine *must* be called
* before any (unlogged) changes are made in buffer pool.
*
*/
Buffer
-RelationGetBufferForTuple(Relation relation, Size len, Buffer Ubuf)
+RelationGetBufferForTuple(Relation relation, Size len)
{
Buffer buffer;
Page pageHeader;
@@ -91,12 +94,6 @@ RelationGetBufferForTuple(Relation relation, Size len, Buffer Ubuf)
elog(ERROR, "Tuple is too big: size %u, max size %ld",
len, MaxTupleSize);
- /*
- * Lock relation for extension. We can use LockPage here as long as in
- * all other places we use page-level locking for indices only.
- * Alternatively, we could define pseudo-table as we do for
- * transactions with XactLockTable.
- */
if (!relation->rd_myxactonly)
LockPage(relation, 0, ExclusiveLock);
@@ -114,31 +111,29 @@ RelationGetBufferForTuple(Relation relation, Size len, Buffer Ubuf)
*/
if (lastblock == 0)
{
- /* what exactly is this all about??? */
- buffer = ReadBuffer(relation, lastblock);
+ buffer = ReadBuffer(relation, P_NEW);
+ LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
pageHeader = (Page) BufferGetPage(buffer);
Assert(PageIsNew((PageHeader) pageHeader));
- buffer = ReleaseAndReadBuffer(buffer, relation, P_NEW);
- pageHeader = (Page) BufferGetPage(buffer);
PageInit(pageHeader, BufferGetPageSize(buffer), 0);
}
else
+ {
buffer = ReadBuffer(relation, lastblock - 1);
-
- if (buffer != Ubuf)
LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
- pageHeader = (Page) BufferGetPage(buffer);
+ pageHeader = (Page) BufferGetPage(buffer);
+ }
/*
* Is there room on the last existing page?
*/
if (len > PageGetFreeSpace(pageHeader))
{
- if (buffer != Ubuf)
- LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
+ LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
buffer = ReleaseAndReadBuffer(buffer, relation, P_NEW);
LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
pageHeader = (Page) BufferGetPage(buffer);
+ Assert(PageIsNew((PageHeader) pageHeader));
PageInit(pageHeader, BufferGetPageSize(buffer), 0);
if (len > PageGetFreeSpace(pageHeader))
@@ -147,14 +142,6 @@ RelationGetBufferForTuple(Relation relation, Size len, Buffer Ubuf)
elog(STOP, "Tuple is too big: size %u", len);
}
}
- /*
- * Caller should check space in Ubuf but...
- */
- else if (buffer == Ubuf)
- {
- ReleaseBuffer(buffer);
- buffer = Ubuf;
- }
if (!relation->rd_myxactonly)
UnlockPage(relation, 0, ExclusiveLock);