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

2020-10-28 09:50:18 浏览数 (2)

本文接着介绍WAL写和读的改造。

1、XLogInsert函数改造:将日志写入NVM,此时不确定CPU CACHE何时刷以及顺序

当日志量距离上次checkpoint产生的WAL文件个数(wal_segment_size)超过CheckPointSegments时,需要发起checkpoint请求。需要保证WAL buffer空间够用。

2、XLogPageRead读取指定WAL所在页到readBuf

1)readSource的WAL源不是NVM,默认是XLOG_FROM_ANY && Wal记录所在位置的文件未open或者读取WAL源为流复制且需要的日志还未接收到时需要调用函数WaitForWALToBecomeAvailable打开所需WAL文件。第一次进来时readSource是XLOG_FROM_ANY,所以当使用NVM时也会进入该函数,只是该函数会返回false。

2)之后,若使用NVM WAL BUFFER并且非备机模式,readSource也不能是流复制,那么需要将日志源改为NVM WAL BUFFER

3)此时readSource为NVM WAL BUFFER,读取大小设置为一页大小

4)XLogCtl->pages targetPagePtr%NvWalSize为读取页的页头地址,调用memcpy将NVM的一页内存拷贝到readBuf中,并将时间线从该日志页第一个记录中解析出来

5)如果校验该WAL页有效,将当前时间线curFileTLI记为日志页第一个记录中记录的时间线;否则若为主机则直接返回-1,备机的话切换到下一个日志源进行读取

0 人点赞