@@ -68,8 +68,8 @@ report_invalid_record(XLogReaderState *state, const char *fmt,...)
68
68
* Returns NULL if the xlogreader couldn't be allocated.
69
69
*/
70
70
XLogReaderState *
71
- XLogReaderAllocate(int wal_segment_size, XLogPageReadCB pagereadfunc ,
72
- void *private_data)
71
+ XLogReaderAllocate(int wal_segment_size, const char *waldir ,
72
+ XLogPageReadCB pagereadfunc, void *private_data)
73
73
{
74
74
XLogReaderState *state;
75
75
@@ -96,7 +96,10 @@ XLogReaderAllocate(int wal_segment_size, XLogPageReadCB pagereadfunc,
96
96
return NULL;
97
97
}
98
98
99
- state->wal_segment_size = wal_segment_size;
99
+ /* Initialize segment info. */
100
+ WALOpenSegmentInit(&state->seg, &state->segcxt, wal_segment_size,
101
+ waldir);
102
+
100
103
state->read_page = pagereadfunc;
101
104
/* system_identifier initialized to zeroes above */
102
105
state->private_data = private_data;
@@ -198,6 +201,23 @@ allocate_recordbuf(XLogReaderState *state, uint32 reclength)
198
201
return true;
199
202
}
200
203
204
+ /*
205
+ * Initialize the passed segment structs.
206
+ */
207
+ void
208
+ WALOpenSegmentInit(WALOpenSegment *seg, WALSegmentContext *segcxt,
209
+ int segsize, const char *waldir)
210
+ {
211
+ seg->ws_file = -1;
212
+ seg->ws_segno = 0;
213
+ seg->ws_off = 0;
214
+ seg->ws_tli = 0;
215
+
216
+ segcxt->ws_segsize = segsize;
217
+ if (waldir)
218
+ snprintf(segcxt->ws_dir, MAXPGPATH, "%s", waldir);
219
+ }
220
+
201
221
/*
202
222
* Attempt to read an XLOG record.
203
223
*
@@ -490,8 +510,8 @@ XLogReadRecord(XLogReaderState *state, XLogRecPtr RecPtr, char **errormsg)
490
510
(record->xl_info & ~XLR_INFO_MASK) == XLOG_SWITCH)
491
511
{
492
512
/* Pretend it extends to end of segment */
493
- state->EndRecPtr += state->wal_segment_size - 1;
494
- state->EndRecPtr -= XLogSegmentOffset(state->EndRecPtr, state->wal_segment_size );
513
+ state->EndRecPtr += state->segcxt.ws_segsize - 1;
514
+ state->EndRecPtr -= XLogSegmentOffset(state->EndRecPtr, state->segcxt.ws_segsize );
495
515
}
496
516
497
517
if (DecodeXLogRecord(state, record, errormsg))
@@ -533,12 +553,12 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
533
553
534
554
Assert((pageptr % XLOG_BLCKSZ) == 0);
535
555
536
- XLByteToSeg(pageptr, targetSegNo, state->wal_segment_size );
537
- targetPageOff = XLogSegmentOffset(pageptr, state->wal_segment_size );
556
+ XLByteToSeg(pageptr, targetSegNo, state->segcxt.ws_segsize );
557
+ targetPageOff = XLogSegmentOffset(pageptr, state->segcxt.ws_segsize );
538
558
539
559
/* check whether we have all the requested data already */
540
- if (targetSegNo == state->readSegNo && targetPageOff == state->readOff &&
541
- reqLen <= state->readLen)
560
+ if (targetSegNo == state->seg.ws_segno &&
561
+ targetPageOff == state->seg.ws_off && reqLen <= state->readLen)
542
562
return state->readLen;
543
563
544
564
/*
@@ -553,13 +573,13 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
553
573
* record is. This is so that we can check the additional identification
554
574
* info that is present in the first page's "long" header.
555
575
*/
556
- if (targetSegNo != state->readSegNo && targetPageOff != 0)
576
+ if (targetSegNo != state->seg.ws_segno && targetPageOff != 0)
557
577
{
558
578
XLogRecPtr targetSegmentPtr = pageptr - targetPageOff;
559
579
560
580
readLen = state->read_page(state, targetSegmentPtr, XLOG_BLCKSZ,
561
581
state->currRecPtr,
562
- state->readBuf, &state->readPageTLI );
582
+ state->readBuf);
563
583
if (readLen < 0)
564
584
goto err;
565
585
@@ -577,7 +597,7 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
577
597
*/
578
598
readLen = state->read_page(state, pageptr, Max(reqLen, SizeOfXLogShortPHD),
579
599
state->currRecPtr,
580
- state->readBuf, &state->readPageTLI );
600
+ state->readBuf);
581
601
if (readLen < 0)
582
602
goto err;
583
603
@@ -596,7 +616,7 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
596
616
{
597
617
readLen = state->read_page(state, pageptr, XLogPageHeaderSize(hdr),
598
618
state->currRecPtr,
599
- state->readBuf, &state->readPageTLI );
619
+ state->readBuf);
600
620
if (readLen < 0)
601
621
goto err;
602
622
}
@@ -608,8 +628,8 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
608
628
goto err;
609
629
610
630
/* update read state information */
611
- state->readSegNo = targetSegNo;
612
- state->readOff = targetPageOff;
631
+ state->seg.ws_segno = targetSegNo;
632
+ state->seg.ws_off = targetPageOff;
613
633
state->readLen = readLen;
614
634
615
635
return readLen;
@@ -625,8 +645,8 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
625
645
static void
626
646
XLogReaderInvalReadState(XLogReaderState *state)
627
647
{
628
- state->readSegNo = 0;
629
- state->readOff = 0;
648
+ state->seg.ws_segno = 0;
649
+ state->seg.ws_off = 0;
630
650
state->readLen = 0;
631
651
}
632
652
@@ -745,16 +765,16 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
745
765
746
766
Assert((recptr % XLOG_BLCKSZ) == 0);
747
767
748
- XLByteToSeg(recptr, segno, state->wal_segment_size );
749
- offset = XLogSegmentOffset(recptr, state->wal_segment_size );
768
+ XLByteToSeg(recptr, segno, state->segcxt.ws_segsize );
769
+ offset = XLogSegmentOffset(recptr, state->segcxt.ws_segsize );
750
770
751
- XLogSegNoOffsetToRecPtr(segno, offset, state->wal_segment_size , recaddr);
771
+ XLogSegNoOffsetToRecPtr(segno, offset, state->segcxt.ws_segsize , recaddr);
752
772
753
773
if (hdr->xlp_magic != XLOG_PAGE_MAGIC)
754
774
{
755
775
char fname[MAXFNAMELEN];
756
776
757
- XLogFileName(fname, state->readPageTLI , segno, state->wal_segment_size );
777
+ XLogFileName(fname, state->seg.ws_tli , segno, state->segcxt.ws_segsize );
758
778
759
779
report_invalid_record(state,
760
780
"invalid magic number %04X in log segment %s, offset %u",
@@ -768,7 +788,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
768
788
{
769
789
char fname[MAXFNAMELEN];
770
790
771
- XLogFileName(fname, state->readPageTLI , segno, state->wal_segment_size );
791
+ XLogFileName(fname, state->seg.ws_tli , segno, state->segcxt.ws_segsize );
772
792
773
793
report_invalid_record(state,
774
794
"invalid info bits %04X in log segment %s, offset %u",
@@ -791,7 +811,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
791
811
(unsigned long long) state->system_identifier);
792
812
return false;
793
813
}
794
- else if (longhdr->xlp_seg_size != state->wal_segment_size )
814
+ else if (longhdr->xlp_seg_size != state->segcxt.ws_segsize )
795
815
{
796
816
report_invalid_record(state,
797
817
"WAL file is from different database system: incorrect segment size in page header");
@@ -808,7 +828,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
808
828
{
809
829
char fname[MAXFNAMELEN];
810
830
811
- XLogFileName(fname, state->readPageTLI , segno, state->wal_segment_size );
831
+ XLogFileName(fname, state->seg.ws_tli , segno, state->segcxt.ws_segsize );
812
832
813
833
/* hmm, first page of file doesn't have a long header? */
814
834
report_invalid_record(state,
@@ -828,7 +848,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
828
848
{
829
849
char fname[MAXFNAMELEN];
830
850
831
- XLogFileName(fname, state->readPageTLI , segno, state->wal_segment_size );
851
+ XLogFileName(fname, state->seg.ws_tli , segno, state->segcxt.ws_segsize );
832
852
833
853
report_invalid_record(state,
834
854
"unexpected pageaddr %X/%X in log segment %s, offset %u",
@@ -853,7 +873,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
853
873
{
854
874
char fname[MAXFNAMELEN];
855
875
856
- XLogFileName(fname, state->readPageTLI , segno, state->wal_segment_size );
876
+ XLogFileName(fname, state->seg.ws_tli , segno, state->segcxt.ws_segsize );
857
877
858
878
report_invalid_record(state,
859
879
"out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u",
@@ -997,7 +1017,6 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr)
997
1017
998
1018
#endif /* FRONTEND */
999
1019
1000
-
1001
1020
/* ----------------------------------------
1002
1021
* Functions for decoding the data and block references in a record.
1003
1022
* ----------------------------------------
0 commit comments