海山数据库(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
) - 初始化一个偏移量变量
offset
为0
- 初始化一个循环计数器
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(五):一种基于强化学习的数据库旋钮调优方法