非易失性WAL buffer实现解析(三)

简介: 非易失性WAL buffer实现解析(三)

本文接上文介绍函数WaitForWALToBecomeAvailable打开WAL日志文件并切换日志源的实现。该函数不涉及关于NVM WAL BUFFER的修改。

1主机重启恢复时:日志源currentSource = XLOG_FROM_PG_WAL,之后由于第一次进来,调用函数XLogFileReadAnyTLI打开日志所在WAL文件。如果open成功则返回TRUE,否则lastSourceFailed=TRUE,然后跳到1,因为是主机直接返回false

2)备机重启恢复时:日志源currentSource = XLOG_FROM_ARCHIVE,之后由于第一次进来,调用函数XLogFileReadAnyTLI打开日志所在WAL文件。如果open成功则返回TRUE,否则lastSourceFailed=TRUE,然后跳到1,切换日志源:currentSource = XLOG_FROM_STREAM;请求的日志已接收到则返回TRUE,未接收到则sleep一会,重新返回1循环,切到XLOG_FROM_ARCHIVE往次循环

关于函数XLogFileReadAnyTLI的实现参考我之前总结的:https://blog.51cto.com/yanzongshuai/2306988XLOG_FROM_ARCHIVE出错后还会切到XLOG_FROM_PG_WAL进行open的,只是currentSource 状态机没有改变而已。



static int
XLogFileReadAnyTLI(XLogSegNo segno, int emode, int source)
{
  if (expectedTLEs)
    tles = expectedTLEs;
  else
    tles = readTimeLineHistory(recoveryTargetTLI);
  /*
  1、WaitForWALToBecomeAvailable调用时,source是XLOG_FROM_ARCHIVE时,会使用XLOG_FROM_ANY
  2、使用XLOG_FROM_ANY,会首先从归档中读取xlog,如果open失败,则会使用XLOG_FROM_PG_WAL
  3、外部日志源变量并没有切换
  */
  foreach(cell, tles){
    TimeLineID  tli = ((TimeLineHistoryEntry *) lfirst(cell))->tli;
    if (tli < curFileTLI)
      break;        /* don't bother looking at too-old TLIs */
    if (source == XLOG_FROM_ANY || source == XLOG_FROM_ARCHIVE){
      fd = XLogFileRead(segno, emode, tli,XLOG_FROM_ARCHIVE, true);
      if (fd != -1){
        if (!expectedTLEs)
          expectedTLEs = tles;
        return fd;
      }
    }
    if (source == XLOG_FROM_ANY || source == XLOG_FROM_PG_WAL){
      fd = XLogFileRead(segno, emode, tli, XLOG_FROM_PG_WAL, true);
      if (fd != -1){
        if (!expectedTLEs)
          expectedTLEs = tles;
        return fd;
      }
    }
  }
  return -1;
}
目录
相关文章
|
10月前
|
内存技术
非易失性WAL buffer实现解析(五)
非易失性WAL buffer实现解析(五)
36 0
|
10月前
|
关系型数据库 PostgreSQL 内存技术
非易失性WAL buffer实现解析(一)
非易失性WAL buffer实现解析(一)
46 0
|
10月前
|
内存技术
非易失性WAL buffer实现解析(二)
非易失性WAL buffer实现解析(二)
28 0
|
10月前
|
存储 关系型数据库 PostgreSQL
PostgreSQL WAL解析:构建WAL记录准备
PostgreSQL WAL解析:构建WAL记录准备
95 0
|
关系型数据库 PostgreSQL
postgresql 的WAL日志解析工具 pg_waldump
postgresql 的WAL日志解析工具 pg_waldump
1287 0
postgresql 的WAL日志解析工具 pg_waldump
|
设计模式 缓存 Java
NIO中Buffer的重要属性关系解析
NIO中Buffer的重要属性关系解析
159 0
|
5天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
13天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
44 0
|
13天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
43 0
|
14天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
47 0

推荐镜像

更多