news 2026/7/19 4:29:41

OpenGauss MOT表实现代码走读

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenGauss MOT表实现代码走读
一. 前言

MOT表是openGauss中一个重要的亮点特性,其得益于本地内存和全局内存的设计实现了无锁操作,Mass索引和commit的时候才统一做checkpoint等能力实现了高并发读写。本文主要走读openGauss中的代码,了解其如何实现的。

二. MOT表读流程代码走读

读流程的核心是如何从mass索引中读取元组的数据,其入口为MOTIterateForeignScan,核心流程为:

MOTIterateForeignScan do { if (!festate->m_cursorOpened) { MOTAdaptor::OpenCursor // 初始化索引扫描信息 if (festate->m_bestIx == nullptr || festate->m_bestIx->m_fullScan) { // 无索引的场景 MOT::Index* ix = festate->m_table->GetPrimaryIndex() // 使用MOT表的伪索引 } festate->m_cursor[i] = festate->m_bestIx->m_ix->Search // 到masstree中查找满足扫描键的迭代器 const_cast<IndexImpl&>(m_index).iteratorScan(keybuf, keylen, matchKey....) } MOT::Sentinel* sentinel = festate->m_cursor[0]->GetPrimarySentinel(); // 获取到版本 currRow = festate->m_currTxn->RowLookup(festate->m_internalCmdOper, sentinel, rc); // 获取当前可见的一行数据 TxnManager::RowLookup RC res = AccessLookup(type, originalSentinel, local_row); // 查找本地内存 switch (res) { case RC::RC_LOCAL_ROW_NOT_FOUND: // 本地内存找不到 local_row = m_accessMgr->GetVisibleRowVersion(originalSentinel, GetVisibleCSN()); // 查找全局内存 } MOTAdaptor::UnpackRow // MOT数据转成普通元组数据 festate->m_cursor[0]->Next(); // 游标下移 }
三. MOT表写流程代码走读

MOT的写流程核心为如何写本地内存以及如何提交到全局内存,如下为核心流程:

MOTExecForeignInsert MOTAdaptor::InsertRow MOT::RC MOTAdaptor::InsertRow PackRow(slot, table, fdwState->m_attrsUsed, newRowData) // 转成MOT的行格式 table->InsertRow(row, fdwState->m_currTxn) // 插入行 insItem->SetItem(row, ix); // 创建插入项 txn->InsertRow(row); // 私有内存插入数据 MOT::TxnManager::InsertRow m_accessMgr->GetInsertMgr()->ExecuteOptimisticInsert(row, updateColumnKey) while (currentItem != EndCursor()) { currentItem->m_index->BuildKey(table, row, tKey); reinterpret_cast<MOT::Index*>(currentItem->m_index)->IndexInsert // 插入索引 TxnInsertAction::AddInsertToLocalAccess // 插入到本地内存 MOT::TxnAccess::AddInsertToLocalAccess curr_access->m_origSentinel = org_sentinel // 设置哨兵 m_rowsSet->insert // 插入本地内存 }

本地内存提交到全局内存,只有在commit的时候才会触发:

MOT::TxnManager::RecordCommit CommitInternal m_occManager.WriteChanges MOT::OccTransactionManager::WriteChanges GetCheckpointManager()->ApplyWrite(txMan, access->GetRowFromHeader(), access) CheckpointManager::ApplyWrite s->SetStableStatus(!m_availableBit) // 告诉checkpoint服务数据需要持久化 access->WriteGlobalChanges MOT::Access::WriteGlobalChanges GetLocalInsertRow()->SetCommitSequenceNumber(csn) // 设置csn GetLocalInsertRow()->SetTable(GetLocalInsertRow()->GetOrigTable()) // 往全局表推送变化
四. 创建MOT表代码走读

创建MOT表的核心为如何创建mass索引的伪列,其核心流程为:

MOT::RC MOTAdaptor::CreateTable table->Init // 表初始化 AddTableColumns(table, stmt->base.tableElts, hasBlob) // 为表增加列 primaryIdx = MOT::IndexFactory::CreatePrimaryIndexEx(...DEFAULT_TREE_FLAVOR...) primaryIdx->SetLenghtKeyFields(0, -1, 8); primaryIdx->SetFakePrimary(true); res = txn->CreateIndex(table, primaryIdx, true); // 默认创建一个伪主键索列作为索引

如何指定了表的主键索引,那么MOT表创建索引的时候,会将伪列索引删除,保证只有1个主键索引

MOTAdaptor::CreateIndex MOT::Table::UpdatePrimaryIndex if (this->m_primaryIndex) { DeleteIndex(this->m_primaryIndex); // 删除伪主键索引 } SetPrimaryIndex(index); // 用表的主键索引替换表的伪主键索引
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 4:26:43

C高级Linux远程终端管理系统

前言在职坐标学习的过程中&#xff0c;每学一门编程后面都对应相应的开发项目。软件开发环节中需求分析尤为重要&#xff0c;它关系着程序各个模块功能的实现、项目进度以及最终产品的质量。作为初学者在第一次面对如此集成化的开发任务时或多或少会一脸茫然&#xff0c;不知道…

作者头像 李华
网站建设 2026/7/19 4:26:16

Python项目打包指南:setup.py配置与最佳实践

1. Python项目打包概述&#xff1a;为什么需要setup.py&#xff1f;在Python开发中&#xff0c;打包分发是项目从开发环境走向生产环境的关键步骤。不同于直接将源码文件夹复制到目标机器的原始方式&#xff0c;规范的打包操作能解决依赖管理、版本控制和跨平台兼容性等核心问题…

作者头像 李华
网站建设 2026/7/19 4:25:31

Android开源项目选型与实现原理深度解析

1. Android开源项目生态概述作为一名有8年Android开发经验的工程师&#xff0c;我深刻体会到开源项目对开发效率的提升作用。Android开源生态经过十余年发展&#xff0c;已经形成了覆盖UI组件、网络通信、图片处理、架构设计等全领域的成熟体系。根据GitHub官方数据&#xff0c…

作者头像 李华
网站建设 2026/7/19 4:24:21

Unity弧形文本UI实战:5分钟打造动态圆形菜单

1. 项目概述&#xff1a;为什么弧形文本是UI设计的点睛之笔在游戏和交互应用的UI设计中&#xff0c;菜单和按钮的排列方式直接影响了用户的视觉体验和操作直觉。传统的线性排列虽然清晰&#xff0c;但在追求沉浸感和视觉冲击力的项目中&#xff0c;往往显得过于呆板。这时&…

作者头像 李华
网站建设 2026/7/19 4:23:57

VirtualBox与ISO镜像使用指南:从基础到高级优化

1. VirtualBox与ISO镜像基础认知作为一款开源的虚拟化工具&#xff0c;VirtualBox在我过去八年的运维生涯中扮演了重要角色。记得第一次接触时&#xff0c;我误以为它只是简单的模拟器&#xff0c;直到用它成功在Windows宿主机上运行了完整的Linux开发环境&#xff0c;才真正理…

作者头像 李华