Thread: pgsql: Use the right timeline when beginning to stream from master.

pgsql: Use the right timeline when beginning to stream from master.

From
Heikki Linnakangas
Date:
Use the right timeline when beginning to stream from master.

The xlogreader refactoring broke the logic to decide which timeline to start
streaming from. XLogPageRead() uses the timeline history to check which
timeline the requested WAL position falls into. However, after the
refactoring, XLogPageRead() is always first called with the first page in
the segment, to verify the segment header, and only then with the actual WAL
position we're interested in. That first read of the segment's header made
XLogPageRead() to always start streaming from the old timeline containing
the segment header, not the timeline containing the actual record, if there
was a timeline switch within the segment.

I thought I fixed this yesterday, but that fix was too narrow and only fixed
this for the corner-case that the timeline switch happened in the first page
of the segment. To fix this more robustly, pass explicitly the position of
the record we're actually interested in to XLogPageRead, and use that to
decide which timeline to read from, rather than deduce it from the page and
offset.

Per report from Fujii Masao.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/2ff65553131d8ad2ddbbfe298fffc378f127b15e

Modified Files
--------------
src/backend/access/transam/xlog.c       |   24 +++++++++++++++++-------
src/backend/access/transam/xlogreader.c |    5 +++++
src/include/access/xlogreader.h         |   18 ++++++++++++++----
3 files changed, 36 insertions(+), 11 deletions(-)