mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Refactor XLogOpenRelation() and XLogReadBuffer() in preparation for relation
forks. XLogOpenRelation() and the associated light-weight relation cache in xlogutils.c is gone, and XLogReadBuffer() now takes a RelFileNode as argument, instead of Relation. For functions that still need a Relation struct during WAL replay, there's a new function called CreateFakeRelcacheEntry() that returns a fake entry like XLogOpenRelation() used to.
This commit is contained in:
@ -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.150 2008/05/12 00:00:44 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.151 2008/06/12 09:12:29 heikki Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -462,7 +462,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
|
||||
|
||||
if (!is_leaf)
|
||||
PageIndexTupleDelete(state->stack->page, state->stack->childoffnum);
|
||||
gistfillbuffer(state->r, state->stack->page, state->itup, state->ituplen, InvalidOffsetNumber);
|
||||
gistfillbuffer(state->stack->page, state->itup, state->ituplen, InvalidOffsetNumber);
|
||||
|
||||
MarkBufferDirty(state->stack->buffer);
|
||||
|
||||
@ -1008,7 +1008,7 @@ gistnewroot(Relation r, Buffer buffer, IndexTuple *itup, int len, ItemPointer ke
|
||||
START_CRIT_SECTION();
|
||||
|
||||
GISTInitBuffer(buffer, 0);
|
||||
gistfillbuffer(r, page, itup, len, FirstOffsetNumber);
|
||||
gistfillbuffer(page, itup, len, FirstOffsetNumber);
|
||||
|
||||
MarkBufferDirty(buffer);
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.26 2008/05/12 00:00:44 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.27 2008/06/12 09:12:29 heikki Exp $
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
@ -27,11 +27,10 @@ static Datum attrS[INDEX_MAX_KEYS];
|
||||
static bool isnullS[INDEX_MAX_KEYS];
|
||||
|
||||
/*
|
||||
* Write itup vector to page, has no control of free space
|
||||
* Write itup vector to page, has no control of free space.
|
||||
*/
|
||||
OffsetNumber
|
||||
gistfillbuffer(Relation r, Page page, IndexTuple *itup,
|
||||
int len, OffsetNumber off)
|
||||
void
|
||||
gistfillbuffer(Page page, IndexTuple *itup, int len, OffsetNumber off)
|
||||
{
|
||||
OffsetNumber l = InvalidOffsetNumber;
|
||||
int i;
|
||||
@ -42,14 +41,13 @@ gistfillbuffer(Relation r, Page page, IndexTuple *itup,
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
l = PageAddItem(page, (Item) itup[i], IndexTupleSize(itup[i]),
|
||||
off, false, false);
|
||||
Size sz = IndexTupleSize(itup[i]);
|
||||
l = PageAddItem(page, (Item) itup[i], sz, off, false, false);
|
||||
if (l == InvalidOffsetNumber)
|
||||
elog(ERROR, "failed to add item to index page in \"%s\"",
|
||||
RelationGetRelationName(r));
|
||||
elog(ERROR, "failed to add item to GiST index page, item %d out of %d, size %d bytes",
|
||||
i, len, sz);
|
||||
off++;
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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.35 2008/05/12 00:00:44 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.36 2008/06/12 09:12:30 heikki Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -403,7 +403,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
|
||||
}
|
||||
else
|
||||
/* enough free space */
|
||||
gistfillbuffer(gv->index, tempPage, addon, curlenaddon, InvalidOffsetNumber);
|
||||
gistfillbuffer(tempPage, addon, curlenaddon, InvalidOffsetNumber);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.28 2008/05/12 00:00:44 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.29 2008/06/12 09:12:30 heikki Exp $
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
@ -189,7 +189,6 @@ gistRedoPageUpdateRecord(XLogRecPtr lsn, XLogRecord *record, bool isnewroot)
|
||||
{
|
||||
gistxlogPageUpdate *xldata = (gistxlogPageUpdate *) XLogRecGetData(record);
|
||||
PageUpdateRecord xlrec;
|
||||
Relation reln;
|
||||
Buffer buffer;
|
||||
Page page;
|
||||
|
||||
@ -208,8 +207,7 @@ gistRedoPageUpdateRecord(XLogRecPtr lsn, XLogRecord *record, bool isnewroot)
|
||||
|
||||
decodePageUpdateRecord(&xlrec, record);
|
||||
|
||||
reln = XLogOpenRelation(xlrec.data->node);
|
||||
buffer = XLogReadBuffer(reln, xlrec.data->blkno, false);
|
||||
buffer = XLogReadBuffer(xlrec.data->node, xlrec.data->blkno, false);
|
||||
if (!BufferIsValid(buffer))
|
||||
return;
|
||||
page = (Page) BufferGetPage(buffer);
|
||||
@ -234,7 +232,7 @@ gistRedoPageUpdateRecord(XLogRecPtr lsn, XLogRecord *record, bool isnewroot)
|
||||
|
||||
/* add tuples */
|
||||
if (xlrec.len > 0)
|
||||
gistfillbuffer(reln, page, xlrec.itup, xlrec.len, InvalidOffsetNumber);
|
||||
gistfillbuffer(page, xlrec.itup, xlrec.len, InvalidOffsetNumber);
|
||||
|
||||
/*
|
||||
* special case: leafpage, nothing to insert, nothing to delete, then
|
||||
@ -262,7 +260,6 @@ static void
|
||||
gistRedoPageDeleteRecord(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
gistxlogPageDelete *xldata = (gistxlogPageDelete *) XLogRecGetData(record);
|
||||
Relation reln;
|
||||
Buffer buffer;
|
||||
Page page;
|
||||
|
||||
@ -270,8 +267,7 @@ gistRedoPageDeleteRecord(XLogRecPtr lsn, XLogRecord *record)
|
||||
if (record->xl_info & XLR_BKP_BLOCK_1)
|
||||
return;
|
||||
|
||||
reln = XLogOpenRelation(xldata->node);
|
||||
buffer = XLogReadBuffer(reln, xldata->blkno, false);
|
||||
buffer = XLogReadBuffer(xldata->node, xldata->blkno, false);
|
||||
if (!BufferIsValid(buffer))
|
||||
return;
|
||||
|
||||
@ -319,14 +315,12 @@ static void
|
||||
gistRedoPageSplitRecord(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
PageSplitRecord xlrec;
|
||||
Relation reln;
|
||||
Buffer buffer;
|
||||
Page page;
|
||||
int i;
|
||||
int flags;
|
||||
|
||||
decodePageSplitRecord(&xlrec, record);
|
||||
reln = XLogOpenRelation(xlrec.data->node);
|
||||
flags = xlrec.data->origleaf ? F_LEAF : 0;
|
||||
|
||||
/* loop around all pages */
|
||||
@ -334,7 +328,7 @@ gistRedoPageSplitRecord(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
NewPage *newpage = xlrec.page + i;
|
||||
|
||||
buffer = XLogReadBuffer(reln, newpage->header->blkno, true);
|
||||
buffer = XLogReadBuffer(xlrec.data->node, newpage->header->blkno, true);
|
||||
Assert(BufferIsValid(buffer));
|
||||
page = (Page) BufferGetPage(buffer);
|
||||
|
||||
@ -342,7 +336,7 @@ gistRedoPageSplitRecord(XLogRecPtr lsn, XLogRecord *record)
|
||||
GISTInitBuffer(buffer, flags);
|
||||
|
||||
/* and fill it */
|
||||
gistfillbuffer(reln, page, newpage->itup, newpage->header->num, FirstOffsetNumber);
|
||||
gistfillbuffer(page, newpage->itup, newpage->header->num, FirstOffsetNumber);
|
||||
|
||||
PageSetLSN(page, lsn);
|
||||
PageSetTLI(page, ThisTimeLineID);
|
||||
@ -361,12 +355,10 @@ static void
|
||||
gistRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
RelFileNode *node = (RelFileNode *) XLogRecGetData(record);
|
||||
Relation reln;
|
||||
Buffer buffer;
|
||||
Page page;
|
||||
|
||||
reln = XLogOpenRelation(*node);
|
||||
buffer = XLogReadBuffer(reln, GIST_ROOT_BLKNO, true);
|
||||
buffer = XLogReadBuffer(*node, GIST_ROOT_BLKNO, true);
|
||||
Assert(BufferIsValid(buffer));
|
||||
page = (Page) BufferGetPage(buffer);
|
||||
|
||||
@ -602,7 +594,7 @@ gistContinueInsert(gistIncompleteInsert *insert)
|
||||
lenitup;
|
||||
Relation index;
|
||||
|
||||
index = XLogOpenRelation(insert->node);
|
||||
index = CreateFakeRelcacheEntry(insert->node);
|
||||
|
||||
/*
|
||||
* needed vector itup never will be more than initial lenblkno+2, because
|
||||
@ -624,7 +616,7 @@ gistContinueInsert(gistIncompleteInsert *insert)
|
||||
* it was split root, so we should only make new root. it can't be
|
||||
* simple insert into root, we should replace all content of root.
|
||||
*/
|
||||
Buffer buffer = XLogReadBuffer(index, GIST_ROOT_BLKNO, true);
|
||||
Buffer buffer = XLogReadBuffer(insert->node, GIST_ROOT_BLKNO, true);
|
||||
|
||||
gistnewroot(index, buffer, itup, lenitup, NULL);
|
||||
UnlockReleaseBuffer(buffer);
|
||||
@ -703,7 +695,7 @@ gistContinueInsert(gistIncompleteInsert *insert)
|
||||
LockBuffer(buffers[numbuffer], GIST_EXCLUSIVE);
|
||||
GISTInitBuffer(buffers[numbuffer], 0);
|
||||
pages[numbuffer] = BufferGetPage(buffers[numbuffer]);
|
||||
gistfillbuffer(index, pages[numbuffer], itup, lenitup, FirstOffsetNumber);
|
||||
gistfillbuffer(pages[numbuffer], itup, lenitup, FirstOffsetNumber);
|
||||
numbuffer++;
|
||||
|
||||
if (BufferGetBlockNumber(buffers[0]) == GIST_ROOT_BLKNO)
|
||||
@ -749,7 +741,7 @@ gistContinueInsert(gistIncompleteInsert *insert)
|
||||
|
||||
for (j = 0; j < ntodelete; j++)
|
||||
PageIndexTupleDelete(pages[0], todelete[j]);
|
||||
gistfillbuffer(index, pages[0], itup, lenitup, InvalidOffsetNumber);
|
||||
gistfillbuffer(pages[0], itup, lenitup, InvalidOffsetNumber);
|
||||
|
||||
rdata = formUpdateRdata(index->rd_node, buffers[0],
|
||||
todelete, ntodelete,
|
||||
@ -794,6 +786,8 @@ gistContinueInsert(gistIncompleteInsert *insert)
|
||||
}
|
||||
}
|
||||
|
||||
FreeFakeRelcacheEntry(index);
|
||||
|
||||
ereport(LOG,
|
||||
(errmsg("index %u/%u/%u needs VACUUM FULL or REINDEX to finish crash recovery",
|
||||
insert->node.spcNode, insert->node.dbNode, insert->node.relNode),
|
||||
|
Reference in New Issue
Block a user