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

相关推荐
乌鸦乌鸦你的小虎牙1 小时前
qt 5.12.8 配置报错(交叉编译环境)
开发语言·数据库·qt
一只大袋鼠2 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Anastasiozzzz2 小时前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
菠萝蚊鸭2 小时前
x86 平台使用 buildx 基于源码构建 MySQL Wsrep 5.7.44 镜像
数据库·mysql·galera·wsrep
沙漏无语5 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb
姚不倒5 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
隔壁小邓5 小时前
批量更新方式与对比
数据库
数据知道5 小时前
MongoDB复制集架构原理:Primary、Secondary 与 Arbiter 的角色分工
数据库·mongodb·架构
人道领域5 小时前
苍穹外卖:菜品新增功能全流程解析
数据库·后端·状态模式
修行者Java5 小时前
(七)从 “非结构化数据难存储” 到 “MongoDB 灵活赋能”——MongoDB 实战进阶指南
数据库·mongodb