openGauss源码解析(57)
openGauss源码解析:存储引擎源码解析(25)
4.3.2 FDW
openGauss使用FDW API与内存引擎进行对接。实现上分为两个层次。
(1) 消费者层——FDW API的实现,它由提供数据管理和操作的静态函数组成。这些函数通过fdwapi.h中的FdwRoutine结构以回调的形式暴露给上层。
(2) 通信层——连接openGauss其他部分和MOT内部API。这包括数据和数据定义转换和对MOT内部表示的调整。
1. 消费者层
MOT消费者层FDW API的功能和用途如表4-35所示。其中,计划、执行阶段请参考《SELECT/UPDATE/DELETE(计划阶段)》以及《SELECT/UPDATE/DELETE(执行阶段)》两小节。
函数名 | 使用阶段(数字为调用顺序) | 描述 |
---|---|---|
GetForeignRelSize | 计划1 | 查询过程中表的每个实例均调用,以评估大小 |
GetForeignPaths | 计划2 | 有索引情况下调用,确定哪些索引可用于从当前查询中的表中获取数据 |
GetForeignPlan | 计划3 | 创建用于从表中取数据的执行计划 |
PlanForeignModify | 计划4 | 在数据修改查询时调用。设置数据修改的附加信息 |
AddForeignUpdateTargets | 计划5 | 向查询输出添加其他结果列 |
BeginForeignScan | 执行1 | 在数据提取开始时,对查询中的每个表实例调用 |
BeginForeignModify | 执行1.1 | 修改查询 |
IterateForeignScan | 执行2 | 调用以获取相应的记录 |
ReScanForeignScan | 执行3 | 应重新启动迭代时调用 |
EndForeignScan | 执行4 | 调用以完成取数据 |
EndForeignModify | 执行4.1 | 在通过修改查询启动数据扫描时调用 |
ExecForeignInsert | 执行过程 | 满足其他条件时调用以完成记录插入 |
ExecForeignUpdate | 执行过程 | 满足其他条件时调用以完成记录修改 |
ExecForeignDelete | 执行过程 | 满足其他条件时调用以完成删除记录 |
ExplainForeignScan | 输出计划 | 执行explain时调用以打印详细计划信息 |
AnalyzeForeignTable | 分析1 | 对表做analyze操作 |
AcquireSampleRows | 分析2 | 收集采样信息用来做analyze操作 |
TruncateForeignTable | 截断 | 调用以清空表数据 |
VacuumForeignTable | 垃圾回收 | 清理表 |
NotifyForeignConfigChange | 配置 | 在数据库配置更改事件中调用 |
ValidateTableDef | DDL | 查询数据定义时调用 |
IsForeignRelUpdatable | 信息 | 调用以确定FDW支持的操作(SELECT/INSERT/UPDATE/DELETE) |
GetFdwType | 信息 | 提供FDW类型 |
GetForeignMemSize | 统计信息 | 以字节为单位提供MOT引擎的内存使用情况 |
GetForeignRelationMemSize | 统计信息 | 以字节为单位提供存储表/索引数据的内存使用情况 |
2. 主要流程时序图
请注意,为了便于读者更好的理解正常流程和异常流程的关系,本节中的时序图均将正常流程和异常流程放在同一张图中,其中P1、P2……Pn为异常流程。同时,为简化时序图帮助理解流程,异常流程仅在异常发生的位置进行标识,未完整绘制异常流程的时序。
1) CREATE表
用户创建一个新的内存表时,openGauss通过FDW适配器将请求转发给MOT存储引擎。创建表的正常流程和主要异常流程如图4-44所示。
正常事件流:FDW创建一个新的表对象。然后对每个列执行以下操作。
(1) FDW验证列定义。
(2) MOT引擎进一步验证列定义。
(3) 创建给定类型的列对象并将其添加到表中。
(4) 对所有列定义重复此过程。
添加完所有列后表定义本身就被验证,表对象已添加到MOT引擎,并通过锁保护,最后,由于表还没有索引,所以会向表中添加一个伪主索引/键。DDL命令会持久化到重做日志中。
P1:在此异常事件流中,列定义失败时FDW通过ereport函数向openGauss报告无效列定义(invalid column definition)错误。
P2:在此异常事件流中,由于以下原因之一,导致表的列定义验证失败:①不支持的列类型;②字段大小无效;③资源限制:已超过允许的表最大列数;④资源限制:列的总大小已超过最大元组大小;⑤资源限制:列名大小超过允许的最大值。
P3:在此异常事件流中,由于以下原因之一,导致表的列定义验证失败:①资源限制:超出每个表的最大列数;②资源限制:列的总大小超过最大元组大小;③资源限制:列名大小超过允许的最大值。
P4:总元组大小超过了允许的最大元组大小。
2) DELETE表
如图4-45所示,用户DELETE内存表时,openGauss通过FDW适配器将请求转发给MOT存储引擎。
正常事件流:FDW从MOT引擎中检索表对象,并将DELETE表的请求转发给MOT引擎。DDL命令在重做日志中持久化,然后对于表中的每个索引,索引数据将被截断并DELETE索引对象。随后对表中的每个索引重复此过程。在DELETE所有索引对象之后,MOT将DELETE表对象并返回给FDW。
P1:在此异常事件流中,没有找到索引所属的表。此错误条件被静默忽略,FDW不会向openGauss报告错误。
P2:在此异常事件流中,在表对象中找不到请求的二级索引。此错误条件被静默忽略,FDW不会向openGauss报告错误。