aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gist
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/gist')
-rw-r--r--src/backend/access/gist/gist.c78
-rw-r--r--src/backend/access/gist/gistvacuum.c47
-rw-r--r--src/backend/access/gist/gistxlog.c28
3 files changed, 71 insertions, 82 deletions
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index d997db37efb..93ec60481f8 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.130 2006/03/30 23:03:09 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.131 2006/03/31 23:32:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -111,6 +111,9 @@ gistbuild(PG_FUNCTION_ARGS)
START_CRIT_SECTION();
GISTInitBuffer(buffer, F_LEAF);
+
+ MarkBufferDirty(buffer);
+
if (!index->rd_istemp)
{
XLogRecPtr recptr;
@@ -127,8 +130,8 @@ gistbuild(PG_FUNCTION_ARGS)
}
else
PageSetLSN(page, XLogRecPtrForTemp);
- LockBuffer(buffer, GIST_UNLOCK);
- WriteBuffer(buffer);
+
+ UnlockReleaseBuffer(buffer);
END_CRIT_SECTION();
@@ -345,6 +348,15 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
itvec = gistjoinvector(itvec, &tlen, state->itup, state->ituplen);
newitup = gistSplit(state->r, state->stack->buffer, itvec, &tlen, &dist, giststate);
+ /*
+ * must mark buffers dirty before XLogInsert, even though we'll
+ * still be changing their opaque fields below
+ */
+ for (ptr = dist; ptr; ptr = ptr->next)
+ {
+ MarkBufferDirty(ptr->buffer);
+ }
+
if (!state->r->rd_istemp)
{
XLogRecPtr recptr;
@@ -354,21 +366,17 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
is_leaf, &(state->key), dist);
recptr = XLogInsert(RM_GIST_ID, XLOG_GIST_PAGE_SPLIT, rdata);
- ptr = dist;
- while (ptr)
+ for (ptr = dist; ptr; ptr = ptr->next)
{
PageSetLSN(BufferGetPage(ptr->buffer), recptr);
PageSetTLI(BufferGetPage(ptr->buffer), ThisTimeLineID);
- ptr = ptr->next;
}
}
else
{
- ptr = dist;
- while (ptr)
+ for (ptr = dist; ptr; ptr = ptr->next)
{
PageSetLSN(BufferGetPage(ptr->buffer), XLogRecPtrForTemp);
- ptr = ptr->next;
}
}
@@ -379,17 +387,14 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
{
gistnewroot(state->r, state->stack->buffer, state->itup, state->ituplen, &(state->key));
state->needInsertComplete = false;
- ptr = dist;
- while (ptr)
+ for (ptr = dist; ptr; ptr = ptr->next)
{
Page page = (Page) BufferGetPage(ptr->buffer);
GistPageGetOpaque(page)->rightlink = (ptr->next) ?
ptr->next->block.blkno : InvalidBlockNumber;
GistPageGetOpaque(page)->nsn = PageGetLSN(page);
- LockBuffer(ptr->buffer, GIST_UNLOCK);
- WriteBuffer(ptr->buffer);
- ptr = ptr->next;
+ UnlockReleaseBuffer(ptr->buffer);
}
}
else
@@ -430,11 +435,9 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
opaque->rightlink = ourpage->next->block.blkno;
/*
- * fills and write all new pages. They isn't linked into tree yet
+ * fill and release all new pages. They isn't linked into tree yet
*/
-
- ptr = ourpage->next;
- while (ptr)
+ for (ptr = ourpage->next; ptr; ptr = ptr->next)
{
page = (Page) BufferGetPage(ptr->buffer);
GistPageGetOpaque(page)->rightlink = (ptr->next) ?
@@ -443,12 +446,8 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
GistPageGetOpaque(page)->nsn = (ptr->next) ?
opaque->nsn : oldnsn;
- LockBuffer(ptr->buffer, GIST_UNLOCK);
- WriteBuffer(ptr->buffer);
- ptr = ptr->next;
+ UnlockReleaseBuffer(ptr->buffer);
}
-
- WriteNoReleaseBuffer(state->stack->buffer);
}
END_CRIT_SECTION();
@@ -460,6 +459,8 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
gistfillbuffer(state->r, state->stack->page, state->itup, state->ituplen, InvalidOffsetNumber);
+ MarkBufferDirty(state->stack->buffer);
+
oldlsn = PageGetLSN(state->stack->page);
if (!state->r->rd_istemp)
{
@@ -489,7 +490,6 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
if (state->stack->blkno == GIST_ROOT_BLKNO)
state->needInsertComplete = false;
- WriteNoReleaseBuffer(state->stack->buffer);
END_CRIT_SECTION();
@@ -561,8 +561,7 @@ gistfindleaf(GISTInsertState *state, GISTSTATE *giststate)
* caused split non-root page is detected, go up to parent to
* choose best child
*/
- LockBuffer(state->stack->buffer, GIST_UNLOCK);
- ReleaseBuffer(state->stack->buffer);
+ UnlockReleaseBuffer(state->stack->buffer);
state->stack = state->stack->parent;
continue;
}
@@ -630,8 +629,7 @@ gistfindleaf(GISTInsertState *state, GISTSTATE *giststate)
*/
/* forget buffer */
- LockBuffer(state->stack->buffer, GIST_UNLOCK);
- ReleaseBuffer(state->stack->buffer);
+ UnlockReleaseBuffer(state->stack->buffer);
state->stack = state->stack->parent;
continue;
@@ -681,8 +679,7 @@ gistFindPath(Relation r, BlockNumber child)
if (GistPageIsLeaf(page))
{
/* we can safety go away, follows only leaf pages */
- LockBuffer(buffer, GIST_UNLOCK);
- ReleaseBuffer(buffer);
+ UnlockReleaseBuffer(buffer);
return NULL;
}
@@ -735,8 +732,7 @@ gistFindPath(Relation r, BlockNumber child)
ptr = ptr->parent;
}
top->childoffnum = i;
- LockBuffer(buffer, GIST_UNLOCK);
- ReleaseBuffer(buffer);
+ UnlockReleaseBuffer(buffer);
return top;
}
else
@@ -753,8 +749,7 @@ gistFindPath(Relation r, BlockNumber child)
}
}
- LockBuffer(buffer, GIST_UNLOCK);
- ReleaseBuffer(buffer);
+ UnlockReleaseBuffer(buffer);
top = top->next;
}
@@ -801,8 +796,7 @@ gistFindCorrectParent(Relation r, GISTInsertStack *child)
}
parent->blkno = GistPageGetOpaque(parent->page)->rightlink;
- LockBuffer(parent->buffer, GIST_UNLOCK);
- ReleaseBuffer(parent->buffer);
+ UnlockReleaseBuffer(parent->buffer);
if (parent->blkno == InvalidBlockNumber)
/*
@@ -881,8 +875,7 @@ gistmakedeal(GISTInsertState *state, GISTSTATE *giststate)
is_splitted = gistplacetopage(state, giststate);
/* parent locked above, so release child buffer */
- LockBuffer(state->stack->buffer, GIST_UNLOCK);
- ReleaseBuffer(state->stack->buffer);
+ UnlockReleaseBuffer(state->stack->buffer);
/* pop parent page from stack */
state->stack = state->stack->parent;
@@ -1182,6 +1175,9 @@ gistSplit(Relation r,
return newtup;
}
+/*
+ * buffer must be pinned and locked by caller
+ */
void
gistnewroot(Relation r, Buffer buffer, IndexTuple *itup, int len, ItemPointer key)
{
@@ -1192,9 +1188,11 @@ gistnewroot(Relation r, Buffer buffer, IndexTuple *itup, int len, ItemPointer ke
START_CRIT_SECTION();
- GISTInitBuffer(buffer, 0); /* XXX not F_LEAF? */
+ GISTInitBuffer(buffer, 0);
gistfillbuffer(r, page, itup, len, FirstOffsetNumber);
+ MarkBufferDirty(buffer);
+
if (!r->rd_istemp)
{
XLogRecPtr recptr;
@@ -1211,8 +1209,6 @@ gistnewroot(Relation r, Buffer buffer, IndexTuple *itup, int len, ItemPointer ke
else
PageSetLSN(page, XLogRecPtrForTemp);
- WriteNoReleaseBuffer(buffer);
-
END_CRIT_SECTION();
}
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index e7925c2c151..285f1301321 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.17 2006/03/30 23:03:10 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.18 2006/03/31 23:32:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -71,11 +71,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
vacuum_delay_point();
buffer = ReadBuffer(gv->index, blkno);
-
- /*
- * This is only used during VACUUM FULL, so we need not bother to lock
- * individual index pages
- */
+ LockBuffer(buffer, GIST_EXCLUSIVE);
gistcheckpage(gv->index, buffer);
page = (Page) BufferGetPage(buffer);
maxoff = PageGetMaxOffsetNumber(page);
@@ -183,6 +179,11 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
}
res.itup = vec;
+ for (ptr = dist; ptr; ptr = ptr->next)
+ {
+ MarkBufferDirty(ptr->buffer);
+ }
+
if (!gv->index->rd_istemp)
{
XLogRecPtr recptr;
@@ -198,12 +199,10 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
xlinfo = rdata->data;
recptr = XLogInsert(RM_GIST_ID, XLOG_GIST_PAGE_SPLIT, rdata);
- ptr = dist;
- while (ptr)
+ for (ptr = dist; ptr; ptr = ptr->next)
{
PageSetLSN(BufferGetPage(ptr->buffer), recptr);
PageSetTLI(BufferGetPage(ptr->buffer), ThisTimeLineID);
- ptr = ptr->next;
}
pfree(xlinfo);
@@ -211,21 +210,18 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
}
else
{
- ptr = dist;
- while (ptr)
+ for (ptr = dist; ptr; ptr = ptr->next)
{
PageSetLSN(BufferGetPage(ptr->buffer), XLogRecPtrForTemp);
- ptr = ptr->next;
}
}
- ptr = dist;
- while (ptr)
+ for (ptr = dist; ptr; ptr = ptr->next)
{
+ /* we must keep the buffer lock on the head page */
if (BufferGetBlockNumber(ptr->buffer) != blkno)
LockBuffer(ptr->buffer, GIST_UNLOCK);
- WriteBuffer(ptr->buffer);
- ptr = ptr->next;
+ ReleaseBuffer(ptr->buffer);
}
if (blkno == GIST_ROOT_BLKNO)
@@ -297,6 +293,8 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
if (needwrite)
{
+ MarkBufferDirty(buffer);
+
if (!gv->index->rd_istemp)
{
XLogRecData *rdata;
@@ -317,13 +315,12 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
}
else
PageSetLSN(page, XLogRecPtrForTemp);
- WriteBuffer(buffer);
}
- else
- ReleaseBuffer(buffer);
END_CRIT_SECTION();
+ UnlockReleaseBuffer(buffer);
+
if (ncompleted && !gv->index->rd_istemp)
gistxlogInsertCompletion(gv->index->rd_node, completed, ncompleted);
@@ -429,8 +426,7 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
}
else
lastFilledBlock = blkno;
- LockBuffer(buffer, GIST_UNLOCK);
- ReleaseBuffer(buffer);
+ UnlockReleaseBuffer(buffer);
}
lastBlock = npages - 1;
@@ -569,8 +565,7 @@ gistbulkdelete(PG_FUNCTION_ARGS)
if (stack->blkno == GIST_ROOT_BLKNO && !GistPageIsLeaf(page))
{
/* only the root can become non-leaf during relock */
- LockBuffer(buffer, GIST_UNLOCK);
- ReleaseBuffer(buffer);
+ UnlockReleaseBuffer(buffer);
/* one more check */
continue;
}
@@ -617,6 +612,8 @@ gistbulkdelete(PG_FUNCTION_ARGS)
{
GistMarkTuplesDeleted(page);
+ MarkBufferDirty(buffer);
+
if (!rel->rd_istemp)
{
XLogRecData *rdata;
@@ -638,7 +635,6 @@ gistbulkdelete(PG_FUNCTION_ARGS)
}
else
PageSetLSN(page, XLogRecPtrForTemp);
- WriteNoReleaseBuffer(buffer);
}
END_CRIT_SECTION();
@@ -666,8 +662,7 @@ gistbulkdelete(PG_FUNCTION_ARGS)
}
}
- LockBuffer(buffer, GIST_UNLOCK);
- ReleaseBuffer(buffer);
+ UnlockReleaseBuffer(buffer);
ptr = stack->next;
pfree(stack);
diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c
index 12a521c75c9..fbceae29a96 100644
--- a/src/backend/access/gist/gistxlog.c
+++ b/src/backend/access/gist/gistxlog.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.13 2006/03/30 23:03:10 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.14 2006/03/31 23:32:05 tgl Exp $
*-------------------------------------------------------------------------
*/
#include "postgres.h"
@@ -192,8 +192,7 @@ gistRedoPageUpdateRecord(XLogRecPtr lsn, XLogRecord *record, bool isnewroot)
if (XLByteLE(lsn, PageGetLSN(page)))
{
- LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
- ReleaseBuffer(buffer);
+ UnlockReleaseBuffer(buffer);
return;
}
@@ -236,8 +235,8 @@ gistRedoPageUpdateRecord(XLogRecPtr lsn, XLogRecord *record, bool isnewroot)
GistPageGetOpaque(page)->rightlink = InvalidBlockNumber;
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
- LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
- WriteBuffer(buffer);
+ MarkBufferDirty(buffer);
+ UnlockReleaseBuffer(buffer);
if (ItemPointerIsValid(&(xlrec.data->key)))
{
@@ -313,8 +312,8 @@ gistRedoPageSplitRecord(XLogRecPtr lsn, XLogRecord *record)
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
- LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
- WriteBuffer(buffer);
+ MarkBufferDirty(buffer);
+ UnlockReleaseBuffer(buffer);
}
if (ItemPointerIsValid(&(xlrec.data->key)))
@@ -346,8 +345,8 @@ gistRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record)
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
- LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
- WriteBuffer(buffer);
+ MarkBufferDirty(buffer);
+ UnlockReleaseBuffer(buffer);
}
static void
@@ -561,8 +560,8 @@ gistContinueInsert(gistIncompleteInsert *insert)
PageSetLSN(page, insert->lsn);
PageSetTLI(page, ThisTimeLineID);
- LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
- WriteBuffer(buffer);
+ MarkBufferDirty(buffer);
+ UnlockReleaseBuffer(buffer);
/*
* XXX fall out to avoid making LOG message at bottom of routine.
@@ -598,8 +597,7 @@ gistContinueInsert(gistIncompleteInsert *insert)
if (XLByteLE(insert->lsn, PageGetLSN(pages[numbuffer - 1])))
{
- LockBuffer(buffers[numbuffer - 1], BUFFER_LOCK_UNLOCK);
- ReleaseBuffer(buffers[numbuffer - 1]);
+ UnlockReleaseBuffer(buffers[numbuffer - 1]);
return;
}
@@ -685,8 +683,8 @@ gistContinueInsert(gistIncompleteInsert *insert)
PageSetLSN(pages[j], insert->lsn);
PageSetTLI(pages[j], ThisTimeLineID);
GistPageGetOpaque(pages[j])->rightlink = InvalidBlockNumber;
- LockBuffer(buffers[j], BUFFER_LOCK_UNLOCK);
- WriteBuffer(buffers[j]);
+ MarkBufferDirty(buffers[j]);
+ UnlockReleaseBuffer(buffers[j]);
}
}
}