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,

Reply via email to