Postgresql源码(111)dms框架进程信号发送与处理流程

news2024/11/25 20:51:33

信号处理整体流程

  1. 信号从bgworker发出后,主进程将ParallelMessagePending置为true,下次CHECK_FOR_INTERRUPTS()时,会进入信号处理逻辑中:HandleParallelMessages。
  2. 进入信号处理逻辑后,首先遍历所有现存的ParallelContext,每一个ParallelContext都是由CreateParallelContext创建出来的,代表一个并行逻辑单元。例如vacuum有一个ParallelContext、并行执行计划也会创建一个ParallelContext。
  3. 每一个ParallelContext中,都会管理多个并行bgworker进程,而每一个bgworker都会提前申请一个共享内存mq,也就是error_mqh,具体在ParallelContext->worker[i].error_mqh中。
  4. 开始遍历每个进程的mq,看其中是否存在消息,如果有消息则安下面HandleParallelMessage逻辑处理掉即可。
    在这里插入图片描述

信号处理逻辑

static void
HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
{
	char		msgtype;

	if (pcxt->known_attached_workers != NULL &&
		!pcxt->known_attached_workers[i])
	{
		pcxt->known_attached_workers[i] = true;
		pcxt->nknown_attached_workers++;
	}

	msgtype = pq_getmsgbyte(msg);

	switch (msgtype)
	{
		case 'K':				/* BackendKeyData */
			{
				int32		pid = pq_getmsgint(msg, 4);

				(void) pq_getmsgint(msg, 4);	/* discard cancel key */
				(void) pq_getmsgend(msg);
				pcxt->worker[i].pid = pid;
				break;
			}

		case 'E':				/* ErrorResponse */
		case 'N':				/* NoticeResponse */
			{
				ErrorData	edata;
				ErrorContextCallback *save_error_context_stack;

				/* Parse ErrorResponse or NoticeResponse. */
				pq_parse_errornotice(msg, &edata);

				/* Death of a worker isn't enough justification for suicide. */
				edata.elevel = Min(edata.elevel, ERROR);

				/*
				 * If desired, add a context line to show that this is a
				 * message propagated from a parallel worker.  Otherwise, it
				 * can sometimes be confusing to understand what actually
				 * happened.  (We don't do this in DEBUG_PARALLEL_REGRESS mode
				 * because it causes test-result instability depending on
				 * whether a parallel worker is actually used or not.)
				 */
				if (debug_parallel_query != DEBUG_PARALLEL_REGRESS)
				{
					if (edata.context)
						edata.context = psprintf("%s\n%s", edata.context,
												 _("parallel worker"));
					else
						edata.context = pstrdup(_("parallel worker"));
				}

				/*
				 * Context beyond that should use the error context callbacks
				 * that were in effect when the ParallelContext was created,
				 * not the current ones.
				 */
				save_error_context_stack = error_context_stack;
				error_context_stack = pcxt->error_context_stack;

				/* Rethrow error or print notice. */
				ThrowErrorData(&edata);

				/* Not an error, so restore previous context stack. */
				error_context_stack = save_error_context_stack;

				break;
			}

		case 'A':				/* NotifyResponse */
			{
				/* Propagate NotifyResponse. */
				int32		pid;
				const char *channel;
				const char *payload;

				pid = pq_getmsgint(msg, 4);
				channel = pq_getmsgrawstring(msg);
				payload = pq_getmsgrawstring(msg);
				pq_endmessage(msg);

				NotifyMyFrontEnd(channel, payload, pid);

				break;
			}

		case 'X':				/* Terminate, indicating clean exit */
			{
				shm_mq_detach(pcxt->worker[i].error_mqh);
				pcxt->worker[i].error_mqh = NULL;
				break;
			}

		default:
			{
				elog(ERROR, "unrecognized message type received from parallel worker: %c (message length %d bytes)",
					 msgtype, msg->len);
			}
	}
}

信号是在哪里发出的?

每一个bgworker都会进入ParallelWorkerMain函数,在ParallelWorkerMain中会根据执行情况发出不同的信号:

例如:

void
ParallelWorkerMain(Datum main_arg)
{

'K'告知主进程当前子进程的PID。

	pq_beginmessage(&msgbuf, 'K');
	pq_sendint32(&msgbuf, (int32) MyProcPid);
	pq_sendint32(&msgbuf, (int32) MyCancelKey);
	pq_endmessage(&msgbuf);

'X'告知主进程当前子进程正常退出了。

	pq_putmessage('X', NULL, 0);
}

还有一种情况,bgworker里面执行的逻辑如果出错了怎么办?

会走elog的底层逻辑,给这个mq发'E''N',代码逻辑在这里:
在这里插入图片描述

error mq的内存是在哪里申请的?

和其他dsm中的共享内存结构一样,先调toc分配一段空间,然后初始化这段空间,然后调toc插入。后面用的时候用toc find函数用key来找到这段空间即可,key就是PARALLEL_KEY_ERROR_QUEUE。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

护网专题简单介绍

护网专题简单介绍 一、护网红蓝队介绍1.1、网络安全大事件1.2、护网行动由来1.3、护网行动中的角色二、红队介绍2.1、红队所需技能2.2、红队攻击流程 三、蓝队介绍3.1、蓝队所需技能3.2、蓝队防守四阶段3.3、蓝队前期准备 四、常见安全厂商介绍4.1、常见安全厂商 五、常见安全产…

Softing工业获得自动化产品安全开发流程认证

Softing工业获得了TV Sd颁发的IEC 62443-4-1产品安全开发流程认证。 (IEC 62443-4-1认证确保网络安全) 截至2023年6月,位于德国哈尔和纽伦堡的工厂以及罗马尼亚克卢日的Softing工业研发部门已获得IEC 62443-4-1:2018标准的认证。该认证流程由…

Ajax-概念、Http协议、Ajax请求及其常见问题

Ajax Ajax概念Ajax优缺点HTTP协议请求报文响应报文 Ajax案例准备工作express基本使用创建一个服务器 发送AJAX请求GET请求POST请求JSON响应 Ajax请求出现的问题IE缓存问题Ajax请求超时与网络异常处理Ajax手动取消请求Ajax重复发送请求问题 Ajax概念 AJAX 全称为Asynchronous J…

《孙子兵法》快速概览,有哪些章节?趣讲《孙子兵法》【第2讲】

《孙子兵法》快速概览,有哪些章节?趣讲《孙子兵法》【第2讲】 《孙子兵法》十一家注是一个有名的版本,十一家注是曹操、杜牧等十一人注释,曹操是真正的军事家,是名副其实的大咖。总共三卷十三篇,比较难记住…

Unity 3D中使用tilemap创建关卡地图,瓦片间隙有漏缝

我们使用一张图片来作为Sprite图集,创建地形图: 运行后,会发现,瓦片之间似乎总是有间距。 检查了图片发现,并不是图片边界存在间隙。 最后发现问题是出在图片资源中的线性过滤属性值: 在设计界面就能够看…

【三维编辑】SPIn-NeRF:多视图分割与感知修复(CVPR 2023)

文章目录 摘要一、简介二、相关工作1.Image Inpainting2.NeRF 操作3. 背景: NeRF 知识 三、方法3.1.多视图分割3.1.1掩码初始化3.1.2基于nerf的分割 3.2.多视图 Inpainting3.2.1 RGB先验3.2.2深度先验3.2.3基于patch 的优化3.2.4掩码精炼 四、实验五、安装与代码讲解1.项目安装…

一篇文章看懂Apipost Mock功能怎么用

在接口开发过程中,Mock功能可以帮助开发者快速测试和验证接口的正确性和稳定性,以便快速迭代和修复问题。Apipost推出智能Mock功能,可以在智能期望中填写一些触发条件,开启后,Apipost会根据已设置的触发条件&#xff0…

Linux-GPIO 配置pull up、pull down、no pull

author daisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 https://blog.csdn.net/qq_40715266?typeblog 系列基于RK3568的Linux驱动开发——GPIO知识点(一)_daisy.skye的博客-CSDN博客基于RK3568的Linux驱动开发—— GPIO知识点(二&#…

【H5】盘点HTML5新特性

html5总的来说比html4多了十个新特性,但其不支持ie8及ie8以下版本的浏览器 文章目录 一、语义标签二、增强型表单三、音频和视频四、Canvas绘图五、SVG绘图六、地理定位七、拖放API八、Web Worker九、Web Storage十、WebSocket 一、语义标签 html5语义标签&#x…

Maven的安装与配置(包含所有细节)

一、idea版本和maven配对 这里是很多新手都会遇到的大坑,一定要先将自己的idea版本和maven进行版本配配对。 Maven3.6.3版本兼容问题 注意:针对一些老项目 还是尽量采用 3.6.3版本,针对idea各个版本的兼容性就很兼容 IDEA 2022 兼容maven 3.8…

肠道重要菌属——埃希氏菌属 (Escherichia), 肠道炎症和生态失调相关

谷禾健康 —变形菌门 —γ变形菌纲 —肠杆菌目 —肠杆菌科 —埃希氏菌属 埃希氏菌属 (Escherichia),是一种常见的细菌。其中最著名的种是大肠杆菌(Escherichia coli),大肠杆菌是一种厌氧菌,通常生活在人和动物的肠道中…

echarts 日常设计感图表

饼图 pieChart(id) {const data {value:100,type:aaa}let angle 0; //角度,用来做简单的动画效果的let count echarts.init(document.getElementById(id));let option {title: [{text: "{a|" data.value "}{c|%}",x: "center"…

super父类 事物

一个没有事物的方法。 调用他的父类里有事物的方法。 无论this 和 super 都会让父类事物方法没有事物。 如果写了super.class 文件里面,就是super调用。 如果没写,就是this调用,坑爹 测试,把父类注入,事物才生效。

Redis——特性介绍与应用场景

Redis特性介绍 In-memory data structrues 众所周知,MySQL是一种关系型数据库,其通过表的结构存储数据,就类似于建立了一个excel表格来存储数据。但是像视频这类数据并不适合存储在关系型数据库中,因此存在非关系型数据库——通…

用例拆分情况考虑方案

文章目录 1、方案一方案概述方案分析(1) 把对应图商地图的逻辑给分离开(2) 要使用命令行的方式执行方法 2、方案二3、最终决定 1、方案一 方案概述 每个图商(GD、BD、自建)拆分成单独的类 把参数化的几个图商类别拆分成对应的图商类,在每个类…

服务器数据恢复-EXT3分区误删除邮件的数据恢复案例

服务器数据恢复环境: 一台服务器有一组由8块盘组建的RAID5阵列,EXT3文件系统。 服务器故障: 由于工作人员的误操作导致文件系统中的邮件丢失。用户需要恢复丢失的邮件数据。 服务器数据恢复过程: 1、将故障服务器中所有磁盘以只…

LabVIEW开发分段反射器测试台

LabVIEW开发分段反射器测试台 随着对太空的观察需求越来越远,而不是当前技术(如哈勃望远镜)所能达到的,有必要增加太空望远镜主镜的尺寸。但是,增加主镜像的大小时存在几个问题。随着反射镜尺寸的增加,制造…

车载开发能不能入?Android实属卷不动了

随着智能化的快速发展,车载开发成为了汽车行业中的一个重要领域。车载开发是指开发和设计车载系统中的软件和硬件,以实现车辆的智能化和互联化。在当前汽车行业竞争激烈的市场环境下,车载开发岗位具有广阔的发展前景。 随着人们对智能化的需…

VMware虚拟机开机状态动态增加内存和CPU

实验环境:一台虚拟机 1、右击虚拟机,点击“编辑设置”, 2、在“选项”中,找到“内存/cpu热插拔”这一项,把“为此虚拟机启动内存热添加”和“仅为此虚拟机启动CPU热添加”打钩,点击 “确定”。 注意&#x…