本文接着介绍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,备机的话切换到下一个日志源进行读取