mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Adjust walsender usage of xlogreader, simplify APIs
* Have both physical and logical walsender share a 'xlogreader' state struct for tracking state. This replaces the existing globals sendSeg and sendCxt. * Change WALRead not to receive XLogReaderState->seg and ->segcxt as separate arguments anymore; just use the ones from 'state'. This is made possible by the above change. * have the XLogReader segment_open contract require the callbacks to install the file descriptor in the state struct themselves instead of returning it. xlogreader was already ignoring any possible failed return from the callbacks, relying solely on them never returning. (This point is not altogether excellent, as it means the callbacks have to know more of XLogReaderState; but to really improve on that we would have to pass back error info from the callbacks to xlogreader. And the complexity would not be saved but instead just transferred to the callers of WALRead, which would have to learn how to throw errors from the open_segment callback in addition of, as currently, from pg_pread.) * segment_open no longer receives the 'segcxt' as a separate argument, since it's part of the XLogReaderState argument. Per comments from Kyotaro Horiguchi. Author: Álvaro Herrera <alvherre@alvh.no-ip.org> Discussion: https://postgr.es/m/20200511203336.GA9913@alvherre.pgsql
This commit is contained in:
@ -63,10 +63,9 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader,
|
||||
int reqLen,
|
||||
XLogRecPtr targetRecPtr,
|
||||
char *readBuf);
|
||||
typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader,
|
||||
XLogSegNo nextSegNo,
|
||||
WALSegmentContext *segcxt,
|
||||
TimeLineID *tli_p);
|
||||
typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader,
|
||||
XLogSegNo nextSegNo,
|
||||
TimeLineID *tli_p);
|
||||
typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader);
|
||||
|
||||
typedef struct XLogReaderRoutine
|
||||
@ -94,21 +93,16 @@ typedef struct XLogReaderRoutine
|
||||
XLogPageReadCB page_read;
|
||||
|
||||
/*
|
||||
* Callback to open the specified WAL segment for reading. The file
|
||||
* descriptor of the opened segment shall be returned. In case of
|
||||
* Callback to open the specified WAL segment for reading. ->seg.ws_file
|
||||
* shall be set to the file descriptor of the opened segment. In case of
|
||||
* failure, an error shall be raised by the callback and it shall not
|
||||
* return.
|
||||
*
|
||||
* "nextSegNo" is the number of the segment to be opened.
|
||||
*
|
||||
* "segcxt" is additional information about the segment.
|
||||
*
|
||||
* "tli_p" is an input/output argument. WALRead() uses it to pass the
|
||||
* timeline in which the new segment should be found, but the callback can
|
||||
* use it to return the TLI that it actually opened.
|
||||
*
|
||||
* BasicOpenFile() is the preferred way to open the segment file in
|
||||
* backend code, whereas open(2) should be used in frontend.
|
||||
*/
|
||||
WALSegmentOpenCB segment_open;
|
||||
|
||||
@ -301,9 +295,7 @@ typedef struct WALReadError
|
||||
|
||||
extern bool WALRead(XLogReaderState *state,
|
||||
char *buf, XLogRecPtr startptr, Size count,
|
||||
TimeLineID tli, WALOpenSegment *seg,
|
||||
WALSegmentContext *segcxt,
|
||||
WALReadError *errinfo);
|
||||
TimeLineID tli, WALReadError *errinfo);
|
||||
|
||||
/* Functions for decoding an XLogRecord */
|
||||
|
||||
|
Reference in New Issue
Block a user