大云海山数据库(He3DB)源码详解:He3DB-SubTrans日志管理器函数之SubTransSetParent
背景
大云He3DB 采用了先进的存储引擎和查询优化技术,能够快速处理大量数据和复杂查询。无论是 OLTP(在线事务处理)还是 OLAP(在线分析处理)场景,都能提供出色的性能表现。He3DB 具备完善的数据备份和恢复机制,能够在系统故障或数据损坏时快速恢复数据,确保业务的连续性。He3DB 支持水平扩展和垂直扩展,可以轻松应对不断增长的数据需求。He3DB 提供了严格的访问控制和数据加密功能,确保数据的安全性和隐私性。
本文基于大云He3DB,针对SubTrans日志管理模块进行源码解读分享,包含SubTransSetParent函数
SubTransSetParent-子事务日志的写操作
作用:在子事务日志中记录父事务id
子事务日志写操作函数
源码解读
void
SubTransSetParent(TransactionId xid, TransactionId parent)
{
int pageno = TransactionIdToPage(xid);
int entryno = TransactionIdToEntry(xid);
int slotno;
TransactionId *ptr;
Assert(TransactionIdIsValid(parent));
Assert(TransactionIdFollows(xid, parent));
LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE);
slotno = SimpleLruReadPage(SubTransCtl, pageno, true, xid);
ptr = (TransactionId *) SubTransCtl->shared->page_buffer[slotno];
ptr += entryno;
if (*ptr != parent)
{
Assert(*ptr == InvalidTransactionId);
*ptr = parent;
SubTransCtl->shared->page_dirty[slotno] = true;
}
LWLockRelease(SubtransSLRULock);
}
- 函数参数
-
xid
子事务id
-
parent
父事务id
int pageno = TransactionIdToPage(xid);
int entryno = TransactionIdToEntry(xid);
pageno
计算事务idxid
对应的页号entryno
计算事务idxid
对应的条目号条目号:表示在一个页面中的具体位置。每个页面被划分为多个条目,每个条目对应一个事务的父事务 ID
Assert(TransactionIdIsValid(parent));
Assert(TransactionIdFollows(xid, parent));
- 确保
parent
是有效父事务id - 确保
xid
在parent
之后
- 获取名为
SubtransSLRULock
的轻量级锁(排他锁)
slotno = SimpleLruReadPage(SubTransCtl, pageno, true, xid);
ptr = (TransactionId *) SubTransCtl->shared->page_buffer[slotno];
ptr += entryno;
- 从子事务日志的 LRU 缓存中读取指定页号
pageno
对应的页面,并返回该页面对应的槽位号 - 将
slotno
对应的page_buffer
强制转换为TransactionId *
类型,储存在ptr
中 - 将指针移动到目标条目号
if (*ptr != parent)
{
Assert(*ptr == InvalidTransactionId);
*ptr = parent;
SubTransCtl->shared->page_dirty[slotno] = true;
}
-
如果当前的
xid
(*ptr
将指针解引用)不等于父事务idparent
-
- 断言,确保当前id必须是无效id
-
- 将
parent
赋值给*ptr
- 将
-
- 将槽位号对应的page设置为脏,表示已经修改
-
释放轻量级锁
函数流程图
该函数流程图如下所示:
函数调用栈
通过source insight
可以查看函数SubTransSetParent的调用栈
source insight
安装流程可以参考这篇文章:Source insight 工具安装及使用方法
总结
本文基于大云He3DB,针对SubTrans日志管理模块进行源码解读分享。
函数名 | 作用 |
---|---|
SubTransSetParent | 在子事务日志中记录父事务id |
其余文章参考链接
大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之TransactionIdSetTreeStatus
大云海山数据库(He3DB)+AI(五):一种基于强化学习的数据库旋钮调优方法
大云海山数据库(He3DB)+AI(四):一种基于迁移学习的启发式数据库旋钮调优方法
大云海山数据库(He3DB)源码解读:海山PG 词法、语法分析
大云海山数据库(He3DB)源码详解:海山PG 空闲空间映射表FSM
大云海山数据库(He3DB)源码详解:主备复制SyncRepWaitForLSN
作者信息
公司 | 职位 |
---|---|
中移苏研 | 助理软件研发工程师 |