海山数据库(He3DB)源码详解:ResourceOwnerData及ResourceArray结构体解析

海山数据库(He3DB)数据仓库发展历史与架构演进:(三)云数仓 数据仓库的演进变革的因素有很多,例如快速的业务模式与群体规模的数据量带来的大数据处理技术、互联网的发展带来的数据源及数据类型的增多、人工智能的发展带来数智的融合、云计算交付模式的出现需要的细粒度的资源管理与隔离等,业务实时性的要求等都会带来数据仓库架构的变化。传统数仓将计算与存储部署在同一个节点,集群的扩容复杂,需要进行数据的迁移,同时架构存在木桶效应,单节点故障会影响整体的性能,且资源管理不灵活,无法满足不同场景下资源隔离及动态调整的需求。,这些产品之间的功能基本相同,只是在技术细节的实现各有不同。 阅读详情

海山数据库(He3DB)源码详解:ResourceOwnerData及ResourceArray结构体解析

本文介绍了事务执行过程中,检查一个堆元组是否对当前事务可见,用于确保事务可以看到正确的数据版本。

ResourceOwnerData 结构体的作用

ResourceOwnerData 是 PostgreSQL 中用于管理资源所有权的核心结构体。它定义了一个资源所有者(ResourceOwner)的内部数据结构,用于跟踪和管理事务或子事务中占用的各种资源。这些资源包括缓冲区、缓存引用、文件、锁等。以下是对 ResourceOwnerData 结构体及其成员的详细解读:

1. 树状结构

所有的ResourceOwnerData数据会构成树状结构,如下图所示:
alt text

  1. TopTransaction作为父节点,通过firstchild指针连接三个子节点;
  2. 三个子节点分别通过nextchild指针构成链表;

2. 结构体定义

typedef struct ResourceOwnerData
{
	ResourceOwner parent;		/* NULL if no parent (toplevel owner) */
	ResourceOwner firstchild;	/* head of linked list of children */
	ResourceOwner nextchild;	/* next child of same parent */
	const char *name;			/* name (just for debugging) */

	/* We have built-in support for remembering: */
	ResourceArray bufferarr;	/* owned buffers */
	ResourceArray catrefarr;	/* catcache references */
	ResourceArray catlistrefarr;	/* catcache-list pins */
	ResourceArray relrefarr;	/* relcache references */
	ResourceArray planrefarr;	/* plancache references */
	ResourceArray tupdescarr;	/* tupdesc references */
	ResourceArray snapshotarr;	/* snapshot references */
	ResourceArray filearr;		/* open temporary files */
	ResourceArray dsmarr;		/* dynamic shmem segments */
	ResourceArray jitarr;		/* JIT contexts */
	ResourceArray cryptohasharr;	/* cryptohash contexts */
	ResourceArray hmacarr;		/* HMAC contexts */

	/* We can remember up to MAX_RESOWNER_LOCKS references to local locks. */
	int			nlocks;			/* number of owned locks */
	LOCALLOCK  *locks[MAX_RESOWNER_LOCKS];	/* list of owned locks */
}			ResourceOwnerData;
1. 树状结构成员
  • ResourceOwner parent;

    • 类型:ResourceOwner(指向另一个ResourceOwnerData的指针)
    • 作用:指向当前资源所有者的父节点。如果当前所有者是顶层所有者,则parent为NULL。
    • 用途:支持嵌套事务或子事务的资源管理。例如,在一个事务中开启一个子事务时,子事务的资源所有者会将父事务的资源所有者作为其parent。
  • ResourceOwner firstchild;

    • 类型:ResourceOwner
    • 作用:指向当前资源所有者的第一个子节点。
    • 用途:用于构建资源所有者的子节点链表,支持树状结构的遍历。
  • ResourceOwner nextchild;

    • 类型:ResourceOwner
    • 作用:指向当前资源所有者的下一个兄弟节点。
    • 用途:用于链表结构,支持遍历同一父节点的所有子节点。
  • const char *name;

    • 类型:const char*
    • 作用:资源所有者的名称。
    • 用途:主要用于调试,方便在日志或调试信息中标识资源所有者。
2. 资源管理相关成员

这些成员用于跟踪和管理不同类型的资源。每种资源类型都通过一个ResourceArray数组来管理。

  • ResourceArray bufferarr;

    • 作用:管理当前所有者占用的缓冲区资源。
    • 用途:确保在事务结束时释放所有占用的缓冲区。
  • ResourceArray catrefarr;

    • 作用:管理当前所有者对系统目录缓存(catcache)的引用。
    • 用途:确保在事务结束时释放对系统目录缓存的引用。
  • ResourceArray catlistrefarr;

    • 作用:管理当前所有者对系统目录缓存列表(catcache-list)的引用。
    • 用途:确保在事务结束时释放对系统目录缓存列表的引用。
  • ResourceArray relrefarr;

    • 作用:管理当前所有者对关系缓存(relcache)的引用。
    • 用途:确保在事务结束时释放对关系缓存的引用。
  • ResourceArray planrefarr;

    • 作用:管理当前所有者对计划缓存(plancache)的引用。
    • 用途:确保在事务结束时释放对计划缓存的引用。
  • ResourceArray tupdescarr;

    • 作用:管理当前所有者对元组描述符(tupdesc)的引用。
    • 用途:确保在事务结束时释放对元组描述符的引用。
  • ResourceArray snapshotarr;

    • 作用:管理当前所有者对快照(snapshot)的引用。
    • 用途:确保在事务结束时释放对快照的引用。
  • ResourceArray filearr;

    • 作用:管理当前所有者打开的临时文件。
    • 用途:确保在事务结束时关闭所有临时文件。
  • ResourceArray dsmarr;

    • 作用:管理当前所有者对动态共享内存段(dynamic shared memory segments)的引用。
    • 用途:确保在事务结束时释放对动态共享内存段的引用。
  • ResourceArray jitarr;

    • 作用:管理当前所有者对即时编译(JIT)上下文的引用。
    • 用途:确保在事务结束时释放对JIT上下文的引用。
  • ResourceArray cryptohasharr;

    • 作用:管理当前所有者对加密哈希上下文的引用。
    • 用途:确保在事务结束时释放对加密哈希上下文的引用。
  • ResourceArray hmacarr;

    • 作用:管理当前所有者对HMAC上下文的引用。
    • 用途:确保在事务结束时释放对HMAC上下文的引用。
3. 锁管理相关成员

这些成员用于跟踪和管理当前所有者持有的锁。

  • int nlocks;

    • 类型:int
    • 作用:当前所有者持有的锁的数量。
    • 用途:记录当前所有者管理的锁的数量,确保在事务结束时释放所有锁。
  • LOCALLOCK *locks[MAX_RESOWNER_LOCKS];

    • 类型:LOCALLOCK*数组
    • 作用:存储当前所有者持有的锁的指针。
    • 用途:确保在事务结束时释放所有持有的锁。MAX_RESOWNER_LOCKS是一个常量,限制了资源所有者可以持有的最大锁数量。

3. 总结

ResourceOwnerData 结构体是 PostgreSQL 中资源管理的核心组件,用于跟踪和管理事务或子事务中占用的各种资源。它的主要功能包括:

  1. 树状结构管理:通过parent、firstchild和nextchild成员,支持嵌套事务的资源管理。
  2. 资源跟踪:通过ResourceArray数组,管理不同类型的资源,确保在事务结束时释放所有资源。
  3. 锁管理:通过nlocks和locks成员,跟踪和管理当前所有者持有的锁,确保在事务结束时释放所有锁。

通过这种设计,ResourceOwner能够有效地管理资源的生命周期,确保资源在事务结束时被正确释放,从而避免资源泄漏和死锁问题。


ResourceArray 结构体的作用

ResourceArray 是 PostgreSQL 中用于存储和管理各种资源 ID 的通用结构体。它通过动态调整存储方式(从简单数组到哈希表)来高效地管理资源集合。以下是对 ResourceArray 结构体及其成员的详细解释:

1. 存储模式

ResourceArray 用于高效地存储和管理资源 ID。它支持以下两种存储模式:

  1. 简单数组模式:当资源数量较少时,使用线性数组存储资源 ID。
  2. 哈希表模式:当资源数量较多时,切换到哈希表存储,以提高查找效率。

这种设计结合了线性数组的简单性和哈希表的高效性,能够在不同场景下优化资源管理。

2. 结构体定义及成员

typedef struct ResourceArray
{
	Datum	   *itemsarr;		/* buffer for storing values */
	Datum		invalidval;		/* value that is considered invalid */
	uint32		capacity;		/* allocated length of itemsarr[] */
	uint32		nitems;			/* how many items are stored in items array */
	uint32		maxitems;		/* current limit on nitems before enlarging */
	uint32		lastidx;		/* index of last item returned by GetAny */
} ResourceArray;
  1. Datum *itemsarr;

    • 类型:Datum 类型的指针数组。
    • 作用:用于存储资源 ID 的数组。
    • 说明:
      • 在简单数组模式下,itemsarr 是一个线性数组,存储资源 ID。
      • 在哈希表模式下,itemsarr 是一个哈希表,每个槽位存储一个资源 ID 或 invalidval。
      • Datum 是 PostgreSQL 中的通用数据类型,可以存储任意类型的数据。
  2. Datum invalidval;

    • 类型:Datum。
    • 作用:表示无效值的标识符。
    • 说明:
      • 在哈希表模式下,invalidval 用于标记空槽位或已删除的槽位。
      • 当 itemsarr[k] == invalidval 时,表示该槽位是空的或无效的。
  3. uint32 capacity;

    • 类型:uint32(无符号 32 位整数)。
    • 作用:表示 itemsarr 的分配长度(即数组或哈希表的总容量)。
    • 说明:
      • 在简单数组模式下,capacity 是数组的最大长度。
      • 在哈希表模式下,capacity 是哈希表的总槽数。
  4. uint32 nitems;

    • 类型:uint32。
    • 作用:表示当前存储的有效资源 ID 数量。
    • 说明:
      • 当 nitems 达到 maxitems 时,数组或哈希表需要扩容。
  5. uint32 maxitems;

    • 类型:uint32。
    • 作用:表示当前模式下 nitems 的上限。
    • 说明:
      • 在简单数组模式下,maxitems 是数组的最大容量。
      • 在哈希表模式下,maxitems 是哈希表中允许存储的最大有效项数,通常小于 capacity,以避免哈希冲突过多。
  6. uint32 lastidx;

    • 类型:uint32。
    • 作用:记录最近一次通过 GetAny 方法返回的资源 ID 的索引。
    • 说明:
      • 在 ResourceArrayRemove 方法中,lastidx 可以加快查找速度,避免重复搜索。

3. 工作原理

  1. 简单数组模式:

    • 当资源数量较少时,ResourceArray 使用线性数组存储资源 ID。
    • itemsarr 是一个线性数组,nitems 表示当前存储的资源数量。
    • 当 nitems 达到 maxitems 时,切换到哈希表模式。
  2. 哈希表模式:

    • 当资源数量较多时,ResourceArray 使用哈希表存储资源 ID。
    • itemsarr 是一个哈希表,每个槽位存储一个资源 ID 或 invalidval。
    • capacity 是哈希表的总槽数,maxitems 是允许存储的最大有效项数。
    • 如果 nitems 超过 maxitems,则扩容哈希表并重新哈希。
  3. 动态调整:

    • ResourceArray 会根据资源数量动态调整存储模式,以优化性能。
    • 在哈希表模式下,lastidx 用于记录最近一次操作的索引,以加快查找速度。

4. 总结

ResourceArray 是一个高效管理资源 ID 的通用结构体,支持动态调整存储方式(从简单数组到哈希表)。它的成员变量分别用于:

  • 存储资源 ID(itemsarr)。
  • 标记无效值(invalidval)。
  • 管理数组或哈希表的容量(capacity)。
  • 记录当前存储的有效资源数量(nitems)。
  • 设置存储上限(maxitems)。
  • 记录最近一次操作的索引(lastidx)。

这种设计使得 ResourceArray 能够在不同场景下高效地管理资源,同时支持动态扩容和快速查找。

海山数据库(He3DB)原理剖析:浅析OLAP数据库计算引擎中的统计信息 张步涛,中国移动云能力中心数据库产品部-OLAP数据库开发工程师。主要参与OLAP内核研发/湖仓一体研发相关工作。 阅读详情

相关推荐

海山数据库(He3DB)源码详解:主备复制start过程

在数据库主备复制(如PostgreSQL的流复制等场景)中,基础备份是建立主备数据库一致性的初始备份。它是一个数据库在某个时间点的完整副本,包含了数据库的数据文件、目录结构等所有用于恢复数据库到该时间点状态的必要信息。周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

yidongyun1111的博客 646

海山数据库(He3DB)源码详解:海山PG 空闲空间映射表FSM

FSM文件是Free Space Map(空闲空间映射)的缩写,用于跟踪和记录数据块(Page)中的空闲空间。随着数据表不断进行插入、更新和删除元组等操作,数据页内必然会存在空页空间。在插入新的元组时,有两种方式可以选择:直接选择新的页来存放、存放到已有页的空闲空间中。

DAWN1221的博客 1233

Zabbix 简介、优缺点、基础原理

(8条消息) Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型 --------------------------------------------------------------------------------------------------------------------------- 一、Zabbix 简介 Zabbix是由A...

weixin_50196615的博客 2037

海山数据库(He3DB)源码详解:海山MySQL redo日志-日志文件组

MySQL的数据目录下默认有两个名为和的文件,log buffer中的日志默认情况下就是刷新到这两个磁盘文件中。redo从上边的描述中可以看到,磁盘上的redo日志文件不只一个,而是以一个日志文件组的形式出现的。这些文件以ib_logfile[数字](数字可以是0、1、2…)的形式进行命名。在将redo日志写入日志文件组时,是从ib_logfile0开始写,如果ib_logfile0写满了,就接着ib_logfile1写,同理,ib_logfile1写满了就去写ib_logfile2,依此类推。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 1119

Ansys Zemax实战:5步搞定多模光纤耦合效率优化(附IMAE操作数详解)

本文详细介绍了使用Ansys Zemax优化多模光纤耦合效率的5个关键步骤,包括几何图像分析设置、IMAE操作数应用及偏振效应处理。通过实战案例解析,帮助工程师快速掌握光纤耦合效率提升技巧,特别针对IMAE操作数的配置保存机制和菲涅尔损耗控制进行深度讲解。

potato的博客 690

Python+Appium实现泛微OA自动打卡:5分钟搭建移动端自动化脚本

移动端自动化测试是软件测试与办公自动化领域的重要技术方向,其核心原理是通过程序模拟用户对手机应用界面的操作,实现重复性任务的自动执行。Appium作为主流的开源移动端自动化框架,基于WebDriver协议,支持跨平台且无需修改被测应用,为自动化脚本开发提供了标准化接口。在工程实践中,结合Python简洁的语法和丰富的生态,可以快速构建稳定可靠的自动化解决方案。这一技术组合的价值在于能够高效处理“重复性、低价值、高频率”的日常操作,例如考勤打卡、数据填报等办公场景,显著提升工作效率。本文以泛微OA Emobi

weixin_28836875的博客 389

海山数据库(He3DB)Redis技术实践:继承开源Redis精髓,强化升级企业级服务

数字化转型中的企业数据的处理速度和效率直接关系到企业的竞争力,Redis作为业界广泛使用的开源键值对存储系统,以其卓越的性能和丰富的数据结构,成为了众多开发者和企业的首选。

weixin_42744640的博客 2201

[V-10]ARMv8/v9-CPU Virtualization-CPU虚拟化架构简介(vCPU/vPE)

本文简要介绍了CPU虚拟化架构的基础知识。

基层架构师的分享 1267

移动云海山数据库(He3DB)-数据仓库发展历史与架构演进

数据仓库从概念提出后随着用户使用需求的变化、新技术的出现等多种因素架构在不断演进,在这个过程中不同的厂商针对各自的观点和需求,例如原始数据(数据湖)、实时性、多模数据及机器学习等,不断的在进行架构优化和新技术的引入,针对数仓的概念也在不断的重新定义,下图对这些概念进行了总结:在图中数据库、数据仓库与数据湖是界限相对清晰的产品体系,但是随着技术的发展产品也在相互借鉴融合。数据仓库由于对数据实时性的需求演进到了实时数仓,在这个过程中数据的实时接入框架、查询性能的提升、交互式查询等能力让数仓的实现复杂化;

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 640

R语言中的混淆矩阵(Confusion Matrix)是一种常用的评估多分类模型性能的工具

除了准确率,混淆矩阵还提供了其他有用的指标,如灵敏度(Sensitivity)、特异度(Specificity)、精确度(Precision)和召回率(Recall)。混淆矩阵通过比较模型预测结果与实际标签的一致性,帮助我们了解模型的分类准确性和错误类型。此外,混淆矩阵还提供了各种错误类型的统计信息,如假阳性(False Positive)和假阴性(False Negative)等。通过混淆矩阵,我们可以了解模型的整体性能和错误类型,从而对模型进行评估和改进。最后,为了更好地理解混淆矩阵的结果,可以使用。

HackSquad的博客 972

【路径规划】Theta_star算法机器人栅格地图最短路径规划【含Matlab源码 2618期】

Theta_star算法机器人栅格地图最短路径规划 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 362

大云海山数据库(He3DB) 内核分析 — Btree索引篇

本文重点分析了He3DB数据库中B-Tree索引的实现原理。首先介绍了B+Tree的基本结构特点,包括键值存储在叶子节点、叶子节点双向链接等。随后详细阐述了索引的创建过程,包括元组转换、排序、页面填充及B+Tree构建等关键步骤。在查询方面,解释了索引扫描的工作原理及与回表操作的配合机制。对于数据更新,分析了索引插入时的页面分裂处理流程,以及删除操作中标记删除与物理删除的区别。最后总结了B+Tree索引在等值和范围查询中的优势,并指出其内部节点与叶子节点的不同指向特点。

weixin_43544348的博客 1042

电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?

DGND是数字地,是数字电路部分的公共基准端,用于连接数字电路的接地。

XU157303764的博客 2337

海山数据库(He3DB)源码详解:海山MySQL undo日志

回滚(rollback):撤销对事务的操作,保证事务的原子性undo日志(undo log):记录回滚内容的文件。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 974

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践

本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。

m0_67505153的博客 1268

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HaishanDB(海山)|磐维数据库|YashanDB(崖山)深度对比分析

海山haishanDB基于PG深度自研,主打云原生、原生时序与AI原生一体化,适配政务云、工业互联网、智能体底座等增量赛道。移动体系内海山与磐维形成场景互补,错位发展。海山数据库的架构的天然适配,同时专业公司后续系统将全面上移动云,那么基于正云长出来的海山数据库(haishanDB),这是专业公司的最优选择。标杆案例 国家教育云、河钢工业云、多省医保影像云、政务云、移动MOMA大模型平台 全国各省移动BOSS、开通、计费、CRM通信核心系统 多家城商行/证券、三甲医院HIS、大型政务Oracle替换项目。

云计算、数据库爱好者 321

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

海山数据库(He3DB)源码解读:海山PG 词法、语法分析

He3DB for PostgreSQL是受Aurora论文启发,基于开源数据库PostgreSQL 改造的数据库产品。架构上实现计算存储分离,并进一步支持数据的冷热分层,大幅提升产品的性价比。    He3DB for PostgreSQL中查询编译的主要任务是根据用户的查询语句生成数据库中最优执行计划,在此过程中要考虑视图、规则以及表的连接路径等问题。

He3DB_ht的博客 783

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深度解析大云海山数据库(He3DB)FileCache 机制

FileCache 作为 He3DB 数据库 的高性能二级缓存方案,通过 “本地缓存 + 智能淘汰 + 一致性保障”,有效突破了远程数据访问和磁盘 IO 的性能瓶颈。数据根据不同的访问规则,被标记为冷数据,热数据和温数据,存储在相应位置,当filecache 温数据层在实践中配置合理的大小,保证较高的命中率时,将会大大提高数据访问性能,在读多写少的场景中将会有较好的性能表现。

weixin_43544348的博客 1021

海山数据库(He3DB)源码详解:StartTransaction函数

本文介绍了事务提交过程中,具体执行提交任务的StartTransaction函数详细执行流程。

wukong3405的博客 1012

海山数据库(He3DB)原理剖析:浅析Doris跨源分析能力

张步涛,中国移动云能力中心数据库产品部-OLAP数据库开发工程师。主要参与OLAP内核优化/湖仓一体分析的研发。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 1165
上一篇: 海山数据库(He3DB)源码详解:RecordTransactionCommit 函数解读
下一篇: 海山数据库(He3DB)源码详解:海山Mysql 自动测试框架MTR
DAWN1221
博客等级 码龄7年 893粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值