2020static MemoryContext opCtx ;/* working memory for operations */
2121
2222static void
23- ginRedoClearIncompleteSplit (XLogRecPtr lsn ,RelFileNode node ,BlockNumber blkno )
23+ ginRedoClearIncompleteSplit (XLogRecPtr lsn ,XLogRecord * record ,
24+ int block_index ,
25+ RelFileNode node ,BlockNumber blkno )
2426{
2527Buffer buffer ;
2628Page page ;
2729
28- buffer = XLogReadBuffer (node ,blkno , false);
29- if (!BufferIsValid (buffer ))
30- return ;/* page was deleted, nothing to do */
31- page = (Page )BufferGetPage (buffer );
32-
33- if (lsn > PageGetLSN (page ))
30+ if (XLogReadBufferForRedo (lsn ,record ,block_index ,node ,blkno ,& buffer )
31+ == BLK_NEEDS_REDO )
3432{
33+ page = (Page )BufferGetPage (buffer );
34+
3535GinPageGetOpaque (page )-> flags &= ~GIN_INCOMPLETE_SPLIT ;
3636
3737PageSetLSN (page ,lsn );
3838MarkBufferDirty (buffer );
3939}
40-
41- UnlockReleaseBuffer (buffer );
40+ if ( BufferIsValid ( buffer ))
41+ UnlockReleaseBuffer (buffer );
4242}
4343
4444static void
@@ -332,7 +332,6 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record)
332332{
333333ginxlogInsert * data = (ginxlogInsert * )XLogRecGetData (record );
334334Buffer buffer ;
335- Page page ;
336335char * payload ;
337336BlockNumber leftChildBlkno = InvalidBlockNumber ;
338337BlockNumber rightChildBlkno = InvalidBlockNumber ;
@@ -351,26 +350,14 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record)
351350rightChildBlkno = BlockIdGetBlockNumber ((BlockId )payload );
352351payload += sizeof (BlockIdData );
353352
354- if (record -> xl_info & XLR_BKP_BLOCK (0 ))
355- (void )RestoreBackupBlock (lsn ,record ,0 , false, false);
356- else
357- ginRedoClearIncompleteSplit (lsn ,data -> node ,leftChildBlkno );
353+ ginRedoClearIncompleteSplit (lsn ,record ,0 ,data -> node ,leftChildBlkno );
358354}
359355
360- /* If we have a full-page image, restore it and we're done */
361- if ( record -> xl_info & XLR_BKP_BLOCK ( isLeaf ? 0 : 1 ) )
356+ if ( XLogReadBufferForRedo ( lsn , record , isLeaf ? 0 : 1 , data -> node ,
357+ data -> blkno , & buffer ) == BLK_NEEDS_REDO )
362358{
363- (void )RestoreBackupBlock (lsn ,record ,isLeaf ?0 :1 , false, false);
364- return ;
365- }
366-
367- buffer = XLogReadBuffer (data -> node ,data -> blkno , false);
368- if (!BufferIsValid (buffer ))
369- return ;/* page was deleted, nothing to do */
370- page = (Page )BufferGetPage (buffer );
359+ Page page = BufferGetPage (buffer );
371360
372- if (lsn > PageGetLSN (page ))
373- {
374361/* How to insert the payload is tree-type specific */
375362if (data -> flags & GIN_INSERT_ISDATA )
376363{
@@ -386,8 +373,8 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record)
386373PageSetLSN (page ,lsn );
387374MarkBufferDirty (buffer );
388375}
389-
390- UnlockReleaseBuffer (buffer );
376+ if ( BufferIsValid ( buffer ))
377+ UnlockReleaseBuffer (buffer );
391378}
392379
393380static void
@@ -476,12 +463,7 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
476463 * split
477464 */
478465if (!isLeaf )
479- {
480- if (record -> xl_info & XLR_BKP_BLOCK (0 ))
481- (void )RestoreBackupBlock (lsn ,record ,0 , false, false);
482- else
483- ginRedoClearIncompleteSplit (lsn ,data -> node ,data -> leftChildBlkno );
484- }
466+ ginRedoClearIncompleteSplit (lsn ,record ,0 ,data -> node ,data -> leftChildBlkno );
485467
486468flags = 0 ;
487469if (isLeaf )
@@ -605,31 +587,21 @@ ginRedoVacuumDataLeafPage(XLogRecPtr lsn, XLogRecord *record)
605587{
606588ginxlogVacuumDataLeafPage * xlrec = (ginxlogVacuumDataLeafPage * )XLogRecGetData (record );
607589Buffer buffer ;
608- Page page ;
609590
610- /* If we have a full-page image, restore it and we're done */
611- if ( record -> xl_info & XLR_BKP_BLOCK ( 0 ) )
591+ if ( XLogReadBufferForRedo ( lsn , record , 0 , xlrec -> node , xlrec -> blkno ,
592+ & buffer ) == BLK_NEEDS_REDO )
612593{
613- (void )RestoreBackupBlock (lsn ,record ,0 , false, false);
614- return ;
615- }
616-
617- buffer = XLogReadBuffer (xlrec -> node ,xlrec -> blkno , false);
618- if (!BufferIsValid (buffer ))
619- return ;
620- page = (Page )BufferGetPage (buffer );
594+ Page page = BufferGetPage (buffer );
621595
622- Assert (GinPageIsLeaf (page ));
623- Assert (GinPageIsData (page ));
596+ Assert (GinPageIsLeaf (page ));
597+ Assert (GinPageIsData (page ));
624598
625- if (lsn > PageGetLSN (page ))
626- {
627599ginRedoRecompress (page ,& xlrec -> data );
628600PageSetLSN (page ,lsn );
629601MarkBufferDirty (buffer );
630602}
631-
632- UnlockReleaseBuffer (buffer );
603+ if ( BufferIsValid ( buffer ))
604+ UnlockReleaseBuffer (buffer );
633605}
634606
635607static void
@@ -641,62 +613,42 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
641613Buffer lbuffer ;
642614Page page ;
643615
644- if (record -> xl_info & XLR_BKP_BLOCK (0 ))
645- dbuffer = RestoreBackupBlock (lsn ,record ,0 , false, true);
646- else
616+ if (XLogReadBufferForRedo (lsn ,record ,0 ,data -> node ,data -> blkno ,& dbuffer )
617+ == BLK_NEEDS_REDO )
647618{
648- dbuffer = XLogReadBuffer (data -> node ,data -> blkno , false);
649- if (BufferIsValid (dbuffer ))
650- {
651- page = BufferGetPage (dbuffer );
652- if (lsn > PageGetLSN (page ))
653- {
654- Assert (GinPageIsData (page ));
655- GinPageGetOpaque (page )-> flags = GIN_DELETED ;
656- PageSetLSN (page ,lsn );
657- MarkBufferDirty (dbuffer );
658- }
659- }
619+ page = BufferGetPage (dbuffer );
620+
621+ Assert (GinPageIsData (page ));
622+ GinPageGetOpaque (page )-> flags = GIN_DELETED ;
623+ PageSetLSN (page ,lsn );
624+ MarkBufferDirty (dbuffer );
660625}
661626
662- if (record -> xl_info & XLR_BKP_BLOCK (1 ))
663- pbuffer = RestoreBackupBlock (lsn ,record ,1 , false, true);
664- else
627+ if (XLogReadBufferForRedo (lsn ,record ,1 ,data -> node ,data -> parentBlkno ,
628+ & pbuffer )== BLK_NEEDS_REDO )
665629{
666- pbuffer = XLogReadBuffer (data -> node ,data -> parentBlkno , false);
667- if (BufferIsValid (pbuffer ))
668- {
669- page = BufferGetPage (pbuffer );
670- if (lsn > PageGetLSN (page ))
671- {
672- Assert (GinPageIsData (page ));
673- Assert (!GinPageIsLeaf (page ));
674- GinPageDeletePostingItem (page ,data -> parentOffset );
675- PageSetLSN (page ,lsn );
676- MarkBufferDirty (pbuffer );
677- }
678- }
630+ page = BufferGetPage (pbuffer );
631+
632+ Assert (GinPageIsData (page ));
633+ Assert (!GinPageIsLeaf (page ));
634+ GinPageDeletePostingItem (page ,data -> parentOffset );
635+ PageSetLSN (page ,lsn );
636+ MarkBufferDirty (pbuffer );
679637}
680638
681- if (record -> xl_info & XLR_BKP_BLOCK (2 ))
682- (void )RestoreBackupBlock (lsn ,record ,2 , false, false);
683- else if (data -> leftBlkno != InvalidBlockNumber )
639+ if (XLogReadBufferForRedo (lsn ,record ,2 ,data -> node ,data -> leftBlkno ,
640+ & lbuffer )== BLK_NEEDS_REDO )
684641{
685- lbuffer = XLogReadBuffer (data -> node ,data -> leftBlkno , false);
686- if (BufferIsValid (lbuffer ))
687- {
688- page = BufferGetPage (lbuffer );
689- if (lsn > PageGetLSN (page ))
690- {
691- Assert (GinPageIsData (page ));
692- GinPageGetOpaque (page )-> rightlink = data -> rightLink ;
693- PageSetLSN (page ,lsn );
694- MarkBufferDirty (lbuffer );
695- }
696- UnlockReleaseBuffer (lbuffer );
697- }
642+ page = BufferGetPage (lbuffer );
643+
644+ Assert (GinPageIsData (page ));
645+ GinPageGetOpaque (page )-> rightlink = data -> rightLink ;
646+ PageSetLSN (page ,lsn );
647+ MarkBufferDirty (lbuffer );
698648}
699649
650+ if (BufferIsValid (lbuffer ))
651+ UnlockReleaseBuffer (lbuffer );
700652if (BufferIsValid (pbuffer ))
701653UnlockReleaseBuffer (pbuffer );
702654if (BufferIsValid (dbuffer ))
@@ -730,74 +682,64 @@ ginRedoUpdateMetapage(XLogRecPtr lsn, XLogRecord *record)
730682/*
731683 * insert into tail page
732684 */
733- if (record -> xl_info & XLR_BKP_BLOCK ( 0 ))
734- ( void ) RestoreBackupBlock ( lsn , record , 0 , false, false);
735- else
685+ if (XLogReadBufferForRedo ( lsn , record , 0 , data -> node ,
686+ data -> metadata . tail , & buffer )
687+ == BLK_NEEDS_REDO )
736688{
737- buffer = XLogReadBuffer (data -> node ,data -> metadata .tail , false);
738- if (BufferIsValid (buffer ))
739- {
740- Page page = BufferGetPage (buffer );
689+ Page page = BufferGetPage (buffer );
690+ OffsetNumber off ;
691+ int i ;
692+ Size tupsize ;
693+ IndexTuple tuples ;
741694
742- if (lsn > PageGetLSN (page ))
743- {
744- OffsetNumber l ,
745- off = (PageIsEmpty (page )) ?FirstOffsetNumber :
746- OffsetNumberNext (PageGetMaxOffsetNumber (page ));
747- int i ,
748- tupsize ;
749- IndexTuple tuples = (IndexTuple ) (XLogRecGetData (record )+ sizeof (ginxlogUpdateMeta ));
695+ tuples = (IndexTuple ) (XLogRecGetData (record )+ sizeof (ginxlogUpdateMeta ));
750696
751- for (i = 0 ;i < data -> ntuples ;i ++ )
752- {
753- tupsize = IndexTupleSize (tuples );
697+ if (PageIsEmpty (page ))
698+ off = FirstOffsetNumber ;
699+ else
700+ off = OffsetNumberNext (PageGetMaxOffsetNumber (page ));
754701
755- l = PageAddItem (page , (Item )tuples ,tupsize ,off , false, false);
702+ for (i = 0 ;i < data -> ntuples ;i ++ )
703+ {
704+ tupsize = IndexTupleSize (tuples );
756705
757- if (l == InvalidOffsetNumber )
758- elog (ERROR ,"failed to add item to index page" );
706+ if (PageAddItem (page , (Item )tuples ,tupsize ,off ,
707+ false, false)== InvalidOffsetNumber )
708+ elog (ERROR ,"failed to add item to index page" );
759709
760- tuples = (IndexTuple ) (((char * )tuples )+ tupsize );
710+ tuples = (IndexTuple ) (((char * )tuples )+ tupsize );
761711
762- off ++ ;
763- }
712+ off ++ ;
713+ }
764714
765- /*
766- * Increase counter of heap tuples
767- */
768- GinPageGetOpaque (page )-> maxoff ++ ;
715+ /*
716+ * Increase counter of heap tuples
717+ */
718+ GinPageGetOpaque (page )-> maxoff ++ ;
769719
770- PageSetLSN (page ,lsn );
771- MarkBufferDirty (buffer );
772- }
773- UnlockReleaseBuffer (buffer );
774- }
720+ PageSetLSN (page ,lsn );
721+ MarkBufferDirty (buffer );
775722}
723+ if (BufferIsValid (buffer ))
724+ UnlockReleaseBuffer (buffer );
776725}
777726else if (data -> prevTail != InvalidBlockNumber )
778727{
779728/*
780729 * New tail
781730 */
782- if (record -> xl_info & XLR_BKP_BLOCK (0 ))
783- (void )RestoreBackupBlock (lsn ,record ,0 , false, false);
784- else
731+ if (XLogReadBufferForRedo (lsn ,record ,0 ,data -> node ,data -> prevTail ,
732+ & buffer )== BLK_NEEDS_REDO )
785733{
786- buffer = XLogReadBuffer (data -> node ,data -> prevTail , false);
787- if (BufferIsValid (buffer ))
788- {
789- Page page = BufferGetPage (buffer );
734+ Page page = BufferGetPage (buffer );
790735
791- if (lsn > PageGetLSN (page ))
792- {
793- GinPageGetOpaque (page )-> rightlink = data -> newRightlink ;
736+ GinPageGetOpaque (page )-> rightlink = data -> newRightlink ;
794737
795- PageSetLSN (page ,lsn );
796- MarkBufferDirty (buffer );
797- }
798- UnlockReleaseBuffer (buffer );
799- }
738+ PageSetLSN (page ,lsn );
739+ MarkBufferDirty (buffer );
800740}
741+ if (BufferIsValid (buffer ))
742+ UnlockReleaseBuffer (buffer );
801743}
802744
803745UnlockReleaseBuffer (metabuffer );