1818#include "access/transam.h"
1919#include "access/xlog.h"
2020#include "access/xlogutils.h"
21+ #include "access/ptrack.h"
2122#include "storage/standby.h"
2223#include "utils/memutils.h"
2324
@@ -76,6 +77,15 @@ spgRedoCreateIndex(XLogReaderState *record)
7677XLogRecPtr lsn = record -> EndRecPtr ;
7778Buffer buffer ;
7879Page page ;
80+ RelFileNode rnode ;
81+ BlockNumber blkno ;
82+
83+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
84+ ptrack_add_block_redo (rnode ,blkno );
85+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
86+ ptrack_add_block_redo (rnode ,blkno );
87+ XLogRecGetBlockTag (record ,2 ,& rnode ,NULL ,& blkno );
88+ ptrack_add_block_redo (rnode ,blkno );
7989
8090buffer = XLogInitBufferForRedo (record ,0 );
8191Assert (BufferGetBlockNumber (buffer )== SPGIST_METAPAGE_BLKNO );
@@ -113,6 +123,16 @@ spgRedoAddLeaf(XLogReaderState *record)
113123Buffer buffer ;
114124Page page ;
115125XLogRedoAction action ;
126+ RelFileNode rnode ;
127+ BlockNumber blkno ;
128+
129+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
130+ ptrack_add_block_redo (rnode ,blkno );
131+ if (xldata -> offnumParent != InvalidOffsetNumber )
132+ {
133+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
134+ ptrack_add_block_redo (rnode ,blkno );
135+ }
116136
117137ptr += sizeof (spgxlogAddLeaf );
118138leafTuple = ptr ;
@@ -213,8 +233,15 @@ spgRedoMoveLeafs(XLogReaderState *record)
213233Page page ;
214234XLogRedoAction action ;
215235BlockNumber blknoDst ;
236+ RelFileNode rnode ;
237+ BlockNumber blkno ;
216238
217- XLogRecGetBlockTag (record ,1 ,NULL ,NULL ,& blknoDst );
239+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blknoDst );
240+ ptrack_add_block_redo (rnode ,blknoDst );
241+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
242+ ptrack_add_block_redo (rnode ,blkno );
243+ XLogRecGetBlockTag (record ,2 ,& rnode ,NULL ,& blkno );
244+ ptrack_add_block_redo (rnode ,blkno );
218245
219246fillFakeState (& state ,xldata -> stateSrc );
220247
@@ -324,6 +351,21 @@ spgRedoAddNode(XLogReaderState *record)
324351Buffer buffer ;
325352Page page ;
326353XLogRedoAction action ;
354+ RelFileNode rnode ;
355+ BlockNumber blkno ;
356+
357+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
358+ ptrack_add_block_redo (rnode ,blkno );
359+ if (XLogRecHasBlockRef (record ,1 ))
360+ {
361+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
362+ ptrack_add_block_redo (rnode ,blkno );
363+ }
364+ if (xldata -> parentBlk == 2 )
365+ {
366+ XLogRecGetBlockTag (record ,2 ,& rnode ,NULL ,& blkno );
367+ ptrack_add_block_redo (rnode ,blkno );
368+ }
327369
328370ptr += sizeof (spgxlogAddNode );
329371innerTuple = ptr ;
@@ -492,6 +534,13 @@ spgRedoSplitTuple(XLogReaderState *record)
492534Buffer buffer ;
493535Page page ;
494536XLogRedoAction action ;
537+ RelFileNode rnode ;
538+ BlockNumber blkno ;
539+
540+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
541+ ptrack_add_block_redo (rnode ,blkno );
542+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
543+ ptrack_add_block_redo (rnode ,blkno );
495544
496545ptr += sizeof (spgxlogSplitTuple );
497546prefixTuple = ptr ;
@@ -578,8 +627,23 @@ spgRedoPickSplit(XLogReaderState *record)
578627int i ;
579628BlockNumber blknoInner ;
580629XLogRedoAction action ;
581-
582- XLogRecGetBlockTag (record ,2 ,NULL ,NULL ,& blknoInner );
630+ RelFileNode rnode ;
631+ BlockNumber blkno ;
632+
633+ XLogRecGetBlockTag (record ,2 ,& rnode ,NULL ,& blknoInner );
634+ ptrack_add_block_redo (rnode ,blknoInner );
635+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
636+ ptrack_add_block_redo (rnode ,blkno );
637+ if (XLogRecHasBlockRef (record ,1 ))
638+ {
639+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
640+ ptrack_add_block_redo (rnode ,blkno );
641+ }
642+ if (XLogRecHasBlockRef (record ,3 ))
643+ {
644+ XLogRecGetBlockTag (record ,3 ,& rnode ,NULL ,& blkno );
645+ ptrack_add_block_redo (rnode ,blkno );
646+ }
583647
584648fillFakeState (& state ,xldata -> stateSrc );
585649
@@ -795,6 +859,11 @@ spgRedoVacuumLeaf(XLogReaderState *record)
795859Buffer buffer ;
796860Page page ;
797861int i ;
862+ RelFileNode rnode ;
863+ BlockNumber blkno ;
864+
865+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
866+ ptrack_add_block_redo (rnode ,blkno );
798867
799868fillFakeState (& state ,xldata -> stateSrc );
800869
@@ -871,6 +940,11 @@ spgRedoVacuumRoot(XLogReaderState *record)
871940OffsetNumber * toDelete ;
872941Buffer buffer ;
873942Page page ;
943+ RelFileNode rnode ;
944+ BlockNumber blkno ;
945+
946+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
947+ ptrack_add_block_redo (rnode ,blkno );
874948
875949toDelete = xldata -> offsets ;
876950
@@ -896,6 +970,11 @@ spgRedoVacuumRedirect(XLogReaderState *record)
896970spgxlogVacuumRedirect * xldata = (spgxlogVacuumRedirect * )ptr ;
897971OffsetNumber * itemToPlaceholder ;
898972Buffer buffer ;
973+ RelFileNode rnode ;
974+ BlockNumber blkno ;
975+
976+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
977+ ptrack_add_block_redo (rnode ,blkno );
899978
900979itemToPlaceholder = xldata -> offsets ;
901980