Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit a213f1e

Browse files
committed
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.
1 parent c4f2a04 commit a213f1e

File tree

20 files changed

+294
-426
lines changed

20 files changed

+294
-426
lines changed

src/backend/access/gin/ginxlog.c

+15-27
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.13 2008/05/12 00:00:44 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.14 2008/06/12 09:12:29 heikki Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include "postgres.h"
@@ -71,12 +71,10 @@ static void
7171
ginRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record)
7272
{
7373
RelFileNode *node = (RelFileNode *) XLogRecGetData(record);
74-
Relation reln;
7574
Buffer buffer;
7675
Page page;
7776

78-
reln = XLogOpenRelation(*node);
79-
buffer = XLogReadBuffer(reln, GIN_ROOT_BLKNO, true);
77+
buffer = XLogReadBuffer(*node, GIN_ROOT_BLKNO, true);
8078
Assert(BufferIsValid(buffer));
8179
page = (Page) BufferGetPage(buffer);
8280

@@ -94,12 +92,10 @@ ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record)
9492
{
9593
ginxlogCreatePostingTree *data = (ginxlogCreatePostingTree *) XLogRecGetData(record);
9694
ItemPointerData *items = (ItemPointerData *) (XLogRecGetData(record) + sizeof(ginxlogCreatePostingTree));
97-
Relation reln;
9895
Buffer buffer;
9996
Page page;
10097

101-
reln = XLogOpenRelation(data->node);
102-
buffer = XLogReadBuffer(reln, data->blkno, true);
98+
buffer = XLogReadBuffer(data->node, data->blkno, true);
10399
Assert(BufferIsValid(buffer));
104100
page = (Page) BufferGetPage(buffer);
105101

@@ -118,16 +114,14 @@ static void
118114
ginRedoInsert(XLogRecPtr lsn, XLogRecord *record)
119115
{
120116
ginxlogInsert *data = (ginxlogInsert *) XLogRecGetData(record);
121-
Relation reln;
122117
Buffer buffer;
123118
Page page;
124119

125120
/* nothing else to do if page was backed up */
126121
if (record->xl_info & XLR_BKP_BLOCK_1)
127122
return;
128123

129-
reln = XLogOpenRelation(data->node);
130-
buffer = XLogReadBuffer(reln, data->blkno, false);
124+
buffer = XLogReadBuffer(data->node, data->blkno, false);
131125
Assert(BufferIsValid(buffer));
132126
page = (Page) BufferGetPage(buffer);
133127

@@ -228,26 +222,23 @@ static void
228222
ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
229223
{
230224
ginxlogSplit *data = (ginxlogSplit *) XLogRecGetData(record);
231-
Relation reln;
232225
Buffer lbuffer,
233226
rbuffer;
234227
Page lpage,
235228
rpage;
236229
uint32 flags = 0;
237230

238-
reln = XLogOpenRelation(data->node);
239-
240231
if (data->isLeaf)
241232
flags |= GIN_LEAF;
242233
if (data->isData)
243234
flags |= GIN_DATA;
244235

245-
lbuffer = XLogReadBuffer(reln, data->lblkno, data->isRootSplit);
236+
lbuffer = XLogReadBuffer(data->node, data->lblkno, data->isRootSplit);
246237
Assert(BufferIsValid(lbuffer));
247238
lpage = (Page) BufferGetPage(lbuffer);
248239
GinInitBuffer(lbuffer, flags);
249240

250-
rbuffer = XLogReadBuffer(reln, data->rblkno, true);
241+
rbuffer = XLogReadBuffer(data->node, data->rblkno, true);
251242
Assert(BufferIsValid(rbuffer));
252243
rpage = (Page) BufferGetPage(rbuffer);
253244
GinInitBuffer(rbuffer, flags);
@@ -319,7 +310,7 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
319310

320311
if (data->isRootSplit)
321312
{
322-
Buffer rootBuf = XLogReadBuffer(reln, data->rootBlkno, false);
313+
Buffer rootBuf = XLogReadBuffer(data->node, data->rootBlkno, false);
323314
Page rootPage = BufferGetPage(rootBuf);
324315

325316
GinInitBuffer(rootBuf, flags & ~GIN_LEAF);
@@ -352,16 +343,14 @@ static void
352343
ginRedoVacuumPage(XLogRecPtr lsn, XLogRecord *record)
353344
{
354345
ginxlogVacuumPage *data = (ginxlogVacuumPage *) XLogRecGetData(record);
355-
Relation reln;
356346
Buffer buffer;
357347
Page page;
358348

359349
/* nothing else to do if page was backed up (and no info to do it with) */
360350
if (record->xl_info & XLR_BKP_BLOCK_1)
361351
return;
362352

363-
reln = XLogOpenRelation(data->node);
364-
buffer = XLogReadBuffer(reln, data->blkno, false);
353+
buffer = XLogReadBuffer(data->node, data->blkno, false);
365354
Assert(BufferIsValid(buffer));
366355
page = (Page) BufferGetPage(buffer);
367356

@@ -403,15 +392,12 @@ static void
403392
ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
404393
{
405394
ginxlogDeletePage *data = (ginxlogDeletePage *) XLogRecGetData(record);
406-
Relation reln;
407395
Buffer buffer;
408396
Page page;
409397

410-
reln = XLogOpenRelation(data->node);
411-
412398
if (!(record->xl_info & XLR_BKP_BLOCK_1))
413399
{
414-
buffer = XLogReadBuffer(reln, data->blkno, false);
400+
buffer = XLogReadBuffer(data->node, data->blkno, false);
415401
page = BufferGetPage(buffer);
416402
Assert(GinPageIsData(page));
417403
GinPageGetOpaque(page)->flags = GIN_DELETED;
@@ -423,7 +409,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
423409

424410
if (!(record->xl_info & XLR_BKP_BLOCK_2))
425411
{
426-
buffer = XLogReadBuffer(reln, data->parentBlkno, false);
412+
buffer = XLogReadBuffer(data->node, data->parentBlkno, false);
427413
page = BufferGetPage(buffer);
428414
Assert(GinPageIsData(page));
429415
Assert(!GinPageIsLeaf(page));
@@ -436,7 +422,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
436422

437423
if (!(record->xl_info & XLR_BKP_BLOCK_3) && data->leftBlkno != InvalidBlockNumber)
438424
{
439-
buffer = XLogReadBuffer(reln, data->leftBlkno, false);
425+
buffer = XLogReadBuffer(data->node, data->leftBlkno, false);
440426
page = BufferGetPage(buffer);
441427
Assert(GinPageIsData(page));
442428
GinPageGetOpaque(page)->rightlink = data->rightLink;
@@ -557,9 +543,9 @@ ginContinueSplit(ginIncompleteSplit *split)
557543
* elog(NOTICE,"ginContinueSplit root:%u l:%u r:%u", split->rootBlkno,
558544
* split->leftBlkno, split->rightBlkno);
559545
*/
560-
reln = XLogOpenRelation(split->node);
546+
buffer = XLogReadBuffer(split->node, split->leftBlkno, false);
561547

562-
buffer = XLogReadBuffer(reln, split->leftBlkno, false);
548+
reln = CreateFakeRelcacheEntry(split->node);
563549

564550
if (split->rootBlkno == GIN_ROOT_BLKNO)
565551
{
@@ -581,6 +567,8 @@ ginContinueSplit(ginIncompleteSplit *split)
581567
GinPageGetOpaque(page)->maxoff))->key;
582568
}
583569

570+
FreeFakeRelcacheEntry(reln);
571+
584572
btree.rightblkno = split->rightBlkno;
585573

586574
stack.blkno = split->leftBlkno;

src/backend/access/gist/gist.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.150 2008/05/12 00:00:44 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.151 2008/06/12 09:12:29 heikki Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -462,7 +462,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
462462

463463
if (!is_leaf)
464464
PageIndexTupleDelete(state->stack->page, state->stack->childoffnum);
465-
gistfillbuffer(state->r, state->stack->page, state->itup, state->ituplen, InvalidOffsetNumber);
465+
gistfillbuffer(state->stack->page, state->itup, state->ituplen, InvalidOffsetNumber);
466466

467467
MarkBufferDirty(state->stack->buffer);
468468

@@ -1008,7 +1008,7 @@ gistnewroot(Relation r, Buffer buffer, IndexTuple *itup, int len, ItemPointer ke
10081008
START_CRIT_SECTION();
10091009

10101010
GISTInitBuffer(buffer, 0);
1011-
gistfillbuffer(r, page, itup, len, FirstOffsetNumber);
1011+
gistfillbuffer(page, itup, len, FirstOffsetNumber);
10121012

10131013
MarkBufferDirty(buffer);
10141014

src/backend/access/gist/gistutil.c

+8-10
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.26 2008/05/12 00:00:44 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.27 2008/06/12 09:12:29 heikki Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include "postgres.h"
@@ -27,11 +27,10 @@ static Datum attrS[INDEX_MAX_KEYS];
2727
static bool isnullS[INDEX_MAX_KEYS];
2828

2929
/*
30-
* Write itup vector to page, has no control of free space
30+
* Write itup vector to page, has no control of free space.
3131
*/
32-
OffsetNumber
33-
gistfillbuffer(Relation r, Page page, IndexTuple *itup,
34-
int len, OffsetNumber off)
32+
void
33+
gistfillbuffer(Page page, IndexTuple *itup, int len, OffsetNumber off)
3534
{
3635
OffsetNumber l = InvalidOffsetNumber;
3736
int i;
@@ -42,14 +41,13 @@ gistfillbuffer(Relation r, Page page, IndexTuple *itup,
4241

4342
for (i = 0; i < len; i++)
4443
{
45-
l = PageAddItem(page, (Item) itup[i], IndexTupleSize(itup[i]),
46-
off, false, false);
44+
Size sz = IndexTupleSize(itup[i]);
45+
l = PageAddItem(page, (Item) itup[i], sz, off, false, false);
4746
if (l == InvalidOffsetNumber)
48-
elog(ERROR, "failed to add item to index page in \"%s\"",
49-
RelationGetRelationName(r));
47+
elog(ERROR, "failed to add item to GiST index page, item %d out of %d, size %d bytes",
48+
i, len, sz);
5049
off++;
5150
}
52-
return l;
5351
}
5452

5553
/*

src/backend/access/gist/gistvacuum.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.35 2008/05/12 00:00:44 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.36 2008/06/12 09:12:30 heikki Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -403,7 +403,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
403403
}
404404
else
405405
/* enough free space */
406-
gistfillbuffer(gv->index, tempPage, addon, curlenaddon, InvalidOffsetNumber);
406+
gistfillbuffer(tempPage, addon, curlenaddon, InvalidOffsetNumber);
407407
}
408408
}
409409

0 commit comments

Comments
 (0)