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

相关推荐
成为大佬先秃头3 小时前
数据库连接池:Druid
数据库·mysql·druid
晓华-warm6 小时前
Warm-Flow 1.8.5 正式发布:超时自动审批、暂存功能来了!
数据库
u0136863827 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
light blue bird7 小时前
多页签Razor组支轴业务整顿组件
数据库·.net·ai大数据·多功能图表报表·web mvc + razor
wregjru7 小时前
【mysql】2.数据表操作
数据库·mysql
手握风云-7 小时前
基于 Java 的网页聊天室(三)
服务器·前端·数据库
LcVong7 小时前
MySQL 5.2/5.7 开启Binlog日志详细步骤(附验证+查看+恢复)
数据库·mysql·adb
FL4m3Y4n8 小时前
MySQL缓存策略
数据库·mysql·缓存
wsx_iot8 小时前
TDengine学习
数据库·学习·tdengine
不吃香菜的小趴菜8 小时前
mysql数据库打包与导入
数据库·mysql