暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

Eric 2024-12-14
61

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

作者信息

公司 职位
中移苏研 助理软件研发工程师
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论