20
20
static MemoryContext opCtx ; /* working memory for operations */
21
21
22
22
static void
23
- ginRedoClearIncompleteSplit (XLogRecPtr lsn , RelFileNode node , BlockNumber blkno )
23
+ ginRedoClearIncompleteSplit (XLogRecPtr lsn , XLogRecord * record ,
24
+ int block_index ,
25
+ RelFileNode node , BlockNumber blkno )
24
26
{
25
27
Buffer buffer ;
26
28
Page page ;
27
29
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 )
34
32
{
33
+ page = (Page ) BufferGetPage (buffer );
34
+
35
35
GinPageGetOpaque (page )-> flags &= ~GIN_INCOMPLETE_SPLIT ;
36
36
37
37
PageSetLSN (page , lsn );
38
38
MarkBufferDirty (buffer );
39
39
}
40
-
41
- UnlockReleaseBuffer (buffer );
40
+ if ( BufferIsValid ( buffer ))
41
+ UnlockReleaseBuffer (buffer );
42
42
}
43
43
44
44
static void
@@ -332,7 +332,6 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record)
332
332
{
333
333
ginxlogInsert * data = (ginxlogInsert * ) XLogRecGetData (record );
334
334
Buffer buffer ;
335
- Page page ;
336
335
char * payload ;
337
336
BlockNumber leftChildBlkno = InvalidBlockNumber ;
338
337
BlockNumber rightChildBlkno = InvalidBlockNumber ;
@@ -351,26 +350,14 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record)
351
350
rightChildBlkno = BlockIdGetBlockNumber ((BlockId ) payload );
352
351
payload += sizeof (BlockIdData );
353
352
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 );
358
354
}
359
355
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 )
362
358
{
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 );
371
360
372
- if (lsn > PageGetLSN (page ))
373
- {
374
361
/* How to insert the payload is tree-type specific */
375
362
if (data -> flags & GIN_INSERT_ISDATA )
376
363
{
@@ -386,8 +373,8 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record)
386
373
PageSetLSN (page , lsn );
387
374
MarkBufferDirty (buffer );
388
375
}
389
-
390
- UnlockReleaseBuffer (buffer );
376
+ if ( BufferIsValid ( buffer ))
377
+ UnlockReleaseBuffer (buffer );
391
378
}
392
379
393
380
static void
@@ -476,12 +463,7 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
476
463
* split
477
464
*/
478
465
if (!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 );
485
467
486
468
flags = 0 ;
487
469
if (isLeaf )
@@ -605,31 +587,21 @@ ginRedoVacuumDataLeafPage(XLogRecPtr lsn, XLogRecord *record)
605
587
{
606
588
ginxlogVacuumDataLeafPage * xlrec = (ginxlogVacuumDataLeafPage * ) XLogRecGetData (record );
607
589
Buffer buffer ;
608
- Page page ;
609
590
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 )
612
593
{
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 );
621
595
622
- Assert (GinPageIsLeaf (page ));
623
- Assert (GinPageIsData (page ));
596
+ Assert (GinPageIsLeaf (page ));
597
+ Assert (GinPageIsData (page ));
624
598
625
- if (lsn > PageGetLSN (page ))
626
- {
627
599
ginRedoRecompress (page , & xlrec -> data );
628
600
PageSetLSN (page , lsn );
629
601
MarkBufferDirty (buffer );
630
602
}
631
-
632
- UnlockReleaseBuffer (buffer );
603
+ if ( BufferIsValid ( buffer ))
604
+ UnlockReleaseBuffer (buffer );
633
605
}
634
606
635
607
static void
@@ -641,62 +613,42 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
641
613
Buffer lbuffer ;
642
614
Page page ;
643
615
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 )
647
618
{
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 );
660
625
}
661
626
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 )
665
629
{
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 );
679
637
}
680
638
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 )
684
641
{
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 );
698
648
}
699
649
650
+ if (BufferIsValid (lbuffer ))
651
+ UnlockReleaseBuffer (lbuffer );
700
652
if (BufferIsValid (pbuffer ))
701
653
UnlockReleaseBuffer (pbuffer );
702
654
if (BufferIsValid (dbuffer ))
@@ -730,74 +682,64 @@ ginRedoUpdateMetapage(XLogRecPtr lsn, XLogRecord *record)
730
682
/*
731
683
* insert into tail page
732
684
*/
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 )
736
688
{
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 ;
741
694
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 ));
750
696
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 ));
754
701
755
- l = PageAddItem (page , (Item ) tuples , tupsize , off , false, false);
702
+ for (i = 0 ; i < data -> ntuples ; i ++ )
703
+ {
704
+ tupsize = IndexTupleSize (tuples );
756
705
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" );
759
709
760
- tuples = (IndexTuple ) (((char * ) tuples ) + tupsize );
710
+ tuples = (IndexTuple ) (((char * ) tuples ) + tupsize );
761
711
762
- off ++ ;
763
- }
712
+ off ++ ;
713
+ }
764
714
765
- /*
766
- * Increase counter of heap tuples
767
- */
768
- GinPageGetOpaque (page )-> maxoff ++ ;
715
+ /*
716
+ * Increase counter of heap tuples
717
+ */
718
+ GinPageGetOpaque (page )-> maxoff ++ ;
769
719
770
- PageSetLSN (page , lsn );
771
- MarkBufferDirty (buffer );
772
- }
773
- UnlockReleaseBuffer (buffer );
774
- }
720
+ PageSetLSN (page , lsn );
721
+ MarkBufferDirty (buffer );
775
722
}
723
+ if (BufferIsValid (buffer ))
724
+ UnlockReleaseBuffer (buffer );
776
725
}
777
726
else if (data -> prevTail != InvalidBlockNumber )
778
727
{
779
728
/*
780
729
* New tail
781
730
*/
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 )
785
733
{
786
- buffer = XLogReadBuffer (data -> node , data -> prevTail , false);
787
- if (BufferIsValid (buffer ))
788
- {
789
- Page page = BufferGetPage (buffer );
734
+ Page page = BufferGetPage (buffer );
790
735
791
- if (lsn > PageGetLSN (page ))
792
- {
793
- GinPageGetOpaque (page )-> rightlink = data -> newRightlink ;
736
+ GinPageGetOpaque (page )-> rightlink = data -> newRightlink ;
794
737
795
- PageSetLSN (page , lsn );
796
- MarkBufferDirty (buffer );
797
- }
798
- UnlockReleaseBuffer (buffer );
799
- }
738
+ PageSetLSN (page , lsn );
739
+ MarkBufferDirty (buffer );
800
740
}
741
+ if (BufferIsValid (buffer ))
742
+ UnlockReleaseBuffer (buffer );
801
743
}
802
744
803
745
UnlockReleaseBuffer (metabuffer );
0 commit comments