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

相关推荐
tatasix25 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。38 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了39 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度41 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮43 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...3 小时前
索引(MySQL)
数据库·mysql·索引