1、崩溃恢复和备机回放都是StartupXLOG函数进行处理,从pgcontrol文件中读取checkpoint位置,从这个位置开始读取WAL记录进行回放。
2、读取一个WAL记录的函数是ReadRecord,读取会后,根据类型进行回放;然后循环调用这个函数读取下一个WAL记录。
3、ReadRecord调用函数XLogReadRecord读取下一个WAL记录,若请求的记录不在当前页中,则需要读取一页到内存。如果读取的record为NULL,且是备机则切换日志源,从下一个日志源读取WAL
4、读取WAL的函数ReadPageInternal->XLogPageRead,日志源为流复制则根据条件判断读入的长度,否则为1页大小,但真正进行read的时候是以页为单位的。这里应该是读取的真实日志量。
5、日志读入内存的XLogReaderState->readBuf中,这个大小为8KB即一页大小。XLogReaderState->readLen为读入的日志量,有可能比8KB小
6、若下个WAL记录在下一页,需要跳过页头信息,否则为state->EndRecPtr即当前已读取的WAL记录末尾+1,即下一个WAL记录头
7、请求的大小为Min(targetRecOff + SizeOfXLogRecord, XLOG_BLCKSZ),即targetRecOff为WAL记录页内偏移,加上SizeOfXLogRecord即WAL记录头,即ReadPageInternal的reqLen长度最大才为一页大小。所以判断请求的WAL是否还在当前readBuf中条件:
if (targetSegNo == state->readSegNo && targetPageOff == state->readOff && reqLen <= state->readLen)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




