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

Lines changed: 15 additions & 27 deletions
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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 8 additions & 10 deletions
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

Lines changed: 2 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy