海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之set_status_by_pages

海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之set_status_by_pages

0 背景

He3DB 采用了先进的存储引擎和查询优化技术,能够快速处理大量数据和复杂查询。无论是 OLTP(在线事务处理)还是 OLAP(在线分析处理)场景,都能提供出色的性能表现。He3DB 具备完善的数据备份和恢复机制,能够在系统故障或数据损坏时快速恢复数据,确保业务的连续性。He3DB 支持水平扩展和垂直扩展,可以轻松应对不断增长的数据需求。He3DB 提供了严格的访问控制和数据加密功能,确保数据的安全性和隐私性。

本文基于He3DB,针对CLOG日志管理模块进行源码解读分享,包含set_status_by_pages函数

1 函数源码

c 复制代码
static void
set_status_by_pages(int nsubxids, TransactionId *subxids,
					XidStatus status, XLogRecPtr lsn)
{
    
	LOG_FUNCTION_ENTRY();
	int			pageno = TransactionIdToPage(subxids[0]);
	int			offset = 0;
	int			i = 0;
	int 		assertFlag = 0;

	if(!(nsubxids > 0))
	{
		Assert(assertFlag);
	}

	while (i < nsubxids)
	{
		int			num_on_page = 0;
		int nextpageno = 0;

		do
		{
			nextpageno = TransactionIdToPage(subxids[i]);
			if (nextpageno != pageno)
				break;
			num_on_page++;
			
			i++;
		} while (i < nsubxids);

		TransactionIdSetPageStatus(InvalidTransactionId,
								   num_on_page, subxids + offset,
								   status, lsn, pageno, false);
		offset = i;
		pageno = nextpageno;
	}
	LOG_FUNCTION_EXIT();
	return;
}

2 源码解读

c 复制代码
LOG_FUNCTION_ENTRY();

用于记录函数的进入。通常用于日志记录或者调试目的,以便在程序执行过程中追踪函数的调用顺序和执行流程。

c 复制代码
int			pageno = TransactionIdToPage(subxids[0]);
int			offset = 0;
int			i = 0;
int 		assertFlag = 0;
  • subxids数组中的第一个事务id转换为页面编号(pageno
  • 初始化一个偏移量变量offset0
  • 初始化一个循环计数器i为 0,用于遍历subxids数组
  • 初始化一个断言标志变量assertFlag为 0
c 复制代码
if(!(nsubxids > 0))
{
    Assert(assertFlag);
}

确保subxids数组中的元素个数nsubxids大于0

c 复制代码
while (i < nsubxids)
{
    int			num_on_page = 0;
    int nextpageno = 0;

    do
    {
        nextpageno = TransactionIdToPage(subxids[i]);
        if (nextpageno != pageno)
            break;
        num_on_page++;
        
        i++;
    } while (i < nsubxids);

    TransactionIdSetPageStatus(InvalidTransactionId,
                                num_on_page, subxids + offset,
                                status, lsn, pageno, false);
    offset = i;
    pageno = nextpageno;
}
  • 在每次外层循环开始时,初始化一个变量num_on_page为 0。这个变量用于统计当前页面(pageno)上的事务标识符数量

  • 初始化一个变量nextpageno为 0,这个变量将用于存储下一个页面的编号

  • 开始一个do - while循环

    • subxids数组中当前索引i对应的事务标识符转换为页面编号,并存储到nextpageno
    • 如果当前事务标识符对应的页面编号与当前页面编号相等,就将num_on_page加 1,表示当前页面上又多了一个事务标识符
    • 无论是否满足nextpageno!= pageno的条件,都将循环计数器i加 1,以便处理下一个事务标识符
  • 调用TransactionIdSetPageStatus函数来设置页面状态

  • 将当前的i值赋给offset,这将更新下一次处理的起始位置

  • 将下一个页面编号(nextpageno)赋给pageno,这样在下一次外层循环时就会处理下一个页面

c 复制代码
LOG_FUNCTION_EXIT();
return;
  • 用于记录函数的退出。与LOG_FUNCTION_ENTRY类似,用于日志记录或者调试目的

3 总结

函数名 作用
set_status_by_pages 根据给定的事务标识符数组(subxids),按照这些事务标识符对应的页面信息来设置页面状态
TransactionIdSetPageStatus 设置页面状态
LOG_FUNCTION_ENTRY 用于记录函数开始
LOG_FUNCTION_EXIT 用于记录函数结束

4 函数调用栈

函数整体调用栈如下图所示:

调用关系在上文源码解析中已经涉及到,被调关系如下:

从该调用栈关系图中可以看出,TransactionIdSetTreeStatus函数调用了set_status_by_pages函数,

海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之TransactionIdSetTreeStatus 这篇文章里详细介绍了TransactionIdSetTreeStatus函数的作用

5 He3DB其余文章参考链接

海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之TransactionIdSetTreeStatus

海山数据库(He3DB)+AI(五):一种基于强化学习的数据库旋钮调优方法

海山数据库(He3DB)+AI(四):一种基于迁移学习的启发式数据库旋钮调优方法

海山数据库(He3DB)源码解读:海山PG 词法、语法分析

海山数据库(He3DB)源码详解:海山PG 空闲空间映射表FSM

相关推荐
2401_857617621 分钟前
Spring Boot框架在中小企业设备管理中的创新应用
数据库·spring boot·后端
会飞的土拨鼠呀8 分钟前
Centos7.9安装MySQL(二进制)
android·数据库·mysql
白总Server9 分钟前
Gateway解说
服务器·网络·数据库·web安全·架构·php·idc
激流丶13 分钟前
【Mysql 深入探索】InnoDB 实现事务的机制
数据库·mysql·innodb
优维科技EasyOps22 分钟前
MongoDB 8.0 全新登场:究竟如何?
数据库·mongodb
hangbobo22 分钟前
监测mongodb服务并启动
数据库·mongodb
小黑哪有坏心思!1 小时前
Linux安装部署数据库:MongoDB
linux·运维·数据库·mongodb·nosql
搬码后生仔1 小时前
在 Windows 系统上设置 MySQL8.0以支持远程连接
数据库
菠萝加点糖1 小时前
ADB指定进程名称kill进程
数据库·adb
Karoku0661 小时前
【MySQL数据库】MHA高可用
linux·运维·服务器·数据库·mysql