mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Rework WAL-reading supporting structs
The state-tracking of WAL reading in various places was pretty messy, mostly because the ancient physical-replication WAL reading code wasn't using the XLogReader abstraction. This led to some untidy code. Make it prettier by creating two additional supporting structs, WALSegmentContext and WALOpenSegment which keep track of WAL-reading state. This makes code cleaner, as well as supports more future cleanup. Author: Antonin Houska Reviewed-by: Álvaro Herrera and (older versions) Robert Haas Discussion: https://postgr.es/m/14984.1554998742@spoje.net
This commit is contained in:
@ -885,8 +885,7 @@ static int XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli,
|
||||
int source, bool notfoundOk);
|
||||
static int XLogFileReadAnyTLI(XLogSegNo segno, int emode, int source);
|
||||
static int XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
|
||||
int reqLen, XLogRecPtr targetRecPtr, char *readBuf,
|
||||
TimeLineID *readTLI);
|
||||
int reqLen, XLogRecPtr targetRecPtr, char *readBuf);
|
||||
static bool WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
|
||||
bool fetching_ckpt, XLogRecPtr tliRecPtr);
|
||||
static int emode_for_corrupt_record(int emode, XLogRecPtr RecPtr);
|
||||
@ -1195,7 +1194,8 @@ XLogInsertRecord(XLogRecData *rdata,
|
||||
appendBinaryStringInfo(&recordBuf, rdata->data, rdata->len);
|
||||
|
||||
if (!debug_reader)
|
||||
debug_reader = XLogReaderAllocate(wal_segment_size, NULL, NULL);
|
||||
debug_reader = XLogReaderAllocate(wal_segment_size, NULL,
|
||||
NULL, NULL);
|
||||
|
||||
if (!debug_reader)
|
||||
{
|
||||
@ -4296,7 +4296,7 @@ ReadRecord(XLogReaderState *xlogreader, XLogRecPtr RecPtr, int emode,
|
||||
XLByteToSeg(xlogreader->latestPagePtr, segno, wal_segment_size);
|
||||
offset = XLogSegmentOffset(xlogreader->latestPagePtr,
|
||||
wal_segment_size);
|
||||
XLogFileName(fname, xlogreader->readPageTLI, segno,
|
||||
XLogFileName(fname, xlogreader->seg.ws_tli, segno,
|
||||
wal_segment_size);
|
||||
ereport(emode_for_corrupt_record(emode,
|
||||
RecPtr ? RecPtr : EndRecPtr),
|
||||
@ -6353,7 +6353,8 @@ StartupXLOG(void)
|
||||
|
||||
/* Set up XLOG reader facility */
|
||||
MemSet(&private, 0, sizeof(XLogPageReadPrivate));
|
||||
xlogreader = XLogReaderAllocate(wal_segment_size, &XLogPageRead, &private);
|
||||
xlogreader = XLogReaderAllocate(wal_segment_size, NULL,
|
||||
&XLogPageRead, &private);
|
||||
if (!xlogreader)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OUT_OF_MEMORY),
|
||||
@ -7355,7 +7356,7 @@ StartupXLOG(void)
|
||||
* and we were reading the old WAL from a segment belonging to a higher
|
||||
* timeline.
|
||||
*/
|
||||
EndOfLogTLI = xlogreader->readPageTLI;
|
||||
EndOfLogTLI = xlogreader->seg.ws_tli;
|
||||
|
||||
/*
|
||||
* Complain if we did not roll forward far enough to render the backup
|
||||
@ -11523,7 +11524,7 @@ CancelBackup(void)
|
||||
*/
|
||||
static int
|
||||
XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen,
|
||||
XLogRecPtr targetRecPtr, char *readBuf, TimeLineID *readTLI)
|
||||
XLogRecPtr targetRecPtr, char *readBuf)
|
||||
{
|
||||
XLogPageReadPrivate *private =
|
||||
(XLogPageReadPrivate *) xlogreader->private_data;
|
||||
@ -11640,7 +11641,7 @@ retry:
|
||||
Assert(targetPageOff == readOff);
|
||||
Assert(reqLen <= readLen);
|
||||
|
||||
*readTLI = curFileTLI;
|
||||
xlogreader->seg.ws_tli = curFileTLI;
|
||||
|
||||
/*
|
||||
* Check the page header immediately, so that we can retry immediately if
|
||||
|
Reference in New Issue
Block a user