本文接着介绍非易失性WAL buffer对StartupXLOG流程的改造。
1)StartupXLO流程中,当WAL日志回放完退出回放循环后,对其进行改造
2)ControlFile->discardedUpTo为新增加的变量,表示这个节点之前的WAL段文件可以回收了,这个位点以WAL段文件大小为单位。
3)如果EndOfLog<=discardedUpTo,即最后的回放的位置在需要回收的范围内:此时将整个NVM WAL BUFFER清0并持久化到nvm介质,同时更新ControlFile->discardedUpTo为初始值并写到pg_control文件
4)如果EndOfLog>discardedUpTo:需要重新初始化XLogCtl->xlblocks数组,即如下图所示,discardedUpTo的位置开始+一页大小作为XLogCtl->xlblocks[idx+1],依次类推直到最后位置
5)如果EndOfLog位于一页中间,即不在页边界上:需要将xlogreader->readBuf即最后回放的WAL页有效内容拷贝到EndOfLog所在页,并将剩余内容清0,然后调用nv_persist将该页内容持久化到NVM,如下图最后一个block所示。并再初始化最后一个XLogCtl->xlblocks[]数组,及初始化位置XLogCtl->InitializedUpTo为末尾处。
6)如果EndOfLog位于页边界上:XLogCtl->InitializedUpTo = EndOfLog;,将初始化位置保存为EndOfLog
7)接着需要对LogwrtResult和XLogCtl->LogwrtResult处理
8)最后需要预分配一个XLOG文件。如果是NVM wal BUFFER,则需调用PreallocNonVolatileXlogBuffer函数,否则调用PreallocXlogFiles。对于NVM WAL BUFFER的预分配,下篇文章接着介绍