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(执行阶段)》两小节。

表4‑35 MOT消费者层FDW接口简介

函数名

使用阶段(数字为调用顺序)

描述

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表

图4‑44 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表时序图

如图4-45所示,用户DELETE内存表时,openGauss通过FDW适配器将请求转发给MOT存储引擎。

正常事件流:FDW从MOT引擎中检索表对象,并将DELETE表的请求转发给MOT引擎。DDL命令在重做日志中持久化,然后对于表中的每个索引,索引数据将被截断并DELETE索引对象。随后对表中的每个索引重复此过程。在DELETE所有索引对象之后,MOT将DELETE表对象并返回给FDW。

P1:在此异常事件流中,没有找到索引所属的表。此错误条件被静默忽略,FDW不会向openGauss报告错误。

P2:在此异常事件流中,在表对象中找不到请求的二级索引。此错误条件被静默忽略,FDW不会向openGauss报告错误。

posted @ 2024-04-29 16:52  openGauss-bot  阅读(5)  评论(0编辑  收藏  举报