@@ -72,7 +72,7 @@ report_invalid_record(XLogReaderState *state, const char *fmt,...)
72
72
* Returns NULL if the xlogreader couldn't be allocated.
73
73
*/
74
74
XLogReaderState *
75
- XLogReaderAllocate (int wal_segment_size , const char * waldir ,
75
+ XLogReaderAllocate (int wal_segment_size , int page_size , const char * waldir ,
76
76
WALSegmentCleanupCB cleanup_cb )
77
77
{
78
78
XLogReaderState * state ;
@@ -87,6 +87,7 @@ XLogReaderAllocate(int wal_segment_size, const char *waldir,
87
87
state -> cleanup_cb = cleanup_cb ;
88
88
89
89
state -> max_block_id = -1 ;
90
+ state -> pageSize = page_size ;
90
91
91
92
/*
92
93
* Permanently allocate readBuf. We do it this way, rather than just
@@ -95,7 +96,7 @@ XLogReaderAllocate(int wal_segment_size, const char *waldir,
95
96
* isn't guaranteed to have any particular alignment, whereas
96
97
* palloc_extended() will provide MAXALIGN'd storage.
97
98
*/
98
- state -> readBuf = (char * ) palloc_extended (XLOG_BLCKSZ ,
99
+ state -> readBuf = (char * ) palloc_extended (state -> pageSize ,
99
100
MCXT_ALLOC_NO_OOM );
100
101
if (!state -> readBuf )
101
102
{
@@ -163,7 +164,7 @@ XLogReaderFree(XLogReaderState *state)
163
164
* readRecordBufSize is set to the new buffer size.
164
165
*
165
166
* To avoid useless small increases, round its size to a multiple of
166
- * XLOG_BLCKSZ , and make sure it's at least 5*Max(BLCKSZ, XLOG_BLCKSZ ) to start
167
+ * page size , and make sure it's at least 5*Max(BLCKSZ, <page size> ) to start
167
168
* with. (That is enough for all "normal" records, but very large commit or
168
169
* abort records might need more space.)
169
170
*/
@@ -172,8 +173,8 @@ allocate_recordbuf(XLogReaderState *state, uint32 reclength)
172
173
{
173
174
uint32 newSize = reclength ;
174
175
175
- newSize += XLOG_BLCKSZ - (newSize % XLOG_BLCKSZ );
176
- newSize = Max (newSize , 5 * Max (BLCKSZ , XLOG_BLCKSZ ));
176
+ newSize += state -> pageSize - (newSize % state -> pageSize );
177
+ newSize = Max (newSize , 5 * Max (BLCKSZ , state -> pageSize ));
177
178
178
179
#ifndef FRONTEND
179
180
238
239
XLogBeginRead (XLogReaderState * state , XLogRecPtr RecPtr )
239
240
{
240
241
Assert (!XLogRecPtrIsInvalid (RecPtr ));
242
+ Assert (state -> readBuf != NULL &&
243
+ state -> readBuf == (void * ) MAXALIGN (state -> readBuf ));
241
244
242
245
ResetDecoder (state );
243
246
@@ -366,15 +369,15 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
366
369
XLogPageHeader pageHeader ;
367
370
368
371
targetPagePtr =
369
- state -> ReadRecPtr - (state -> ReadRecPtr % XLOG_BLCKSZ );
370
- targetRecOff = state -> ReadRecPtr % XLOG_BLCKSZ ;
372
+ state -> ReadRecPtr - (state -> ReadRecPtr % state -> pageSize );
373
+ targetRecOff = state -> ReadRecPtr % state -> pageSize ;
371
374
372
375
/*
373
376
* Check if we have enough data. For the first record in the page,
374
377
* the requesting length doesn't contain page header.
375
378
*/
376
379
if (XLogNeedData (state , targetPagePtr ,
377
- Min (targetRecOff + SizeOfXLogRecord , XLOG_BLCKSZ ),
380
+ Min (targetRecOff + SizeOfXLogRecord , state -> pageSize ),
378
381
targetRecOff != 0 ))
379
382
return XLREAD_NEED_DATA ;
380
383
@@ -421,7 +424,7 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
421
424
* verified that we got the whole header.
422
425
*/
423
426
prec = (XLogRecord * ) (state -> readBuf +
424
- state -> ReadRecPtr % XLOG_BLCKSZ );
427
+ state -> ReadRecPtr % state -> pageSize );
425
428
total_len = prec -> xl_tot_len ;
426
429
427
430
/*
@@ -432,7 +435,7 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
432
435
* ensure that we enter the XLREAD_CONTINUATION state below;
433
436
* otherwise we might fail to apply ValidXLogRecordHeader at all.
434
437
*/
435
- if (targetRecOff <= XLOG_BLCKSZ - SizeOfXLogRecord )
438
+ if (targetRecOff <= state -> pageSize - SizeOfXLogRecord )
436
439
{
437
440
if (!ValidXLogRecordHeader (state , state -> ReadRecPtr ,
438
441
state -> PrevRecPtr , prec ))
@@ -477,10 +480,10 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
477
480
* available
478
481
*/
479
482
targetPagePtr =
480
- state -> ReadRecPtr - (state -> ReadRecPtr % XLOG_BLCKSZ );
481
- targetRecOff = state -> ReadRecPtr % XLOG_BLCKSZ ;
483
+ state -> ReadRecPtr - (state -> ReadRecPtr % state -> pageSize );
484
+ targetRecOff = state -> ReadRecPtr % state -> pageSize ;
482
485
483
- request_len = Min (targetRecOff + total_len , XLOG_BLCKSZ );
486
+ request_len = Min (targetRecOff + total_len , state -> pageSize );
484
487
record_len = request_len - targetRecOff ;
485
488
486
489
/* ReadRecPtr contains page header */
@@ -549,7 +552,7 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
549
552
550
553
/* Calculate pointer to beginning of next page */
551
554
state -> recordContRecPtr = state -> ReadRecPtr + record_len ;
552
- Assert (state -> recordContRecPtr % XLOG_BLCKSZ == 0 );
555
+ Assert (state -> recordContRecPtr % state -> pageSize == 0 );
553
556
554
557
state -> readRecordState = XLREAD_CONTINUATION ;
555
558
}
@@ -576,7 +579,7 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
576
579
/* this request contains page header */
577
580
Assert (targetPagePtr != 0 );
578
581
if (XLogNeedData (state , targetPagePtr ,
579
- Min (state -> recordRemainLen , XLOG_BLCKSZ ),
582
+ Min (state -> recordRemainLen , state -> pageSize ),
580
583
false))
581
584
return XLREAD_NEED_DATA ;
582
585
@@ -628,7 +631,7 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
628
631
Assert (state -> readLen >= pageHeaderSize );
629
632
630
633
contdata = (char * ) state -> readBuf + pageHeaderSize ;
631
- record_len = XLOG_BLCKSZ - pageHeaderSize ;
634
+ record_len = state -> pageSize - pageHeaderSize ;
632
635
if (pageHeader -> xlp_rem_len < record_len )
633
636
record_len = pageHeader -> xlp_rem_len ;
634
637
@@ -655,7 +658,7 @@ XLogReadRecord(XLogReaderState *state, XLogRecord **record, char **errormsg)
655
658
}
656
659
657
660
/* Calculate pointer to beginning of next page, and continue */
658
- state -> recordContRecPtr += XLOG_BLCKSZ ;
661
+ state -> recordContRecPtr += state -> pageSize ;
659
662
}
660
663
661
664
/* targetPagePtr is pointing the last-read page here */
@@ -789,10 +792,10 @@ XLogNeedData(XLogReaderState *state, XLogRecPtr pageptr, int reqLen,
789
792
XLogPageHeaderSize ((XLogPageHeader ) state -> readBuf );
790
793
791
794
addLen = pageHeaderSize ;
792
- if (reqLen + pageHeaderSize <= XLOG_BLCKSZ )
795
+ if (reqLen + pageHeaderSize <= state -> pageSize )
793
796
addLen = pageHeaderSize ;
794
797
else
795
- addLen = XLOG_BLCKSZ - reqLen ;
798
+ addLen = state -> pageSize - reqLen ;
796
799
797
800
Assert (addLen >= 0 );
798
801
}
@@ -805,7 +808,7 @@ XLogNeedData(XLogReaderState *state, XLogRecPtr pageptr, int reqLen,
805
808
/* Data is not in our buffer, request the caller for it. */
806
809
XLByteToSeg (pageptr , targetSegNo , state -> segcxt .ws_segsize );
807
810
targetPageOff = XLogSegmentOffset (pageptr , state -> segcxt .ws_segsize );
808
- Assert ((pageptr % XLOG_BLCKSZ ) == 0 );
811
+ Assert ((pageptr % state -> pageSize ) == 0 );
809
812
810
813
/*
811
814
* Every time we request to load new data of a page to the caller, even if
@@ -829,7 +832,7 @@ XLogNeedData(XLogReaderState *state, XLogRecPtr pageptr, int reqLen,
829
832
* will not come back here, but will request the actual target page.
830
833
*/
831
834
state -> readPagePtr = pageptr - targetPageOff ;
832
- state -> readLen = XLOG_BLCKSZ ;
835
+ state -> readLen = state -> pageSize ;
833
836
return true;
834
837
}
835
838
@@ -962,7 +965,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
962
965
int32 offset ;
963
966
XLogPageHeader hdr = (XLogPageHeader ) phdr ;
964
967
965
- Assert ((recptr % XLOG_BLCKSZ ) == 0 );
968
+ Assert ((recptr % state -> pageSize ) == 0 );
966
969
967
970
XLByteToSeg (recptr , segno , state -> segcxt .ws_segsize );
968
971
offset = XLogSegmentOffset (recptr , state -> segcxt .ws_segsize );
@@ -1016,10 +1019,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
1016
1019
"WAL file is from different database system: incorrect segment size in page header" );
1017
1020
return false;
1018
1021
}
1019
- else if (longhdr -> xlp_xlog_blcksz != XLOG_BLCKSZ )
1022
+ else if (longhdr -> xlp_xlog_blcksz != state -> pageSize )
1020
1023
{
1021
1024
report_invalid_record (state ,
1022
- "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" );
1025
+ "WAL file is from different database system: incorrect block size in page header" );
1023
1026
return false;
1024
1027
}
1025
1028
}
@@ -1140,7 +1143,7 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr,
1140
1143
* XLogNeedData() is prepared to handle that and will read at
1141
1144
* least short page-header worth of data
1142
1145
*/
1143
- targetRecOff = tmpRecPtr % XLOG_BLCKSZ ;
1146
+ targetRecOff = tmpRecPtr % state -> pageSize ;
1144
1147
1145
1148
/* scroll back to page boundary */
1146
1149
targetPagePtr = tmpRecPtr - targetRecOff ;
@@ -1174,8 +1177,8 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr,
1174
1177
*
1175
1178
* Note that record headers are MAXALIGN'ed
1176
1179
*/
1177
- if (MAXALIGN (header -> xlp_rem_len ) >= (XLOG_BLCKSZ - pageHeaderSize ))
1178
- tmpRecPtr = targetPagePtr + XLOG_BLCKSZ ;
1180
+ if (MAXALIGN (header -> xlp_rem_len ) >= (state -> pageSize - pageHeaderSize ))
1181
+ tmpRecPtr = targetPagePtr + state -> pageSize ;
1179
1182
else
1180
1183
{
1181
1184
/*
0 commit comments