海山数据库(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

相关推荐
apcipot_rain21 分钟前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
辛一一3 小时前
neo4j图数据库基本概念和向量使用
数据库·neo4j
巨龙之路4 小时前
什么是时序数据库?
数据库·时序数据库
蔡蓝4 小时前
binlog日志以及MySQL的数据同步
数据库·mysql
是店小二呀5 小时前
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
数据库·金融·数据库平替用金仓·金仓数据库2025征文
炒空心菜菜5 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
多多*6 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
爱喝酸奶的桃酥6 小时前
MYSQL数据库集群高可用和数据监控平台
java·数据库·mysql
数据库幼崽6 小时前
MySQL 8.0 OCP 1Z0-908 61-70题
数据库·mysql·ocp
码农黛兮_467 小时前
SQL 索引优化指南:原理、知识点与实践案例
数据库·sql