大云海山数据库(He3DB)源码详解:He3DB-SubTrans日志管理器函数之SubTransSetParent

28 阅读3分钟

大云海山数据库(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));    
  1. 确保parent是有效父事务id
  2. 确保xidparent之后
  • 获取名为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

作者信息

公司职位
中移苏研助理软件研发工程师