非易失性WAL buffer实现解析(三)
时间:2022-07-28
本文章向大家介绍非易失性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/2306988:XLOG_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;
}
- P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)
- PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获(下)
- 3002 石子归并 3
- day2 oracle相关
- P2946 [USACO09MAR]牛飞盘队Cow Frisbee Team
- Django 中间件
- jupyter notebook下mongodb的使用
- P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- Common Subsequence
- T7315 yyy矩阵折叠(长)
- T7314 yyy的巧克力(钟)
- T7316 yyy的最大公约数(者)
- 2017.7.15清北夏令营精英班Day1解题报告
- 09:LGTB 学分块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于 Nginx + PHP-FPM 作为 HTTP 服务器
- 玩转 PhpStorm 系列(五):代码模板篇
- 通过 PDO 扩展与 MySQL 数据库交互(上)
- 通过 PDO 扩展与 MySQL 数据库交互(下)
- 使用 Vue 3.0,你可能不再需要Vuex了
- 浅析小程序云原生数据库设计与应用
- 实战丨用云开发快速构建信息申报小程序
- Linux gdb使用基础
- redis设置过期时间
- Linux gcc使用基础
- TensorFlow-平面曲线拟合
- TensorFlow-VGG16模型复现
- 腾讯云语音识别之实时语音识别
- React + Dva + Antd+umi 实践
- 重新构建711的Android项目(一),巧妙的小屏菜单查询框架实现