背景

  对于单机数据库而言[如postgres],死锁检测机制相对于分布式数据库如greenplum来说相对简单,其本质是通过相关约束构造等待图,如果出现死锁情况,则采用拓扑排序重排序列规避死锁,若无解法则回滚等待环中的某一事务/或若干事务来打破死锁。但是对于share nothing 的MPP架构数据库而言,采用上述方法无法获取全局等待视图,死锁的攻克显得力不从心.另辟蹊径,greenplum设计的方法是:通过在 master 节点设置全局死锁检测进程,不断地轮询计算节点上的本地等待图graph,在master上汇总形成全局等待图,利用相应的规则和算法来打破死锁。接下来一起学习,探索源码:

关键数据结构

1 数据结构流转图

2 概念介绍

3 数据结构分析
3.1 GddCtx:全局死锁上下文结构体,该结构体记录了全局等待图的相关信息,包括所有节点[分布式事务]的出/入度、segid与节点间映射关系、segid与本地等待图间的映射关系信息

struct GddCtx
{GddStat        topstat;        /* overall in/out degrees of all verts on all graphs */GddMap       globals;        /* Map<vid, Stat>, global in/out degrees */GddMap     graphs;         /* Map<segid, Graph>, the local graphs */
};

3.2 GddStat:记录某个分布式事务节点的出入度信息

/** Accounting information of a vert.*/
struct GddStat
{int            id;             /* vert id */        // 节点号  ===》 分布式事务号int          indeg;          /* in degree */      // 该节点的入度int           outdeg;         /* out degree */     // 该节点的出度
};

3.3 GddEdge:该结构记录等待图中边信息:包括是否为硬边、出节点、入节点信息和存放的数据

/** A directed edge.*/
struct GddEdge
{bool       solid;          /* a solid edge? */GddVert      *from;          /* the from vert */GddVert      *to;            /* the to vert */void        *data;
};

3.4 GddVert:该结构为计算segment上某个节点的相关信息,包括该节点在全局视图中的出入度,出边和入边等信息

/** A vertex (vert) on a segment.*/
struct GddVert
{int            id;             /* vert id *//** Pointer to ctx->topstat, all the verts on all the globals maintain* the overall in/out degrees count together.*/GddStat     *topstat;/** Pointer to the `global` struct with the same vert id, the global* in/out degrees of vert.*/GddStat       *global;List        *edgesIn;       /* List<Edge>, directed edges to vert */List      *edgesOut;      /* List<Edge>, directed edges from vert *//** The data set and used only by the caller, GDD does not touch or access* it.*/void       *data;
};

3.5 GddMap:本质GddPair数组,保存的是K-V映射关系

/** A <int, pointer> pair.*/
struct GddPair
{int            key;void        *ptr;
};/** A simple int->ptr map, implemented with array.*/
struct GddMap
{int            length;         /* length of the <k,v> array */int            capacity;       /* capacity of the <k,v> array */GddPair      *pairs;         /* array of <k,v> pairs */
};

3 GDD进程介绍和工作总流程

该进程是greenplum内置的辅助进程,postmaster正式接受客户端请求前在后台启动

 {"global deadlock detector process", "global deadlock detector process",BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION,BgWorkerStart_RecoveryFinished,0, /* restart immediately if gdd exits with non-zero code */"postgres", "GlobalDeadLockDetectorMain", 0, {0}, 0,GlobalDeadLockDetectorStartRule},        运行规则:bool GlobalDeadLockDetectorStartRule(Datum main_arg)
{if (Gp_role == GP_ROLE_DISPATCH &&gp_enable_global_deadlock_detector)return true;return false;
}

入口函数:GlobalDeadLockDetectorMain

/** GlobalDeadLockDetectorMain*/
void
GlobalDeadLockDetectorMain(Datum main_arg)
{am_global_deadlock_detector = true;                           // 更新标识pqsignal(SIGHUP, sigHupHandler);                               // 注册信号处理函数/* We're now ready to receive signals */BackgroundWorkerUnblockSignals();                         // 打开信号/* Connect to our database */BackgroundWorkerInitializeConnection(DB_FOR_COMMON_ACCESS, NULL, 0);        // 连接数据库/* disable orca here */extern bool optimizer;optimizer = false;GlobalDeadLockDetectorLoop();                            // 死锁检测,轮询,下节重点讲解/* One iteration done, go away */proc_exit(0);
}

greenplum源码解析 全局死锁检测GDD-1相关推荐

  1. greenplum 源码解析 FTS辅助进程工作主流程

    1 简介   FTS(Fault Tolerance Service)是greenplum提供的对于子节点的故障检测与恢复的服务.其隶属于master的一个子进程,通过定期轮询每个primary的状态 ...

  2. greenplum 源码解析 FTS辅助进程--ReadMe

    简介   在greenplum数据库中master节点有一个专属进程Fault Tolerance Service (FTS: 容错服务),其主要功能是检测所有segment节点的健康信息,如果其检测 ...

  3. 【DETR源码解析】二、Backbone模块

    目录 前言 一.Backbone整体结构 一.CNN-Backbone 二.Positional Encoding Reference 前言 最近在看DETR的源码,断断续续看了一星期左右,把主要的模 ...

  4. 【DETR源码解析】三、Transformer模块

    目录 前言 一.Transformer整体结构 二.TransformerEncoder 2.1.TransformerEncoderLayer 三.TransformerDecoder 3.1.Tr ...

  5. 人脸检测之MTCNN算法:论文阅读及源码解析

    文章目录 前言 一.MTCNN论文阅读 1.1 论文信息 1.2 论文摘要翻译 1.3 论文核心(三级级联网络) 1.4 论文核心(级联子网络结构) 1.5 损失函数 二.源码解析 2.1 三级级联网 ...

  6. 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉

    YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...

  7. 单目3D目标检测DEVIANT源码解析

    目前文档只包含outputs = model(inputs,coord_ranges,calibs,K=50,mode='test')之后,前向推理的源码解析,附带有测试程序 DEVIANT: Dep ...

  8. cvHoughLines2霍夫直线检测函数详解及源码解析

    转载请注明出处. 文章链接:https://blog.csdn.net/duiwangxiaomi/article/details/126406184 博文目录 一. 前言 二. cvHoughLin ...

  9. MySQL核心参数含义的源码解析

    引言 你访问的网站,大部分使用Apache服务器;你访问的网站,大部分使用Linux或BSD操作系统:你访问的网站,大部分使用MySQL数据库;你提交DNS域名查询请求大多由BIND服务器分析处理;你 ...

最新文章

  1. 正则:匹配一个汉字姓名
  2. C++中的模板template
  3. 【超越EfficientNet】无需注意力,Transformer结合视觉任务实现新SOTA
  4. Java解析html页面,获取想要的元素
  5. android 桌面循环滚动字幕,循环滚动字幕
  6. JetPack——网络库封装
  7. Python使用组合、排列和动态规划算法求解0-1背包问题
  8. 一台电脑两种jdk_jdk和jre有什么区别?
  9. labelimg如何调整框的颜色_新手如何快速做字幕?
  10. python 利用递归求阶乘
  11. 完美:Docker遇到Intellij IDEA这个插件,再次解放生产力~
  12. 编程基本功:变量局部化的教训
  13. RAM格式与JPG对比
  14. 为磁盘更换好看的ico图标
  15. GPS vs DGPS (差分GPS)
  16. linux 压缩文件夹.gz,Linux 系统 压缩和解压 gz 格式文件
  17. TiDB集群手动安装
  18. 苹果iPhone14频繁自动重启是什么原因?如何修复这个问题?
  19. 人工智能入门:第一章 人工智能课程介绍及环境配置
  20. ae教程(二)文字类

热门文章

  1. php 客户系统,php212客户管理系统
  2. defaultConfig——安卓gradle
  3. TreeView属性
  4. javax.persistence.OneToMany.orphanRemoval()Z异常
  5. LeetCode 455. 分发饼干
  6. Maxthon:超级技巧五则(转)
  7. 动手实现一个破产版tomcat
  8. 对多旅行商问题:应用、方法和分类进行了全面的综述
  9. C#实用教程-操作xml文件
  10. 当React开发者初次走进React-Native的世界