mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Refactor XLogReadRecord(), adding XLogBeginRead() function.
The signature of XLogReadRecord() required the caller to pass the starting WAL position as argument, or InvalidXLogRecPtr to continue reading at the end of previous record. That's slightly awkward to the callers, as most of them don't want to randomly jump around in the WAL stream, but start reading at one position and then read everything from that point onwards. Remove the 'RecPtr' argument and add a new function XLogBeginRead() to specify the starting position instead. That's more convenient for the callers. Also, xlogreader holds state that is reset when you change the starting position, so having a separate function for doing that feels like a more natural fit. This changes XLogFindNextRecord() function so that it doesn't reset the xlogreader's state to what it was before the call anymore. Instead, it positions the xlogreader to the found record, like XLogBeginRead(). Reviewed-by: Kyotaro Horiguchi, Alvaro Herrera Discussion: https://www.postgresql.org/message-id/5382a7a3-debe-be31-c860-cb810c08f366%40iki.fi
This commit is contained in:
@ -13,7 +13,9 @@
|
||||
* how to use the XLogReader infrastructure.
|
||||
*
|
||||
* The basic idea is to allocate an XLogReaderState via
|
||||
* XLogReaderAllocate(), and call XLogReadRecord() until it returns NULL.
|
||||
* XLogReaderAllocate(), position the reader to the first record with
|
||||
* XLogBeginRead() or XLogFindNextRecord(), and call XLogReadRecord()
|
||||
* until it returns NULL.
|
||||
*
|
||||
* After reading a record with XLogReadRecord(), it's decomposed into
|
||||
* the per-block and main data parts, and the parts can be accessed
|
||||
@ -126,7 +128,8 @@ struct XLogReaderState
|
||||
|
||||
/*
|
||||
* Start and end point of last record read. EndRecPtr is also used as the
|
||||
* position to read next, if XLogReadRecord receives an invalid recptr.
|
||||
* position to read next. Calling XLogBeginRead() sets EndRecPtr to the
|
||||
* starting position and ReadRecPtr to invalid.
|
||||
*/
|
||||
XLogRecPtr ReadRecPtr; /* start of last record read */
|
||||
XLogRecPtr EndRecPtr; /* end+1 of last record read */
|
||||
@ -239,18 +242,20 @@ typedef int (*WALSegmentOpen) (XLogSegNo nextSegNo, WALSegmentContext *segcxt,
|
||||
extern void WALOpenSegmentInit(WALOpenSegment *seg, WALSegmentContext *segcxt,
|
||||
int segsize, const char *waldir);
|
||||
|
||||
/* Position the XLogReader to given record */
|
||||
extern void XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr);
|
||||
#ifdef FRONTEND
|
||||
extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr);
|
||||
#endif /* FRONTEND */
|
||||
|
||||
/* Read the next XLog record. Returns NULL on end-of-WAL or failure */
|
||||
extern struct XLogRecord *XLogReadRecord(XLogReaderState *state,
|
||||
XLogRecPtr recptr, char **errormsg);
|
||||
char **errormsg);
|
||||
|
||||
/* Validate a page */
|
||||
extern bool XLogReaderValidatePageHeader(XLogReaderState *state,
|
||||
XLogRecPtr recptr, char *phdr);
|
||||
|
||||
#ifdef FRONTEND
|
||||
extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr);
|
||||
#endif /* FRONTEND */
|
||||
|
||||
/*
|
||||
* Error information from WALRead that both backend and frontend caller can
|
||||
* process. Currently only errors from pg_pread can be reported.
|
||||
|
Reference in New Issue
Block a user