Greenplum 内核源码分析 - 分布式事务 (四)
目录
前言
insert 命令
前言
上一篇文章我们介绍了 begin 命令和初始化工作。begin 命令的主要工作是初始化,创建 Gang,把 master node 上面的状态机走一走。然后 begin 命令也会发送到 segment 上面,segment 上面的实例也开始初始化,准备接收新的命令。
后面文中的术语:
QD---> master node
QE--->segment node
QE 被分为 QE writer gang 和 QE reader gang 两种,这是在创建 Gang 的时候就确定了的。writer gang 和相关的 reader gang 属于一个 segMates 组,一个组里面有一个 writer 和 一个或多个 reader。自然,writer gang 负责的工作最全面,QE 上面数据库事务的功能基本都是 writer gang 完成的。
本篇文章我们介绍 insert 命令,也就是在 begin 以后,客户端执行"insert into t2 values (1,11); "。
请大家注意,这个时候还没有开始做两阶段提交。只是 master node 发信息,更新状态,segment node 接收信息,更新状态。
对应的 PostgreSQL 的函数逻辑再贴在这里
作者对 Greenplum 源码的分析会使用Greenplum 5.x 版本,读者可以去 github 上面自行获取。
insert 命令
结合这个图,我们简单描述一下执行的过程。
在 begin 以后,客户端执行"insert into t2 values (1,10);" psql 给 QD 发送信息,ReadCommand 返回 firstchar 为'Q'的 query。 QD 的 PortalRun 进入 ExecutorStart 函数,dtmPreCommand("ExecutorStart")没有向 QE writer 发送信息,只是在 QD 上修改了状态机的状态。
QD 在 ExecutorStart 函数里面调用 CdbDispatchPlan 把执行计划发送到各个 QE writer 里面,这些 QE writer 都是在 begin 命令的时候启动的,启动以后都在监听来自 QD 上的 libpq 客户端发出来的信息。 QD 发送完执行计划以后,就进入 ExecutorEnd 函数,等待 QE writer 发送结果回来。具体的等待函数是 CdbCheckDispatchResult。
在 QE writer 里,ReadCommand 得到 firstchar 为'M'的信息,按照这个信息,开始进行 ExecutorRun 函数进行操作。这个函数会调用 ExecutePlan 函数,这个就是开始执行执行计划的具体地方。
在 ExecInsert 被执行后,有两个分支,一个是写数据本身,函数是
heap_insert-->RelationPutHeapTuple-->PageAddItem;另外一个分支是 XLogInsert,也就是在写 WAL log。这两个函数被调用完后,就会按照正常的流程返回 ready for query message 给 QD,所有的 QE writer 都会做这样的操作,QD 也会收到所有的 QE writer 返回的 ready for query message。
当 QD 返回 ready for query message 给 psql 客户端以后,整个过程就结束了。
QD 上面的函数栈信息
QE 上面的两个函数栈
结合上面几个函数栈信息,我们把 PostgreSQL 源代码上面的经典例子和解释再次贴出来,然后和 Greenplum 的执行流程做对比。
我们发现,QD 上面做了所有的步骤和 PostgreSQL 的事务过程是一致的。有三个函数 ExecutorStart,ExecutorRun 和 ExecutorEnd。这三个函数,不管是在 QD 上还是在 QE 上,都会执行一遍。读者可以自行加断点进行调试和理解。
总结,本篇文章讲述了 begin 命令以后,insert 命令在 master node 和 segment node 上面的执行过程。
在下一篇文章里面,我们会介绍 Greenplum 里面的状态机。状态机对于分布式事务非常重要,如果我们在分布式事务或者两阶段提交的过程中遇到异常,那么就要根据状态机的状态进行纠错,不同的状态下的纠错路径是不同的。
版权声明: 本文为 InfoQ 作者【王凤刚(ginobiliwang)】的原创文章。
原文链接:【http://xie.infoq.cn/article/d89066b81c67bc3a3c9719f7e】。未经作者许可,禁止转载。
评论