海山数据库(He3DB)源码解读:He3DB-XLogInsert函数

news/2024/9/23 19:27:39/

XLogInsert

函数主体参数

XLogRecPtr
XLogInsert(RmgrId rmid, uint8 info)
{
}
  • RmgrId rmid

    • uint8类型的别名参数。唯一标识触发WAL记录生成的不同资源管理器
      (Resource Manager ID)
  • uint8 info

    • 资源管理器其他额外信息

函数主题流程

XLogRecPtr
XLogInsert(RmgrId rmid, uint8 info)
{XLogRecPtr	EndPos;/* XLogBeginInsert() must have been called. */if (!begininsert_called)elog(ERROR, "XLogBeginInsert was not called");/** The caller can set rmgr bits, XLR_SPECIAL_REL_UPDATE and* XLR_CHECK_CONSISTENCY; the rest are reserved for use by me.*/if ((info & ~(XLR_RMGR_INFO_MASK |XLR_SPECIAL_REL_UPDATE |XLR_CHECK_CONSISTENCY)) != 0)elog(PANIC, "invalid xlog info mask %02X", info);TRACE_POSTGRESQL_WAL_INSERT(rmid, info);/** In bootstrap mode, we don't actually log anything but XLOG resources;* return a phony record pointer.*/if (IsBootstrapProcessingMode() && rmid != RM_XLOG_ID){XLogResetInsertion();EndPos = SizeOfXLogLongPHD; /* start of 1st chkpt record */return EndPos;}do{XLogRecPtr	RedoRecPtr;bool		doPageWrites;bool		topxid_included = false;XLogRecPtr	fpw_lsn;XLogRecData *rdt;int			num_fpi = 0;/** Get values needed to decide whether to do full-page writes. Since* we don't yet have an insertion lock, these could change under us,* but XLogInsertRecord will recheck them once it has a lock.*/GetFullPageWriteInfo(&RedoRecPtr, &doPageWrites);rdt = XLogRecordAssemble(rmid, info, RedoRecPtr, doPageWrites,&fpw_lsn, &num_fpi, &topxid_included);EndPos = XLogInsertRecord(rdt, fpw_lsn, curinsert_flags, num_fpi,topxid_included);} while (EndPos == InvalidXLogRecPtr);XLogResetInsertion();return EndPos;
}
- typedef uint64 XLogRecPtr;日志记录位置的64位无符号整数- elog会写到日志中初始值: begininsert_called = false;该变量关联到XLogBeginInsert函数- 刚开始为false,XLogBeginInsert中将其设为true作用:确保一定要走XLogBeginInsert函数
  • 检测info信息中是否包含无效的位,如果有,报PANIC错误,这是最高错误级别,需要立即停止所有操作并重启数据库

  • 追踪记录哪个资源管理器用了WAL的插入,以及该资源管理器其他信息

    • TRACE、LOG_DEBUG与elog的区别

      • TRACE和LOG_DEBUG不会影响数据库运行,用于调试、定位bug;
        elog可能导致数据库停止等操作,比如错误级别为PANIC
  • 如果当前处于bootstrap下且资源管理器ID不等于XLOG的资源管理器

    • 函数宏 定义

        - BootstrapProcessing:表示系统正在执行bootstrap过程,这是创建模板数据库的过程,发生在数据库系统首次初始化时。InitProcessing:表示系统正在初始化过程中,但这不是引导过程。这可能是指数据库系统安装或更新后的初始化步骤。NormalProcessing:表示系统处于正常处理模式,即数据库正在接受读写请求并正常运行。
      
    • rmid != RM_XLOG_ID

      • 不等于XLOG的资源管理器ID
    • 重置构造的缓冲区

void
XLogResetInsertion(void)
{int			i;for (i = 0; i < max_registered_block_id; i++)registered_buffers[i].in_use = false;num_rdatas = 0;max_registered_block_id = 0;mainrdata_len = 0;mainrdata_last = (XLogRecData *) &mainrdata_head;curinsert_flags = 0;begininsert_called = false;
}
	- 解释- max_registered_block_id:当前已注册的最大缓冲区ID- 已注册的缓冲区信息结构体- 该循环,确保已注册的缓冲区都标记为未使用- 1)SizeOfXLogLongPHD利用MAXALIGN结合页头部数据的大小来对齐大小
2)用EndPos指向这个对齐后大小的开始位置,并返回这个位置EndPos

  • GetFullPageWriteInfo(&RedoRecPtr, &doPageWrites);

    • 获得全页写的信息
  • XLogRecordAssemble函数

    • Xlog记录信息的组装
  • XLogInsertRecord函数

    • 将 rdt 指向的日志记录插入到 WAL 中,并返回 EndPos,该值表示这个日志记录在 WAL 中的结束位置(即下一个日志记录应该开始的位置)。这个结束位置对于后续的日志记录插入和恢复过程都是非常重要的。
  • do while循环不断的将日志插入WAL中,直到返回的EndPos位置为InvalidXLogRecPtr

再次重置缓冲区

并返回日志记录的最终结束位置

作者介绍

薛炬,移动云数据库工程师,负责云原生数据库He3DB的研发。


http://www.ppmy.cn/news/1509890.html

相关文章

获取当前ip的网站--记录

https://www.ipuu.net/Homehttps://jingjiequ.com/tools/iphttps://www.ip.cn/https://api.bigdatacloud.net/data/client-ip [个人使用]http://myip.ipip.net/ 使用python获取当前ip代码案例 def get_ip():headers {"Accept": "text/html,application/xhtml…

Linux学习第60天:Linux驱动开发的一些总结

今天是Linux驱动开发的最后一个章节&#xff0c;题目中标明是60天完成的&#xff0c;其实在实际学习及笔记的整理中不止是60天。中间有过断更&#xff0c;有时断更的时间还是挺长的。这是在整个Linux驱动开发学习中最不满意的地方。 题目为Linux学习&#xff0c;其实这个题目有…

c++多态(二)

一、抽象类 在虚函数后面加 0 , 这个虚函数就是纯虚函数。&#xff08;此函数只声明不实现&#xff09; 有纯虚函数的类是抽象类。&#xff08;无法实例化对象&#xff09; 上图Car是一个抽象类&#xff0c;他的子类由于继承了纯虚函数&#xff0c;如果在子类重写纯虚函数也会…

飞桨Paddle API index_add 详解

index_add paddle.index_add(x, index, axis, value, nameNone)[源代码] 沿着指定轴 axis 将 index 中指定位置的 x 与 value 相加&#xff0c;并写入到结果 Tensor 中的对应位置。这里 index 是一个 1-D Tensor。除 axis 轴外&#xff0c;返回的 Tensor 其余维度大小和输入 …

Qt+OpenCV配置和测试

一、前言 OpenCV作为比较大众化的跨平台计算机视觉开源库&#xff0c;可以运行在多种操作系统上&#xff0c;通过与Qt的结合&#xff0c;能够轻松的是实现一些图像处理和识别的任务&#xff0c;本文在Windows操作系统的基础上具体讲解Qt和OpenCV的配置和环境搭建方法&#xff…

【机器学习】Gans生成对抗网络入门

Generative Adversarial Networks&#xff0c;生成对抗网络。 从未学过AI&#xff0c;从超分辨率接触到这个概念&#xff0c;初步学习记录&#xff0c;受益匪浅&#xff0c;记录如下。 什么是生成对抗网络&#xff08;GANs&#xff09;&#xff1f; 2014年Goodfellow 等人启…

VUE最强学习宝典01

目录 1.Vue是什么&#xff1f; 2. 两种使用方法 3.创建第一个vue实例 4.补充小知识 5.错误查询 1.Vue是什么&#xff1f; 概念&#xff1a;动态构建用户界面的渐进式 JavaScript 框架 。 优点&#xff1a;大大提升开发效率(70%) 缺点&#xff1a;需要理解记忆规划-->官…

【生成式人工智能-十一一个不修改模型就能加速语言模型生成的方法】

一个加速语言模型生成的方法 现在语言模型的一个弊端speculative decoding预言家预测的问题 speculative decoding 模块的实现方法NAT Non-autoregressive模型压缩使用搜索引擎 一些更复杂些的speculative decoding 实现方式 speculative decoding 是一个适用于目前生成模型的加…