2020#include "access/transam.h"
2121#include "access/xlog.h"
2222#include "access/xlogutils.h"
23+ #include "access/ptrack.h"
2324#include "storage/procarray.h"
2425#include "miscadmin.h"
2526
@@ -83,6 +84,11 @@ _bt_restore_meta(XLogReaderState *record, uint8 block_id)
8384xl_btree_metadata * xlrec ;
8485char * ptr ;
8586Size len ;
87+ RelFileNode rnode ;
88+ BlockNumber blkno ;
89+
90+ XLogRecGetBlockTag (record ,block_id ,& rnode ,NULL ,& blkno );
91+ ptrack_add_block_redo (rnode ,blkno );
8692
8793metabuf = XLogInitBufferForRedo (record ,block_id );
8894ptr = XLogRecGetBlockData (record ,block_id ,& len );
@@ -128,6 +134,11 @@ _bt_clear_incomplete_split(XLogReaderState *record, uint8 block_id)
128134{
129135XLogRecPtr lsn = record -> EndRecPtr ;
130136Buffer buf ;
137+ RelFileNode rnode ;
138+ BlockNumber blkno ;
139+
140+ XLogRecGetBlockTag (record ,block_id ,& rnode ,NULL ,& blkno );
141+ ptrack_add_block_redo (rnode ,blkno );
131142
132143if (XLogReadBufferForRedo (record ,block_id ,& buf )== BLK_NEEDS_REDO )
133144{
@@ -151,6 +162,11 @@ btree_xlog_insert(bool isleaf, bool ismeta, XLogReaderState *record)
151162xl_btree_insert * xlrec = (xl_btree_insert * )XLogRecGetData (record );
152163Buffer buffer ;
153164Page page ;
165+ RelFileNode rnode ;
166+ BlockNumber blkno ;
167+
168+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
169+ ptrack_add_block_redo (rnode ,blkno );
154170
155171/*
156172 * Insertion to an internal page finishes an incomplete split at the child
@@ -208,11 +224,17 @@ btree_xlog_split(bool onleft, bool isroot, XLogReaderState *record)
208224BlockNumber leftsib ;
209225BlockNumber rightsib ;
210226BlockNumber rnext ;
227+ RelFileNode rnode ;
228+
229+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& leftsib );
230+ ptrack_add_block_redo (rnode ,leftsib );
231+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& rightsib );
232+ ptrack_add_block_redo (rnode ,rightsib );
211233
212- XLogRecGetBlockTag (record ,0 ,NULL ,NULL ,& leftsib );
213- XLogRecGetBlockTag (record ,1 ,NULL ,NULL ,& rightsib );
214234if (!XLogRecGetBlockTag (record ,2 ,NULL ,NULL ,& rnext ))
215235rnext = P_NONE ;
236+ else
237+ ptrack_add_block_redo (rnode ,rnext );
216238
217239/*
218240 * Clear the incomplete split flag on the left sibling of the child page
@@ -389,6 +411,12 @@ btree_xlog_vacuum(XLogReaderState *record)
389411Buffer buffer ;
390412Page page ;
391413BTPageOpaque opaque ;
414+ RelFileNode rnode ;
415+ BlockNumber blkno ;
416+
417+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
418+ ptrack_add_block_redo (rnode ,blkno );
419+
392420#ifdef UNUSED
393421xl_btree_vacuum * xlrec = (xl_btree_vacuum * )XLogRecGetData (record );
394422
@@ -567,6 +595,7 @@ btree_xlog_delete_get_latestRemovedXid(XLogReaderState *record)
567595 * overkill, but it's safe, and certainly better than panicking here.
568596 */
569597XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
598+ ptrack_add_block_redo (rnode ,blkno );
570599ibuffer = XLogReadBufferExtended (rnode ,MAIN_FORKNUM ,blkno ,RBM_NORMAL );
571600if (!BufferIsValid (ibuffer ))
572601return InvalidTransactionId ;
@@ -592,6 +621,7 @@ btree_xlog_delete_get_latestRemovedXid(XLogReaderState *record)
592621 */
593622hblkno = ItemPointerGetBlockNumber (& (itup -> t_tid ));
594623hbuffer = XLogReadBufferExtended (xlrec -> hnode ,MAIN_FORKNUM ,hblkno ,RBM_NORMAL );
624+ ptrack_add_block_redo (rnode ,hblkno );
595625if (!BufferIsValid (hbuffer ))
596626{
597627UnlockReleaseBuffer (ibuffer );
@@ -670,6 +700,11 @@ btree_xlog_delete(XLogReaderState *record)
670700Buffer buffer ;
671701Page page ;
672702BTPageOpaque opaque ;
703+ RelFileNode rnode ;
704+ BlockNumber blkno ;
705+
706+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
707+ ptrack_add_block_redo (rnode ,blkno );
673708
674709/*
675710 * If we have any conflict processing to do, it must happen before we
@@ -732,6 +767,13 @@ btree_xlog_mark_page_halfdead(uint8 info, XLogReaderState *record)
732767Page page ;
733768BTPageOpaque pageop ;
734769IndexTupleData trunctuple ;
770+ RelFileNode rnode ;
771+ BlockNumber blkno ;
772+
773+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
774+ ptrack_add_block_redo (rnode ,blkno );
775+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
776+ ptrack_add_block_redo (rnode ,blkno );
735777
736778/*
737779 * In normal operation, we would lock all the pages this WAL record
@@ -815,10 +857,27 @@ btree_xlog_unlink_page(uint8 info, XLogReaderState *record)
815857Buffer buffer ;
816858Page page ;
817859BTPageOpaque pageop ;
860+ RelFileNode rnode ;
861+ BlockNumber blkno ;
818862
819863leftsib = xlrec -> leftsib ;
820864rightsib = xlrec -> rightsib ;
821865
866+ XLogRecGetBlockTag (record ,2 ,& rnode ,NULL ,& blkno );
867+ ptrack_add_block_redo (rnode ,blkno );
868+ if (leftsib != P_NONE )
869+ {
870+ XLogRecGetBlockTag (record ,1 ,& rnode ,NULL ,& blkno );
871+ ptrack_add_block_redo (rnode ,blkno );
872+ }
873+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
874+ ptrack_add_block_redo (rnode ,blkno );
875+ if (XLogRecHasBlockRef (record ,3 ))
876+ {
877+ XLogRecGetBlockTag (record ,3 ,& rnode ,NULL ,& blkno );
878+ ptrack_add_block_redo (rnode ,blkno );
879+ }
880+
822881/*
823882 * In normal operation, we would lock all the pages this WAL record
824883 * touches before changing any of them. In WAL replay, it should be okay
@@ -929,6 +988,11 @@ btree_xlog_newroot(XLogReaderState *record)
929988BTPageOpaque pageop ;
930989char * ptr ;
931990Size len ;
991+ RelFileNode rnode ;
992+ BlockNumber blkno ;
993+
994+ XLogRecGetBlockTag (record ,0 ,& rnode ,NULL ,& blkno );
995+ ptrack_add_block_redo (rnode ,blkno );
932996
933997buffer = XLogInitBufferForRedo (record ,0 );
934998page = (Page )BufferGetPage (buffer );