lightdb/pg reload guc 参数机制

news/2024/7/9 20:10:01 标签: lightdb, postgresql, pg_reload_conf, guc

lightdbpg_reload_guc__0">lightdb/pg reload guc 参数机制

本文主要讲述调用pg_reload_conf 后,到guc被真正修改之间发送的故事。(基于pg13)

pg_reload_conf 函数实现如下:

Datum
pg_reload_conf(PG_FUNCTION_ARGS)
{
	if (kill(PostmasterPid, SIGHUP))
	{
		ereport(WARNING,
				(errmsg("failed to send signal to postmaster: %m")));
		PG_RETURN_BOOL(false);
	}

	PG_RETURN_BOOL(true);
}

pg_reload_conf 会发送SIGHUP到postmaster 进程。而postmaster 进程中 SIGHUP 信号的处理函数为 SIGHUP_handler( pqsignal_pm(SIGHUP, SIGHUP_handler); ),其实现主要如下:

		ProcessConfigFile(PGC_SIGHUP);   //reload conf
		SignalChildren(SIGHUP);         // 给其他子进程发送 SIGHUP 信号
		
		// 给其他后台进程发送SIGHUP
		if (StartupPID != 0)
			signal_child(StartupPID, SIGHUP);
		if (BgWriterPID != 0)
			signal_child(BgWriterPID, SIGHUP);
		if (CheckpointerPID != 0)
			signal_child(CheckpointerPID, SIGHUP);
		if (WalWriterPID != 0)
			signal_child(WalWriterPID, SIGHUP);
		if (WalReceiverPID != 0)
			signal_child(WalReceiverPID, SIGHUP);
		if (AutoVacPID != 0)
			signal_child(AutoVacPID, SIGHUP);
		if (PgArchPID != 0)
			signal_child(PgArchPID, SIGHUP);
		if (SysLoggerPID != 0)
			signal_child(SysLoggerPID, SIGHUP);
		if (PgStatPID != 0)
			signal_child(PgStatPID, SIGHUP);

		/* Reload authentication config files too */
		if (!load_hba())
			ereport(LOG,
			/* translator: %s is a configuration file */
					(errmsg("%s was not reloaded", "lt_hba.conf")));

		if (!load_ident())
			ereport(LOG,
					(errmsg("%s was not reloaded", "lt_ident.conf")));

主要流程是先在本进程reload conf(ProcessConfigFile), 然后给其他子进程发送 SIGHUP 信号。

下面讲一下 postgres (客户端连接进程)收到 SIGHUP 的处理

PostgresMain postgres main loop – all backends, interactive or otherwise start here

postgres 为 SIGHUP 注册的处理函数为 SignalHandlerForConfigReload (pqsignal(SIGHUP, SignalHandlerForConfigReload);)。其实现如下:

void
SignalHandlerForConfigReload(SIGNAL_ARGS)
{
	int			save_errno = errno;

	ConfigReloadPending = true;
	SetLatch(MyLatch);

	errno = save_errno;
}

主要为设置 ConfigReloadPending = tue, 然后通过 SetLatch(MyLatch) 来唤醒当前进程。当前进程被唤醒后处理如下(如果当前正在执行SQL, 则会被中断来处理信号,处理完信号,继续执行SQL,执行完SQL,在需要等待下一条SQL时 会不等待而直接处理latch的唤醒):

		/* Handle interrupt. */
		if (event.events & WL_LATCH_SET)
		{
			ResetLatch(MyLatch);
			ProcessClientReadInterrupt(true);

			/*
			 * We'll retry the read. Most likely it will return immediately
			 * because there's still no data available, and we'll wait for the
			 * socket to become ready again.
			 */
		}
		goto retry;

唤醒后会进行ResetLatch等操作,然后会尝试读取数据流, 若没有,则继续等待下一个query 的到来才会去真正的reload conf(执行query前, 先reload).,若有直接返回。

在进程被 query 唤醒后,会执行如下代码:

if (ConfigReloadPending)
{
	ConfigReloadPending = false;
	ProcessConfigFile(PGC_SIGHUP);
}

最终调用ProcessConfigFile执行配置文件的reload。 reload 结束后,会执行接受到的query。

这个机制可以保证,在 reload 的时候,不会执行其他命令, 可以保证执行命令过程中 guc 不会被修改。

但也会出现在执行 pg_reload_conf 函数后, guc 参数没有被及时修改的情况(从postmaster收到信号,处理reload, 发送信号给postgres 进程, 到postgres 进程被唤醒这段时间内,如果执行了SQL,GUC 参数还是原先的值。 一般情况下,时间极短)。

ProcessConfigFile 实现

ProcessConfigFile 最终调用 ProcessConfigFileInternal, 对于postmaster 进程会记录修改后的值。通过如下判断来使只有postmaster可以获取到prev_guc, 有prev_guc 才会记录日志。

if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)

http://www.niftyadmin.cn/n/254495.html

相关文章

SpringBoot拦截器的使用

Hi I’m Shendi SpringBoot拦截器的使用 简介 最近要实现一个全局对象的传递,在接口中直接通过增加函数参数来直接使用的这种方式 之前一直使用的是过滤器,但这种需求过滤器是没有办法实现的,过滤器可以给请求注入字符串,但不能…

谷歌云 | 内部 HTTP(S) 负载均衡器现在可以在全球范围内访问

【本文由Cloud Ace整理发布,Cloud Ace 是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。 作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷…

如何避免美国ASP主机服务器崩溃和故障?

在当今数字化时代,网站是一个公司展示其业务的主要方式之一。因此,公司的在线业务应该始终保持高可用性和可靠性。ASP主机服务器是一种用于托管网站的服务器,其特点是可靠性高。但是,即使是最可靠的服务器也会遭受故障或崩溃。在本…

NFS共享存储服务

目录 一、NFS简介二. NFS工作原理实验:准备一台服务器,一台客户端。实现共享目录服务器上发布共享目录配置操作客户端配置操作 总结 一、NFS简介 NFS(Network File System 网络文件服务) NFS 是一种基于 TCP/IP 传输的网络文件系…

2023/4/23周报

目录 摘要 论文阅读 1、标题和现存问题 2、矩阵分解(MF)和图神经网络 3、GNN_MF框架 4、项目聚集和社会聚集 5、实验准备和结果 2、深度学习 1、GCN 2、代码实例 总结 摘要 本周在论文阅读上,阅读了一篇基于GNN的矩阵分解推荐算法…

【LeetCode】剑指 Offer 67. 把字符串转换成整数 p318 -- Java Version

题目链接:https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/ 1. 题目介绍(67. 把字符串转换成整数) 写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 …

报告打印的相关CAPL函数,实例代码演示汇总

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 目录 📙1 测试用例中报告打印相关1.1 TestCaseTitle1.2 TestCaseDescripti…

抓圆工具-记录

* Matching 01: BEGIN of generated code for model initialization set_system (border_shape_models, false) * Matching 01: Obtain the model image *read_image (Image, E:/下载/3倍镜PCB/1-10.bmp) * Matching 01: build the ROI from basic regions *gen_circle (ModelR…