本文接着介绍非易失性WAL buffer对StartupXLOG流程的改造。

非易失性WAL buffer实现解析(五)

1StartupXLO流程中,当WAL日志回放完退出回放循环后,对其进行改造

2ControlFile->discardedUpTo为新增加的变量,表示这个节点之前的WAL段文件可以回收了,这个位点以WAL段文件大小为单位。

3)如果EndOfLog<=discardedUpTo,即最后的回放的位置在需要回收的范围内:此时将整个NVM WAL BUFFER0并持久化到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为末尾处。

非易失性WAL buffer实现解析(五)

6)如果EndOfLog位于页边界上:XLogCtl->InitializedUpTo = EndOfLog;,将初始化位置保存为EndOfLog

7)接着需要对LogwrtResultXLogCtl->LogwrtResult处理

8)最后需要预分配一个XLOG文件。如果是NVM wal BUFFER,则需调用PreallocNonVolatileXlogBuffer函数,否则调用PreallocXlogFiles。对于NVM WAL BUFFER的预分配,下篇文章接着介绍

相关文章:

  • 2021-10-05
  • 2022-01-19
  • 2022-01-12
  • 2021-04-25
  • 2021-09-09
  • 2021-08-26
  • 2022-12-23
  • 2021-06-16
猜你喜欢
  • 2021-12-20
  • 2021-09-09
  • 2021-04-13
  • 2021-11-03
  • 2022-03-04
  • 2021-12-12
  • 2022-12-23
相关资源
相似解决方案