靓科技解读|PostgreSQL的全局死锁检测原理( 三 )


全局死锁检测器工作原理
下面 , 通过全局等待图 , 让我们看看集群是如何处理全局死锁的 。
基本思路如下:主节点上的BackgroundWorker进程通过查询集群来定期建立全局等待图 。 接着 , 删除与死锁无关的节点和边 。 重复此过程 , 直到无法删除任何节点或边 。 如果仍然存在边 , 则也存在全局死锁 , 我们需要选择一个会话来取消 。
接下来 , 让我们详细介绍上述步骤 。
靓科技解读|PostgreSQL的全局死锁检测原理
文章图片
要构建等待图 , 我们需要在每个Segment上收集锁信息 。 这是一个两阶段过程 。
1.构建全局图
首先 , 它使用Postgres内部函数GetLockStatusData从PROCLOCK共享内存中获取锁等待关系 。 我们需要扩展lockInstanceData结构 , 以涵盖分布式事务ID和holdTillEndXact标志 。 之后 , BackgroundWorker进程需要从每个ForeignServer收集本地锁信息 , 并形成一个全局锁等待图 。
靓科技解读|PostgreSQL的全局死锁检测原理
文章图片
每个本地锁等待图包括以下属性:SegmentID , 锁等待者和锁持有者的分布式事务ID , 标注其为实边或虚边 , 以及其他属性 , 例如pid , sessionid , 锁类型和锁模式 , 涵盖了之前介绍的节点和边的四个主要属性 。
靓科技解读|PostgreSQL的全局死锁检测原理
文章图片
2.消除节点和边
下一步是消除不相关的节点和边 。 我们使用启发式贪婪算法 。