日志源会在XLOG_FROM_ARCHIVE→XLOG_FROM_STREAM→XLOG_FROM_ARCHIVE直接切换,只有读取过程中出的错,就会切换到另外一个日志源。但实际执行过程中,XLOG_FROM_ARCHIVE出错后会到XLOG_FROM_PG_WAL读取,但是日志源的变量并不会改变。这个需要注意。
static int XLogFileReadAnyTLI (XLogSegNo segno, int emode,, int 源) { , if (expectedTLEs) 时间=tles expectedTLEs; 其他的 时间=tles readTimeLineHistory (recoveryTargetTLI);/* 1,WaitForWALToBecomeAvailable调用时,源是XLOG_FROM_ARCHIVE时,会使用XLOG_FROM_ANY 2、使用XLOG_FROM_ANY,会首先从归档中读取xlog,如果打开失败,则会使用XLOG_FROM_PG_WAL 3、外部日志源变量并没有切换 */foreach(细胞,tl) { tli  timelineid也;=,((TimeLineHistoryEntry *), lfirst(细胞))→tli; if (tli & lt;, curFileTLI) 打破;/*,不要# 39;t  bother looking at too-old TLIs */if (source ==, XLOG_FROM_ANY | |, source ==, XLOG_FROM_ARCHIVE) { 时间=fd XLogFileRead (segno, emode,,, tli XLOG_FROM_ARCHIVE,,真的); if (fd !=, 1) { if (expectedTLEs !) expectedTLEs =, tl; return fd; } } if (source ==, XLOG_FROM_ANY | |, source ==, XLOG_FROM_PG_WAL) { 时间=fd XLogFileRead (segno, emode,,, tli, XLOG_FROM_PG_WAL,,真的); if (fd !=, 1) { if (expectedTLEs !) expectedTLEs =, tl; return fd; } } } return 1; }