mirror of
https://github.com/postgres/postgres.git
synced 2025-11-12 05:01:15 +03:00
Rework XLogReader callback system
Code review for0dc8ead463, prompted by a bug closed by91c40548d5. XLogReader's system for opening and closing segments had gotten too complicated, with callbacks being passed at both the XLogReaderAllocate level (read_page) as well as at the WALRead level (segment_open). This was confusing and hard to follow, so restructure things so that these callbacks are passed together at XLogReaderAllocate time, and add another callback to the set (segment_close) to make it a coherent whole. Also, ensure XLogReaderState is an argument to all the callbacks, so that they can grab at the ->private data if necessary. Document the whole arrangement more clearly. Author: Álvaro Herrera <alvherre@alvh.no-ip.org> Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Discussion: https://postgr.es/m/20200422175754.GA19858@alvherre.pgsql
This commit is contained in:
@@ -783,10 +783,10 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa
|
||||
}
|
||||
}
|
||||
|
||||
/* openSegment callback for WALRead */
|
||||
static int
|
||||
wal_segment_open(XLogSegNo nextSegNo, WALSegmentContext * segcxt,
|
||||
TimeLineID *tli_p)
|
||||
/* XLogReaderRoutine->segment_open callback for local pg_wal files */
|
||||
int
|
||||
wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo,
|
||||
WALSegmentContext *segcxt, TimeLineID *tli_p)
|
||||
{
|
||||
TimeLineID tli = *tli_p;
|
||||
char path[MAXPGPATH];
|
||||
@@ -811,8 +811,17 @@ wal_segment_open(XLogSegNo nextSegNo, WALSegmentContext * segcxt,
|
||||
return -1; /* keep compiler quiet */
|
||||
}
|
||||
|
||||
/* stock XLogReaderRoutine->segment_close callback */
|
||||
void
|
||||
wal_segment_close(XLogReaderState *state)
|
||||
{
|
||||
close(state->seg.ws_file);
|
||||
/* need to check errno? */
|
||||
state->seg.ws_file = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* read_page callback for reading local xlog files
|
||||
* XLogReaderRoutine->page_read callback for reading local xlog files
|
||||
*
|
||||
* Public because it would likely be very helpful for someone writing another
|
||||
* output method outside walsender, e.g. in a bgworker.
|
||||
@@ -937,8 +946,9 @@ read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr,
|
||||
* as 'count', read the whole page anyway. It's guaranteed to be
|
||||
* zero-padded up to the page boundary if it's incomplete.
|
||||
*/
|
||||
if (!WALRead(cur_page, targetPagePtr, XLOG_BLCKSZ, tli, &state->seg,
|
||||
&state->segcxt, wal_segment_open, &errinfo))
|
||||
if (!WALRead(state, cur_page, targetPagePtr, XLOG_BLCKSZ, tli,
|
||||
&state->seg, &state->segcxt,
|
||||
&errinfo))
|
||||
WALReadRaiseError(&errinfo);
|
||||
|
||||
/* number of valid bytes in the buffer */
|
||||
|
||||
Reference in New Issue
Block a user