Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita213f1e

Browse files
committed
Refactor XLogOpenRelation() and XLogReadBuffer() in preparation for relation
forks. XLogOpenRelation() and the associated light-weight relation cache inxlogutils.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 anew function called CreateFakeRelcacheEntry() that returns a fake entry likeXLogOpenRelation() used to.
1 parentc4f2a04 commita213f1e

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/1200:00:44 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.14 2008/06/1209:12:29 heikki Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include"postgres.h"
@@ -71,12 +71,10 @@ static void
7171
ginRedoCreateIndex(XLogRecPtrlsn,XLogRecord*record)
7272
{
7373
RelFileNode*node= (RelFileNode*)XLogRecGetData(record);
74-
Relationreln;
7574
Bufferbuffer;
7675
Pagepage;
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-
Relationreln;
9895
Bufferbuffer;
9996
Pagepage;
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(XLogRecPtrlsn,XLogRecord*record)
119115
{
120116
ginxlogInsert*data= (ginxlogInsert*)XLogRecGetData(record);
121-
Relationreln;
122117
Bufferbuffer;
123118
Pagepage;
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(XLogRecPtrlsn,XLogRecord*record)
229223
{
230224
ginxlogSplit*data= (ginxlogSplit*)XLogRecGetData(record);
231-
Relationreln;
232225
Bufferlbuffer,
233226
rbuffer;
234227
Pagelpage,
235228
rpage;
236229
uint32flags=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-
BufferrootBuf=XLogReadBuffer(reln,data->rootBlkno, false);
313+
BufferrootBuf=XLogReadBuffer(data->node,data->rootBlkno, false);
323314
PagerootPage=BufferGetPage(rootBuf);
324315

325316
GinInitBuffer(rootBuf,flags& ~GIN_LEAF);
@@ -352,16 +343,14 @@ static void
352343
ginRedoVacuumPage(XLogRecPtrlsn,XLogRecord*record)
353344
{
354345
ginxlogVacuumPage*data= (ginxlogVacuumPage*)XLogRecGetData(record);
355-
Relationreln;
356346
Bufferbuffer;
357347
Pagepage;
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(XLogRecPtrlsn,XLogRecord*record)
404393
{
405394
ginxlogDeletePage*data= (ginxlogDeletePage*)XLogRecGetData(record);
406-
Relationreln;
407395
Bufferbuffer;
408396
Pagepage;
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/1200:00:44 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.151 2008/06/1209: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/1200:00:44 alvherre Exp $
11+
*$PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.27 2008/06/1209:12:29 heikki Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include"postgres.h"
@@ -27,11 +27,10 @@ static Datum attrS[INDEX_MAX_KEYS];
2727
staticboolisnullS[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(Relationr,Pagepage,IndexTuple*itup,
34-
intlen,OffsetNumberoff)
32+
void
33+
gistfillbuffer(Pagepage,IndexTuple*itup,intlen,OffsetNumberoff)
3534
{
3635
OffsetNumberl=InvalidOffsetNumber;
3736
inti;
@@ -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+
Sizesz=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 toGiSTindex page, item %d out of %d, size %d bytes",
48+
i,len,sz);
5049
off++;
5150
}
52-
returnl;
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/1200:00:44 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.36 2008/06/1209: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)

[8]ページ先頭

©2009-2025 Movatter.jp