8
8
* Portions Copyright (c) 1994, Regents of the University of California
9
9
*
10
10
* 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 $
12
12
*-------------------------------------------------------------------------
13
13
*/
14
14
#include "postgres.h"
@@ -71,12 +71,10 @@ static void
71
71
ginRedoCreateIndex (XLogRecPtr lsn , XLogRecord * record )
72
72
{
73
73
RelFileNode * node = (RelFileNode * ) XLogRecGetData (record );
74
- Relation reln ;
75
74
Buffer buffer ;
76
75
Page page ;
77
76
78
- reln = XLogOpenRelation (* node );
79
- buffer = XLogReadBuffer (reln , GIN_ROOT_BLKNO , true);
77
+ buffer = XLogReadBuffer (* node , GIN_ROOT_BLKNO , true);
80
78
Assert (BufferIsValid (buffer ));
81
79
page = (Page ) BufferGetPage (buffer );
82
80
@@ -94,12 +92,10 @@ ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record)
94
92
{
95
93
ginxlogCreatePostingTree * data = (ginxlogCreatePostingTree * ) XLogRecGetData (record );
96
94
ItemPointerData * items = (ItemPointerData * ) (XLogRecGetData (record ) + sizeof (ginxlogCreatePostingTree ));
97
- Relation reln ;
98
95
Buffer buffer ;
99
96
Page page ;
100
97
101
- reln = XLogOpenRelation (data -> node );
102
- buffer = XLogReadBuffer (reln , data -> blkno , true);
98
+ buffer = XLogReadBuffer (data -> node , data -> blkno , true);
103
99
Assert (BufferIsValid (buffer ));
104
100
page = (Page ) BufferGetPage (buffer );
105
101
@@ -118,16 +114,14 @@ static void
118
114
ginRedoInsert (XLogRecPtr lsn , XLogRecord * record )
119
115
{
120
116
ginxlogInsert * data = (ginxlogInsert * ) XLogRecGetData (record );
121
- Relation reln ;
122
117
Buffer buffer ;
123
118
Page page ;
124
119
125
120
/* nothing else to do if page was backed up */
126
121
if (record -> xl_info & XLR_BKP_BLOCK_1 )
127
122
return ;
128
123
129
- reln = XLogOpenRelation (data -> node );
130
- buffer = XLogReadBuffer (reln , data -> blkno , false);
124
+ buffer = XLogReadBuffer (data -> node , data -> blkno , false);
131
125
Assert (BufferIsValid (buffer ));
132
126
page = (Page ) BufferGetPage (buffer );
133
127
@@ -228,26 +222,23 @@ static void
228
222
ginRedoSplit (XLogRecPtr lsn , XLogRecord * record )
229
223
{
230
224
ginxlogSplit * data = (ginxlogSplit * ) XLogRecGetData (record );
231
- Relation reln ;
232
225
Buffer lbuffer ,
233
226
rbuffer ;
234
227
Page lpage ,
235
228
rpage ;
236
229
uint32 flags = 0 ;
237
230
238
- reln = XLogOpenRelation (data -> node );
239
-
240
231
if (data -> isLeaf )
241
232
flags |= GIN_LEAF ;
242
233
if (data -> isData )
243
234
flags |= GIN_DATA ;
244
235
245
- lbuffer = XLogReadBuffer (reln , data -> lblkno , data -> isRootSplit );
236
+ lbuffer = XLogReadBuffer (data -> node , data -> lblkno , data -> isRootSplit );
246
237
Assert (BufferIsValid (lbuffer ));
247
238
lpage = (Page ) BufferGetPage (lbuffer );
248
239
GinInitBuffer (lbuffer , flags );
249
240
250
- rbuffer = XLogReadBuffer (reln , data -> rblkno , true);
241
+ rbuffer = XLogReadBuffer (data -> node , data -> rblkno , true);
251
242
Assert (BufferIsValid (rbuffer ));
252
243
rpage = (Page ) BufferGetPage (rbuffer );
253
244
GinInitBuffer (rbuffer , flags );
@@ -319,7 +310,7 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
319
310
320
311
if (data -> isRootSplit )
321
312
{
322
- Buffer rootBuf = XLogReadBuffer (reln , data -> rootBlkno , false);
313
+ Buffer rootBuf = XLogReadBuffer (data -> node , data -> rootBlkno , false);
323
314
Page rootPage = BufferGetPage (rootBuf );
324
315
325
316
GinInitBuffer (rootBuf , flags & ~GIN_LEAF );
@@ -352,16 +343,14 @@ static void
352
343
ginRedoVacuumPage (XLogRecPtr lsn , XLogRecord * record )
353
344
{
354
345
ginxlogVacuumPage * data = (ginxlogVacuumPage * ) XLogRecGetData (record );
355
- Relation reln ;
356
346
Buffer buffer ;
357
347
Page page ;
358
348
359
349
/* nothing else to do if page was backed up (and no info to do it with) */
360
350
if (record -> xl_info & XLR_BKP_BLOCK_1 )
361
351
return ;
362
352
363
- reln = XLogOpenRelation (data -> node );
364
- buffer = XLogReadBuffer (reln , data -> blkno , false);
353
+ buffer = XLogReadBuffer (data -> node , data -> blkno , false);
365
354
Assert (BufferIsValid (buffer ));
366
355
page = (Page ) BufferGetPage (buffer );
367
356
@@ -403,15 +392,12 @@ static void
403
392
ginRedoDeletePage (XLogRecPtr lsn , XLogRecord * record )
404
393
{
405
394
ginxlogDeletePage * data = (ginxlogDeletePage * ) XLogRecGetData (record );
406
- Relation reln ;
407
395
Buffer buffer ;
408
396
Page page ;
409
397
410
- reln = XLogOpenRelation (data -> node );
411
-
412
398
if (!(record -> xl_info & XLR_BKP_BLOCK_1 ))
413
399
{
414
- buffer = XLogReadBuffer (reln , data -> blkno , false);
400
+ buffer = XLogReadBuffer (data -> node , data -> blkno , false);
415
401
page = BufferGetPage (buffer );
416
402
Assert (GinPageIsData (page ));
417
403
GinPageGetOpaque (page )-> flags = GIN_DELETED ;
@@ -423,7 +409,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
423
409
424
410
if (!(record -> xl_info & XLR_BKP_BLOCK_2 ))
425
411
{
426
- buffer = XLogReadBuffer (reln , data -> parentBlkno , false);
412
+ buffer = XLogReadBuffer (data -> node , data -> parentBlkno , false);
427
413
page = BufferGetPage (buffer );
428
414
Assert (GinPageIsData (page ));
429
415
Assert (!GinPageIsLeaf (page ));
@@ -436,7 +422,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
436
422
437
423
if (!(record -> xl_info & XLR_BKP_BLOCK_3 ) && data -> leftBlkno != InvalidBlockNumber )
438
424
{
439
- buffer = XLogReadBuffer (reln , data -> leftBlkno , false);
425
+ buffer = XLogReadBuffer (data -> node , data -> leftBlkno , false);
440
426
page = BufferGetPage (buffer );
441
427
Assert (GinPageIsData (page ));
442
428
GinPageGetOpaque (page )-> rightlink = data -> rightLink ;
@@ -557,9 +543,9 @@ ginContinueSplit(ginIncompleteSplit *split)
557
543
* elog(NOTICE,"ginContinueSplit root:%u l:%u r:%u", split->rootBlkno,
558
544
* split->leftBlkno, split->rightBlkno);
559
545
*/
560
- reln = XLogOpenRelation (split -> node );
546
+ buffer = XLogReadBuffer (split -> node , split -> leftBlkno , false );
561
547
562
- buffer = XLogReadBuffer ( reln , split -> leftBlkno , false );
548
+ reln = CreateFakeRelcacheEntry ( split -> node );
563
549
564
550
if (split -> rootBlkno == GIN_ROOT_BLKNO )
565
551
{
@@ -581,6 +567,8 @@ ginContinueSplit(ginIncompleteSplit *split)
581
567
GinPageGetOpaque (page )-> maxoff ))-> key ;
582
568
}
583
569
570
+ FreeFakeRelcacheEntry (reln );
571
+
584
572
btree .rightblkno = split -> rightBlkno ;
585
573
586
574
stack .blkno = split -> leftBlkno ;
0 commit comments