20
20
#include "access/transam.h"
21
21
#include "access/xlog.h"
22
22
#include "access/xlogutils.h"
23
+ #include "access/ptrack.h"
23
24
#include "storage/procarray.h"
24
25
#include "miscadmin.h"
25
26
@@ -83,6 +84,11 @@ _bt_restore_meta(XLogReaderState *record, uint8 block_id)
83
84
xl_btree_metadata * xlrec ;
84
85
char * ptr ;
85
86
Size len ;
87
+ RelFileNode rnode ;
88
+ BlockNumber blkno ;
89
+
90
+ XLogRecGetBlockTag (record , block_id , & rnode , NULL , & blkno );
91
+ ptrack_add_block_redo (rnode , blkno );
86
92
87
93
metabuf = XLogInitBufferForRedo (record , block_id );
88
94
ptr = XLogRecGetBlockData (record , block_id , & len );
@@ -128,6 +134,11 @@ _bt_clear_incomplete_split(XLogReaderState *record, uint8 block_id)
128
134
{
129
135
XLogRecPtr lsn = record -> EndRecPtr ;
130
136
Buffer buf ;
137
+ RelFileNode rnode ;
138
+ BlockNumber blkno ;
139
+
140
+ XLogRecGetBlockTag (record , block_id , & rnode , NULL , & blkno );
141
+ ptrack_add_block_redo (rnode , blkno );
131
142
132
143
if (XLogReadBufferForRedo (record , block_id , & buf ) == BLK_NEEDS_REDO )
133
144
{
@@ -151,6 +162,11 @@ btree_xlog_insert(bool isleaf, bool ismeta, XLogReaderState *record)
151
162
xl_btree_insert * xlrec = (xl_btree_insert * ) XLogRecGetData (record );
152
163
Buffer buffer ;
153
164
Page page ;
165
+ RelFileNode rnode ;
166
+ BlockNumber blkno ;
167
+
168
+ XLogRecGetBlockTag (record , 0 , & rnode , NULL , & blkno );
169
+ ptrack_add_block_redo (rnode , blkno );
154
170
155
171
/*
156
172
* 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)
208
224
BlockNumber leftsib ;
209
225
BlockNumber rightsib ;
210
226
BlockNumber 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 );
211
233
212
- XLogRecGetBlockTag (record , 0 , NULL , NULL , & leftsib );
213
- XLogRecGetBlockTag (record , 1 , NULL , NULL , & rightsib );
214
234
if (!XLogRecGetBlockTag (record , 2 , NULL , NULL , & rnext ))
215
235
rnext = P_NONE ;
236
+ else
237
+ ptrack_add_block_redo (rnode , rnext );
216
238
217
239
/*
218
240
* Clear the incomplete split flag on the left sibling of the child page
@@ -389,6 +411,12 @@ btree_xlog_vacuum(XLogReaderState *record)
389
411
Buffer buffer ;
390
412
Page page ;
391
413
BTPageOpaque opaque ;
414
+ RelFileNode rnode ;
415
+ BlockNumber blkno ;
416
+
417
+ XLogRecGetBlockTag (record , 0 , & rnode , NULL , & blkno );
418
+ ptrack_add_block_redo (rnode , blkno );
419
+
392
420
#ifdef UNUSED
393
421
xl_btree_vacuum * xlrec = (xl_btree_vacuum * ) XLogRecGetData (record );
394
422
@@ -567,6 +595,7 @@ btree_xlog_delete_get_latestRemovedXid(XLogReaderState *record)
567
595
* overkill, but it's safe, and certainly better than panicking here.
568
596
*/
569
597
XLogRecGetBlockTag (record , 0 , & rnode , NULL , & blkno );
598
+ ptrack_add_block_redo (rnode , blkno );
570
599
ibuffer = XLogReadBufferExtended (rnode , MAIN_FORKNUM , blkno , RBM_NORMAL );
571
600
if (!BufferIsValid (ibuffer ))
572
601
return InvalidTransactionId ;
@@ -592,6 +621,7 @@ btree_xlog_delete_get_latestRemovedXid(XLogReaderState *record)
592
621
*/
593
622
hblkno = ItemPointerGetBlockNumber (& (itup -> t_tid ));
594
623
hbuffer = XLogReadBufferExtended (xlrec -> hnode , MAIN_FORKNUM , hblkno , RBM_NORMAL );
624
+ ptrack_add_block_redo (rnode , hblkno );
595
625
if (!BufferIsValid (hbuffer ))
596
626
{
597
627
UnlockReleaseBuffer (ibuffer );
@@ -670,6 +700,11 @@ btree_xlog_delete(XLogReaderState *record)
670
700
Buffer buffer ;
671
701
Page page ;
672
702
BTPageOpaque opaque ;
703
+ RelFileNode rnode ;
704
+ BlockNumber blkno ;
705
+
706
+ XLogRecGetBlockTag (record , 0 , & rnode , NULL , & blkno );
707
+ ptrack_add_block_redo (rnode , blkno );
673
708
674
709
/*
675
710
* 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)
732
767
Page page ;
733
768
BTPageOpaque pageop ;
734
769
IndexTupleData 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 );
735
777
736
778
/*
737
779
* In normal operation, we would lock all the pages this WAL record
@@ -815,10 +857,27 @@ btree_xlog_unlink_page(uint8 info, XLogReaderState *record)
815
857
Buffer buffer ;
816
858
Page page ;
817
859
BTPageOpaque pageop ;
860
+ RelFileNode rnode ;
861
+ BlockNumber blkno ;
818
862
819
863
leftsib = xlrec -> leftsib ;
820
864
rightsib = xlrec -> rightsib ;
821
865
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
+
822
881
/*
823
882
* In normal operation, we would lock all the pages this WAL record
824
883
* touches before changing any of them. In WAL replay, it should be okay
@@ -929,6 +988,11 @@ btree_xlog_newroot(XLogReaderState *record)
929
988
BTPageOpaque pageop ;
930
989
char * ptr ;
931
990
Size len ;
991
+ RelFileNode rnode ;
992
+ BlockNumber blkno ;
993
+
994
+ XLogRecGetBlockTag (record , 0 , & rnode , NULL , & blkno );
995
+ ptrack_add_block_redo (rnode , blkno );
932
996
933
997
buffer = XLogInitBufferForRedo (record , 0 );
934
998
page = (Page ) BufferGetPage (buffer );
0 commit comments