当前位置: 首页 > news >正文

lightdb/pg reload guc 参数机制

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 confSignalChildren(SIGHUP);         // 给其他子进程发送 SIGHUP 信号// 给其他后台进程发送SIGHUPif (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.lryc.cn/news/61205.html

相关文章:

  • E. Archaeology(纯思维)
  • FISCO BCOS(三十四)———商品溯源(智能合约+后端)
  • ts体操训练
  • int指令
  • Cycling 74 Max for Mac:音乐可视化编程软件
  • ROS学习第十二节——话题通信控制小乌龟
  • matlab点云的可视化-源码复制粘贴即可(一)
  • 反射-Class类分析
  • Let’s Make C++ Great Again——string与常用字符处理函数
  • 〖Python网络爬虫实战⑰〗- 网页解析利器parsel实战
  • 中电金信:生成式AI热潮下,文本智能走向何方?
  • 探索Linux设备树:硬件描述与驱动程序的桥梁
  • UNION ALL用法 以及 UNION ALL和UNION的区别
  • Ubuntu Linux操作
  • MongoDB常用语句(CURD)
  • 一篇文章让你彻底学会--节流(并且自己可以手写)
  • C++ 形参是类的指针 class * 通过new的方式创建对象
  • 手把手教你将项目部署到服务器!
  • OpenHarmony应用开发-ArkUI方舟开发框架简析
  • 【Transformer系列(4)】Transformer模型结构超详细解读
  • Idea启动运行报错:Error:java: 无效的源发行版: 13
  • 【元分析研究方法】学习笔记1.形成问题
  • 2023年3月 青少年软件编程(Python) 等级考试试卷(五级)
  • 必须要知道的hive调优知识(上)
  • 什么是Cache Aside Pattern与延迟双删
  • frp 流量特征
  • Unity --- UGUI(Unity Graphical user interface)--- Canvas画布
  • c++积累6-内联函数
  • ESP32学习笔记13-MCPWM主要用于无刷电机驱动
  • MyBatis-plu 和 JPA 对比