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
7171ginRedoCreateIndex (XLogRecPtr lsn ,XLogRecord * record )
7272{
7373RelFileNode * node = (RelFileNode * )XLogRecGetData (record );
74- Relation reln ;
7574Buffer buffer ;
7675Page page ;
7776
78- reln = XLogOpenRelation (* node );
79- buffer = XLogReadBuffer (reln ,GIN_ROOT_BLKNO , true);
77+ buffer = XLogReadBuffer (* node ,GIN_ROOT_BLKNO , true);
8078Assert (BufferIsValid (buffer ));
8179page = (Page )BufferGetPage (buffer );
8280
@@ -94,12 +92,10 @@ ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record)
9492{
9593ginxlogCreatePostingTree * data = (ginxlogCreatePostingTree * )XLogRecGetData (record );
9694ItemPointerData * items = (ItemPointerData * ) (XLogRecGetData (record )+ sizeof (ginxlogCreatePostingTree ));
97- Relation reln ;
9895Buffer buffer ;
9996Page page ;
10097
101- reln = XLogOpenRelation (data -> node );
102- buffer = XLogReadBuffer (reln ,data -> blkno , true);
98+ buffer = XLogReadBuffer (data -> node ,data -> blkno , true);
10399Assert (BufferIsValid (buffer ));
104100page = (Page )BufferGetPage (buffer );
105101
@@ -118,16 +114,14 @@ static void
118114ginRedoInsert (XLogRecPtr lsn ,XLogRecord * record )
119115{
120116ginxlogInsert * data = (ginxlogInsert * )XLogRecGetData (record );
121- Relation reln ;
122117Buffer buffer ;
123118Page page ;
124119
125120/* nothing else to do if page was backed up */
126121if (record -> xl_info & XLR_BKP_BLOCK_1 )
127122return ;
128123
129- reln = XLogOpenRelation (data -> node );
130- buffer = XLogReadBuffer (reln ,data -> blkno , false);
124+ buffer = XLogReadBuffer (data -> node ,data -> blkno , false);
131125Assert (BufferIsValid (buffer ));
132126page = (Page )BufferGetPage (buffer );
133127
@@ -228,26 +222,23 @@ static void
228222ginRedoSplit (XLogRecPtr lsn ,XLogRecord * record )
229223{
230224ginxlogSplit * data = (ginxlogSplit * )XLogRecGetData (record );
231- Relation reln ;
232225Buffer lbuffer ,
233226rbuffer ;
234227Page lpage ,
235228rpage ;
236229uint32 flags = 0 ;
237230
238- reln = XLogOpenRelation (data -> node );
239-
240231if (data -> isLeaf )
241232flags |=GIN_LEAF ;
242233if (data -> isData )
243234flags |=GIN_DATA ;
244235
245- lbuffer = XLogReadBuffer (reln ,data -> lblkno ,data -> isRootSplit );
236+ lbuffer = XLogReadBuffer (data -> node ,data -> lblkno ,data -> isRootSplit );
246237Assert (BufferIsValid (lbuffer ));
247238lpage = (Page )BufferGetPage (lbuffer );
248239GinInitBuffer (lbuffer ,flags );
249240
250- rbuffer = XLogReadBuffer (reln ,data -> rblkno , true);
241+ rbuffer = XLogReadBuffer (data -> node ,data -> rblkno , true);
251242Assert (BufferIsValid (rbuffer ));
252243rpage = (Page )BufferGetPage (rbuffer );
253244GinInitBuffer (rbuffer ,flags );
@@ -319,7 +310,7 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
319310
320311if (data -> isRootSplit )
321312{
322- Buffer rootBuf = XLogReadBuffer (reln ,data -> rootBlkno , false);
313+ Buffer rootBuf = XLogReadBuffer (data -> node ,data -> rootBlkno , false);
323314Page rootPage = BufferGetPage (rootBuf );
324315
325316GinInitBuffer (rootBuf ,flags & ~GIN_LEAF );
@@ -352,16 +343,14 @@ static void
352343ginRedoVacuumPage (XLogRecPtr lsn ,XLogRecord * record )
353344{
354345ginxlogVacuumPage * data = (ginxlogVacuumPage * )XLogRecGetData (record );
355- Relation reln ;
356346Buffer buffer ;
357347Page page ;
358348
359349/* nothing else to do if page was backed up (and no info to do it with) */
360350if (record -> xl_info & XLR_BKP_BLOCK_1 )
361351return ;
362352
363- reln = XLogOpenRelation (data -> node );
364- buffer = XLogReadBuffer (reln ,data -> blkno , false);
353+ buffer = XLogReadBuffer (data -> node ,data -> blkno , false);
365354Assert (BufferIsValid (buffer ));
366355page = (Page )BufferGetPage (buffer );
367356
@@ -403,15 +392,12 @@ static void
403392ginRedoDeletePage (XLogRecPtr lsn ,XLogRecord * record )
404393{
405394ginxlogDeletePage * data = (ginxlogDeletePage * )XLogRecGetData (record );
406- Relation reln ;
407395Buffer buffer ;
408396Page page ;
409397
410- reln = XLogOpenRelation (data -> node );
411-
412398if (!(record -> xl_info & XLR_BKP_BLOCK_1 ))
413399{
414- buffer = XLogReadBuffer (reln ,data -> blkno , false);
400+ buffer = XLogReadBuffer (data -> node ,data -> blkno , false);
415401page = BufferGetPage (buffer );
416402Assert (GinPageIsData (page ));
417403GinPageGetOpaque (page )-> flags = GIN_DELETED ;
@@ -423,7 +409,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
423409
424410if (!(record -> xl_info & XLR_BKP_BLOCK_2 ))
425411{
426- buffer = XLogReadBuffer (reln ,data -> parentBlkno , false);
412+ buffer = XLogReadBuffer (data -> node ,data -> parentBlkno , false);
427413page = BufferGetPage (buffer );
428414Assert (GinPageIsData (page ));
429415Assert (!GinPageIsLeaf (page ));
@@ -436,7 +422,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
436422
437423if (!(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);
440426page = BufferGetPage (buffer );
441427Assert (GinPageIsData (page ));
442428GinPageGetOpaque (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
564550if (split -> rootBlkno == GIN_ROOT_BLKNO )
565551{
@@ -581,6 +567,8 @@ ginContinueSplit(ginIncompleteSplit *split)
581567GinPageGetOpaque (page )-> maxoff ))-> key ;
582568}
583569
570+ FreeFakeRelcacheEntry (reln );
571+
584572btree .rightblkno = split -> rightBlkno ;
585573
586574stack .blkno = split -> leftBlkno ;