PostgreSQL在关机时会进行检查点。其流程如下:
1、在主进程中使用,会首先一个信号处理函数区域,向checkpoint等子进程注册发送信号。向checkpoint进程发送SIGUSR2
PostmasterMain(int argc, char *argv[])
pqsignal_no_restart(SIGCHLD,收割者); /* 处理子终止 */
收割者:
而 ((pid = waitpid(-1, &exitstatus, WNOHANG)) > 0){
...
if (pid == CheckpointerPID){
...
SignalChild(SIGUSR2);//向checkpoint进程发送SIGUSR2信号
}
...
}
2、checkpoint 同样,同样是一个处理函数ReqShutHandler,主处理进程注册发送过来的SIGUSR2信号。接收到该信号后将shutdown_requested置为TRUE。在checkpoint进程的for循环中,如果shutdown_requested为TRUE,则进程关闭停止每个进程,所有进程停止后,所有进程停止后,根据条件进行检查点:CreateRestartPoint 上游:CreateCheckPoint:
CheckpointerMain(void)->
//为信号SIGUSR2安装信号处理函数ReqShutdownHandler
pqsignal(SIGUSR2, ReqShutdownHandler); /* 请求关闭 */
...
为了 (;;){
如果(关闭请求){
/* 关闭数据库 */
关机XLOG(0, 0);
|-- WalSndInitStopping();//向每个发送者发送进程信号到停止状态
| WalSndWaitStopping();
| if (RecoveryInProgress())
| CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
| 别的{
| if (XLogArchivingActive() && XLogArchiveCommandSet())
| RequestXLogSwitch(false);
| CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
| }
|-- ...
proc_exit(0);
}
...
检查点
}
3、ReqShutdownHandler函数将shutdown_requested置为TRUE:
/* SIGUSR2: 设置标志以运行关闭检查点并退出 */
静态空白
ReqShutdownHandler(SIGNAL_ARGS)
{
shutdown_requested = true;
SetLatch(MyLatch);
}
本文分享自 yanzongshuaiDBA 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!