提示:
由于工作原因文章还没有弄完,请跳过,弄完后,会删除此提示
基础流程:
BackgroundWriterMain
BgBuffferSync->
SyncOneBuffer->
FlushBuffer()->
smgrwrite()
逻辑部分
首先代码定义一些基础类型和变量,例如:信号的处理,bgwrite的内存上下文,错误处理机制等。
然后,进入后台写进程,后台写进程是一个死循环进程,启动后,如果没有一些特殊情况(如:master死亡,关机等信号)就会一直运行。
此函数主要做一些简单的工作,如,监听信号(重新加载、关机等信号)确定是否退出或者重载。
调用落盘函数接口(BgBufferSync),将落盘动作返回的统计动作发送给stat统计表。
做一些简单的判断判断是否要进入一个长时间的睡眠(如果超过WL_TIMEOUT,并且连续两次没有落盘动作,就会进入一个长时间的睡眠)。
如果睡眠时间到,或者睡眠期间有内存的分配操作,就会醒来。然后再次循环。
代码部分
void
BackgroundWriterMain(void)
{
sigjmp_buf local_sigjmp_buf;
//解析:定义错误恢复变量,保存错误后信号
MemoryContext bgwriter_context;
//解析:定义内存上下文
bool prev_hibernate;
//解析:定义预先睡眠,后面用来确定是否进入一个深度睡眠
WritebackContext wb_context;
//解析:定义后台写进程上下文
//内存上下文解析:
//1.pg是基于进程的,每个进程拥有一块内存,分配内存上下文为了方便内存的处理。
//2.方便错误处理,自己进行内存的管理,方便错误发生时进行恢复操作。
pqsignal(SIGHUP, BgSigHupHandler); /* set flag to read config file */
pqsignal(SIGINT, SIG_IGN);
pqsignal(SIGTERM, ReqShutdownHandler); /* shutdown */
pqsignal(SIGQUIT, bg_quickdie); /* hard crash time */
pqs