@@ -2501,6 +2501,11 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid,
2501
2501
}
2502
2502
2503
2503
XLogBeginInsert ();
2504
+ if (info & XLOG_HEAP_INIT_PAGE )
2505
+ {
2506
+ PageHeader header = (PageHeader ) page ;
2507
+ XLogRegisterData ((char * ) & header -> pd_xid_epoch , sizeof (TransactionId ));
2508
+ }
2504
2509
XLogRegisterData ((char * ) & xlrec , SizeOfHeapInsert );
2505
2510
2506
2511
xlhdr .t_infomask2 = heaptup -> t_data -> t_infomask2 ;
@@ -3277,6 +3282,11 @@ heap_multi_insert(Relation relation, HeapTuple *tuples, int ntuples,
3277
3282
bufflags |= REGBUF_KEEP_DATA ;
3278
3283
3279
3284
XLogBeginInsert ();
3285
+ if (info & XLOG_HEAP_INIT_PAGE )
3286
+ {
3287
+ PageHeader header = (PageHeader ) page ;
3288
+ XLogRegisterData ((char * ) & header -> pd_xid_epoch , sizeof (TransactionId ));
3289
+ }
3280
3290
XLogRegisterData ((char * ) xlrec , tupledata - scratch );
3281
3291
XLogRegisterBuffer (0 , buffer , REGBUF_STANDARD | bufflags );
3282
3292
@@ -8138,6 +8148,11 @@ log_heap_update(Relation reln, Buffer oldbuf,
8138
8148
if (oldbuf != newbuf )
8139
8149
XLogRegisterBuffer (1 , oldbuf , REGBUF_STANDARD );
8140
8150
8151
+ if (info & XLOG_HEAP_INIT_PAGE )
8152
+ {
8153
+ PageHeader header = (PageHeader ) page ;
8154
+ XLogRegisterData ((char * ) & header -> pd_xid_epoch , sizeof (TransactionId ));
8155
+ }
8141
8156
XLogRegisterData ((char * ) & xlrec , SizeOfHeapUpdate );
8142
8157
8143
8158
/*
@@ -8795,7 +8810,7 @@ static void
8795
8810
heap_xlog_insert (XLogReaderState * record )
8796
8811
{
8797
8812
XLogRecPtr lsn = record -> EndRecPtr ;
8798
- xl_heap_insert * xlrec = ( xl_heap_insert * ) XLogRecGetData ( record ) ;
8813
+ xl_heap_insert * xlrec ;
8799
8814
Buffer buffer ;
8800
8815
Page page ;
8801
8816
union
@@ -8811,6 +8826,18 @@ heap_xlog_insert(XLogReaderState *record)
8811
8826
BlockNumber blkno ;
8812
8827
ItemPointerData target_tid ;
8813
8828
XLogRedoAction action ;
8829
+ bool isinit = (XLogRecGetInfo (record ) & XLOG_HEAP_INIT_PAGE ) != 0 ;
8830
+ TransactionId pd_xid_epoch = InvalidTransactionId ;
8831
+ Pointer rec_data ;
8832
+
8833
+ rec_data = (Pointer ) XLogRecGetData (record );
8834
+ if (isinit )
8835
+ {
8836
+ pd_xid_epoch = * ((TransactionId * ) rec_data );
8837
+ rec_data += sizeof (TransactionId );
8838
+ }
8839
+
8840
+ xlrec = (xl_heap_insert * ) rec_data ;
8814
8841
8815
8842
XLogRecGetBlockTag (record , 0 , & target_node , NULL , & blkno );
8816
8843
ItemPointerSetBlockNumber (& target_tid , blkno );
@@ -8835,11 +8862,15 @@ heap_xlog_insert(XLogReaderState *record)
8835
8862
* If we inserted the first and only tuple on the page, re-initialize the
8836
8863
* page from scratch.
8837
8864
*/
8838
- if (XLogRecGetInfo ( record ) & XLOG_HEAP_INIT_PAGE )
8865
+ if (isinit )
8839
8866
{
8867
+ PageHeader header ;
8868
+
8840
8869
buffer = XLogInitBufferForRedo (record , 0 );
8841
8870
page = BufferGetPage (buffer );
8842
8871
PageInit (page , BufferGetPageSize (buffer ), 0 );
8872
+ header = (PageHeader ) page ;
8873
+ header -> pd_xid_epoch = pd_xid_epoch ;
8843
8874
action = BLK_NEEDS_REDO ;
8844
8875
}
8845
8876
else
@@ -8927,12 +8958,20 @@ heap_xlog_multi_insert(XLogReaderState *record)
8927
8958
int i ;
8928
8959
bool isinit = (XLogRecGetInfo (record ) & XLOG_HEAP_INIT_PAGE ) != 0 ;
8929
8960
XLogRedoAction action ;
8961
+ TransactionId pd_xid_epoch = InvalidTransactionId ;
8962
+ Pointer rec_data ;
8930
8963
8931
8964
/*
8932
8965
* Insertion doesn't overwrite MVCC data, so no conflict processing is
8933
8966
* required.
8934
8967
*/
8935
- xlrec = (xl_heap_multi_insert * ) XLogRecGetData (record );
8968
+ rec_data = (Pointer ) XLogRecGetData (record );
8969
+ if (isinit )
8970
+ {
8971
+ pd_xid_epoch = * ((TransactionId * ) rec_data );
8972
+ rec_data += sizeof (TransactionId );
8973
+ }
8974
+ xlrec = (xl_heap_multi_insert * ) rec_data ;
8936
8975
8937
8976
XLogRecGetBlockTag (record , 0 , & rnode , NULL , & blkno );
8938
8977
@@ -8953,9 +8992,13 @@ heap_xlog_multi_insert(XLogReaderState *record)
8953
8992
8954
8993
if (isinit )
8955
8994
{
8995
+ PageHeader header ;
8996
+
8956
8997
buffer = XLogInitBufferForRedo (record , 0 );
8957
8998
page = BufferGetPage (buffer );
8958
8999
PageInit (page , BufferGetPageSize (buffer ), 0 );
9000
+ header = (PageHeader ) page ;
9001
+ header -> pd_xid_epoch = pd_xid_epoch ;
8959
9002
action = BLK_NEEDS_REDO ;
8960
9003
}
8961
9004
else
@@ -9050,7 +9093,7 @@ static void
9050
9093
heap_xlog_update (XLogReaderState * record , bool hot_update )
9051
9094
{
9052
9095
XLogRecPtr lsn = record -> EndRecPtr ;
9053
- xl_heap_update * xlrec = ( xl_heap_update * ) XLogRecGetData ( record ) ;
9096
+ xl_heap_update * xlrec ;
9054
9097
RelFileNode rnode ;
9055
9098
BlockNumber oldblk ;
9056
9099
BlockNumber newblk ;
@@ -9075,6 +9118,18 @@ heap_xlog_update(XLogReaderState *record, bool hot_update)
9075
9118
Size freespace = 0 ;
9076
9119
XLogRedoAction oldaction ;
9077
9120
XLogRedoAction newaction ;
9121
+ bool isinit = (XLogRecGetInfo (record ) & XLOG_HEAP_INIT_PAGE ) != 0 ;
9122
+ TransactionId pd_xid_epoch = InvalidTransactionId ;
9123
+ Pointer rec_data ;
9124
+
9125
+ rec_data = (Pointer * ) XLogRecGetData (record );
9126
+ if (isinit )
9127
+ {
9128
+ pd_xid_epoch = * ((TransactionId * ) rec_data );
9129
+ rec_data += sizeof (TransactionId );
9130
+ }
9131
+
9132
+ xlrec = (xl_heap_update * ) rec_data ;
9078
9133
9079
9134
/* initialize to keep the compiler quiet */
9080
9135
oldtup .t_data = NULL ;
@@ -9166,11 +9221,15 @@ heap_xlog_update(XLogReaderState *record, bool hot_update)
9166
9221
nbuffer = obuffer ;
9167
9222
newaction = oldaction ;
9168
9223
}
9169
- else if (XLogRecGetInfo ( record ) & XLOG_HEAP_INIT_PAGE )
9224
+ else if (isinit )
9170
9225
{
9226
+ PageHeader header ;
9227
+
9171
9228
nbuffer = XLogInitBufferForRedo (record , 0 );
9172
9229
page = (Page ) BufferGetPage (nbuffer );
9173
9230
PageInit (page , BufferGetPageSize (nbuffer ), 0 );
9231
+ header = (PageHeader ) page ;
9232
+ header -> pd_xid_epoch = pd_xid_epoch ;
9174
9233
newaction = BLK_NEEDS_REDO ;
9175
9234
}
9176
9235
else
0 commit comments