1515
1616#include "access/gin_private.h"
1717#include "access/xlogutils.h"
18+ #include "access/ptrack.h"
1819#include "utils/memutils.h"
1920
2021static MemoryContext opCtx ;/* working memory for operations */
@@ -25,6 +26,11 @@ ginRedoClearIncompleteSplit(XLogReaderState *record, uint8 block_id)
2526XLogRecPtr lsn = record -> EndRecPtr ;
2627Buffer buffer ;
2728Page page ;
29+ RelFileNode rnode ;
30+ BlockNumber blkno ;
31+
32+ XLogRecGetBlockTag (record ,block_id ,& rnode ,NULL ,& blkno );
33+ ptrack_add_block_redo (rnode ,blkno );
2834
2935if (XLogReadBufferForRedo (record ,block_id ,& buffer )== BLK_NEEDS_REDO )
3036{
@@ -45,8 +51,12 @@ ginRedoCreateIndex(XLogReaderState *record)
4551Buffer RootBuffer ,
4652MetaBuffer ;
4753Page page ;
54+ RelFileNode rnode ;
55+
56+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,NULL );
4857
4958MetaBuffer = XLogInitBufferForRedo (record ,0 );
59+ ptrack_add_block_redo (rnode ,BufferGetBlockNumber (MetaBuffer ));
5060Assert (BufferGetBlockNumber (MetaBuffer )== GIN_METAPAGE_BLKNO );
5161page = (Page )BufferGetPage (MetaBuffer );
5262
@@ -56,6 +66,7 @@ ginRedoCreateIndex(XLogReaderState *record)
5666MarkBufferDirty (MetaBuffer );
5767
5868RootBuffer = XLogInitBufferForRedo (record ,1 );
69+ ptrack_add_block_redo (rnode ,BufferGetBlockNumber (RootBuffer ));
5970Assert (BufferGetBlockNumber (RootBuffer )== GIN_ROOT_BLKNO );
6071page = (Page )BufferGetPage (RootBuffer );
6172
@@ -76,8 +87,13 @@ ginRedoCreatePTree(XLogReaderState *record)
7687char * ptr ;
7788Buffer buffer ;
7889Page page ;
90+ RelFileNode rnode ;
91+
92+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,NULL );
7993
8094buffer = XLogInitBufferForRedo (record ,0 );
95+ ptrack_add_block_redo (rnode ,BufferGetBlockNumber (buffer ));
96+
8197page = (Page )BufferGetPage (buffer );
8298
8399GinInitBuffer (buffer ,GIN_DATA |GIN_LEAF |GIN_COMPRESSED );
@@ -329,6 +345,11 @@ ginRedoInsert(XLogReaderState *record)
329345#endif
330346BlockNumber rightChildBlkno = InvalidBlockNumber ;
331347bool isLeaf = (data -> flags & GIN_INSERT_ISLEAF )!= 0 ;
348+ RelFileNode rnode ;
349+ BlockNumber blkno ;
350+
351+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
352+ ptrack_add_block_redo (rnode ,blkno );
332353
333354/*
334355 * First clear incomplete-split flag on child page if this finishes a
@@ -382,6 +403,18 @@ ginRedoSplit(XLogReaderState *record)
382403rootbuf ;
383404bool isLeaf = (data -> flags & GIN_INSERT_ISLEAF )!= 0 ;
384405bool isRoot = (data -> flags & GIN_SPLIT_ROOT )!= 0 ;
406+ RelFileNode rnode ;
407+ BlockNumber blkno ;
408+
409+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
410+ ptrack_add_block_redo (rnode ,blkno );
411+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
412+ ptrack_add_block_redo (rnode ,blkno );
413+ if (isRoot )
414+ {
415+ XLogRecGetBlockTag (record ,2 ,& rnode ,NULL ,& blkno );
416+ ptrack_add_block_redo (rnode ,blkno );
417+ }
385418
386419/*
387420 * First clear incomplete-split flag on child page if this finishes a
@@ -415,6 +448,11 @@ static void
415448ginRedoVacuumPage (XLogReaderState * record )
416449{
417450Buffer buffer ;
451+ RelFileNode rnode ;
452+ BlockNumber blkno ;
453+
454+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
455+ ptrack_add_block_redo (rnode ,blkno );
418456
419457if (XLogReadBufferForRedo (record ,0 ,& buffer )!= BLK_RESTORED )
420458{
@@ -428,6 +466,11 @@ ginRedoVacuumDataLeafPage(XLogReaderState *record)
428466{
429467XLogRecPtr lsn = record -> EndRecPtr ;
430468Buffer buffer ;
469+ RelFileNode rnode ;
470+ BlockNumber blkno ;
471+
472+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
473+ ptrack_add_block_redo (rnode ,blkno );
431474
432475if (XLogReadBufferForRedo (record ,0 ,& buffer )== BLK_NEEDS_REDO )
433476{
@@ -457,6 +500,15 @@ ginRedoDeletePage(XLogReaderState *record)
457500Buffer pbuffer ;
458501Buffer lbuffer ;
459502Page page ;
503+ RelFileNode rnode ;
504+ BlockNumber blkno ;
505+
506+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
507+ ptrack_add_block_redo (rnode ,blkno );
508+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
509+ ptrack_add_block_redo (rnode ,blkno );
510+ XLogRecGetBlockTag (record ,2 ,& rnode ,NULL ,& blkno );
511+ ptrack_add_block_redo (rnode ,blkno );
460512
461513if (XLogReadBufferForRedo (record ,0 ,& dbuffer )== BLK_NEEDS_REDO )
462514{
@@ -502,6 +554,13 @@ ginRedoUpdateMetapage(XLogReaderState *record)
502554Buffer metabuffer ;
503555Page metapage ;
504556Buffer buffer ;
557+ RelFileNode rnode ;
558+ BlockNumber blkno ;
559+
560+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
561+ ptrack_add_block_redo (rnode ,blkno );
562+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
563+ ptrack_add_block_redo (rnode ,blkno );
505564
506565/*
507566 * Restore the metapage. This is essentially the same as a full-page
@@ -600,6 +659,11 @@ ginRedoInsertListPage(XLogReaderState *record)
600659char * payload ;
601660IndexTuple tuples ;
602661Size totaltupsize ;
662+ RelFileNode rnode ;
663+ BlockNumber blkno ;
664+
665+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
666+ ptrack_add_block_redo (rnode ,blkno );
603667
604668/* We always re-initialize the page. */
605669buffer = XLogInitBufferForRedo (record ,0 );
@@ -649,6 +713,11 @@ ginRedoDeleteListPages(XLogReaderState *record)
649713Buffer metabuffer ;
650714Page metapage ;
651715int i ;
716+ RelFileNode rnode ;
717+ BlockNumber blkno ;
718+
719+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
720+ ptrack_add_block_redo (rnode ,blkno );
652721
653722metabuffer = XLogInitBufferForRedo (record ,0 );
654723Assert (BufferGetBlockNumber (metabuffer )== GIN_METAPAGE_BLKNO );
@@ -680,6 +749,9 @@ ginRedoDeleteListPages(XLogReaderState *record)
680749Buffer buffer ;
681750Page page ;
682751
752+ XLogRecGetBlockTag (record ,i + 1 ,& rnode ,NULL ,& blkno );
753+ ptrack_add_block_redo (rnode ,blkno );
754+
683755buffer = XLogInitBufferForRedo (record ,i + 1 );
684756page = BufferGetPage (buffer );
685757GinInitBuffer (buffer ,GIN_DELETED );