On 2020/04/07 10:29, Kyotaro Horiguchi wrote:
Thank you for picking this up.
At Tue, 7 Apr 2020 02:43:02 +0900, Fujii Masao <masao.fu...@oss.nttdata.com>
wrote in
On 2020/03/19 22:22, Pavel Suderevsky wrote:
Hi,
I've tested patch provided by Kyotaro and do confirm it fixes the
issue.
The patch looks good to me. Attached is the updated version of the
patch.
I updated only comments.
+ * The logfile segment that doesn't belong to the
timeline is
+ * older or newer than the segment that the timeline
started or
+ * eneded at, respectively. It's sufficient to check
only the
s/eneded/ended/ ?
Yes! Thanks!
Regards,
--
Fujii Masao
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION
diff --git a/src/backend/access/transam/xlog.c
b/src/backend/access/transam/xlog.c
index abf954ba39..ec55d68d27 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -3776,11 +3776,36 @@ XLogFileReadAnyTLI(XLogSegNo segno, int emode,
XLogSource source)
foreach(cell, tles)
{
- TimeLineID tli = ((TimeLineHistoryEntry *)
lfirst(cell))->tli;
+ TimeLineHistoryEntry *hent = (TimeLineHistoryEntry *)
lfirst(cell);
+ TimeLineID tli = hent->tli;
if (tli < curFileTLI)
break; /* don't bother looking
at too-old TLIs */
+ /*
+ * Skip scanning the timeline ID that the logfile segment to
read
+ * doesn't belong to
+ */
+ if (hent->begin != InvalidXLogRecPtr)
+ {
+ XLogSegNo beginseg = 0;
+
+ XLByteToSeg(hent->begin, beginseg, wal_segment_size);
+
+ /*
+ * The logfile segment that doesn't belong to the
timeline is
+ * older or newer than the segment that the timeline
started or
+ * ended at, respectively. It's sufficient to check
only the
+ * starting segment of the timeline here. Since the
timelines are
+ * scanned in descending order in this loop, any
segments newer
+ * than the ending segment should belong to newer
timeline and
+ * have already been read before. So it's not necessary
to check
+ * the ending segment of the timeline here.
+ */
+ if (segno < beginseg)
+ continue;
+ }
+
if (source == XLOG_FROM_ANY || source == XLOG_FROM_ARCHIVE)
{
fd = XLogFileRead(segno, emode, tli,