greenplum源码解析 全局死锁检测GDD-1
背景
对于单机数据库而言[如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相关推荐
- greenplum 源码解析 FTS辅助进程工作主流程
1 简介 FTS(Fault Tolerance Service)是greenplum提供的对于子节点的故障检测与恢复的服务.其隶属于master的一个子进程,通过定期轮询每个primary的状态 ...
- greenplum 源码解析 FTS辅助进程--ReadMe
简介 在greenplum数据库中master节点有一个专属进程Fault Tolerance Service (FTS: 容错服务),其主要功能是检测所有segment节点的健康信息,如果其检测 ...
- 【DETR源码解析】二、Backbone模块
目录 前言 一.Backbone整体结构 一.CNN-Backbone 二.Positional Encoding Reference 前言 最近在看DETR的源码,断断续续看了一星期左右,把主要的模 ...
- 【DETR源码解析】三、Transformer模块
目录 前言 一.Transformer整体结构 二.TransformerEncoder 2.1.TransformerEncoderLayer 三.TransformerDecoder 3.1.Tr ...
- 人脸检测之MTCNN算法:论文阅读及源码解析
文章目录 前言 一.MTCNN论文阅读 1.1 论文信息 1.2 论文摘要翻译 1.3 论文核心(三级级联网络) 1.4 论文核心(级联子网络结构) 1.5 损失函数 二.源码解析 2.1 三级级联网 ...
- 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉
YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...
- 单目3D目标检测DEVIANT源码解析
目前文档只包含outputs = model(inputs,coord_ranges,calibs,K=50,mode='test')之后,前向推理的源码解析,附带有测试程序 DEVIANT: Dep ...
- cvHoughLines2霍夫直线检测函数详解及源码解析
转载请注明出处. 文章链接:https://blog.csdn.net/duiwangxiaomi/article/details/126406184 博文目录 一. 前言 二. cvHoughLin ...
- MySQL核心参数含义的源码解析
引言 你访问的网站,大部分使用Apache服务器;你访问的网站,大部分使用Linux或BSD操作系统:你访问的网站,大部分使用MySQL数据库;你提交DNS域名查询请求大多由BIND服务器分析处理;你 ...
最新文章
- 正则:匹配一个汉字姓名
- C++中的模板template
- 【超越EfficientNet】无需注意力,Transformer结合视觉任务实现新SOTA
- Java解析html页面,获取想要的元素
- android 桌面循环滚动字幕,循环滚动字幕
- JetPack——网络库封装
- Python使用组合、排列和动态规划算法求解0-1背包问题
- 一台电脑两种jdk_jdk和jre有什么区别?
- labelimg如何调整框的颜色_新手如何快速做字幕?
- python 利用递归求阶乘
- 完美:Docker遇到Intellij IDEA这个插件,再次解放生产力~
- 编程基本功:变量局部化的教训
- RAM格式与JPG对比
- 为磁盘更换好看的ico图标
- GPS vs DGPS (差分GPS)
- linux 压缩文件夹.gz,Linux 系统 压缩和解压 gz 格式文件
- TiDB集群手动安装
- 苹果iPhone14频繁自动重启是什么原因?如何修复这个问题?
- 人工智能入门:第一章 人工智能课程介绍及环境配置
- ae教程(二)文字类