]> granicus.if.org Git - postgresql/commit
Use the right timeline when beginning to stream from master.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 18 Jan 2013 09:41:36 +0000 (11:41 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 18 Jan 2013 09:46:49 +0000 (11:46 +0200)
commit2ff65553131d8ad2ddbbfe298fffc378f127b15e
tree4cfbfc70f63e4a440f24b6ee9458c4ebe905cf20
parent88228e6f1d26619756281c508212498f1de1eff5
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.
src/backend/access/transam/xlog.c
src/backend/access/transam/xlogreader.c
src/include/access/xlogreader.h