XLogWrite函数
- 函数定义
static void
XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible)
- XLogwrtRqst:请求写入位置信息
- TimeLineID:时间线,表示一个从创建点到当前点的完整数据库历史
- bool flexible:指示写入操作是否可以灵活处理,即不必严格按照WriteRqst指定的位置进行写入,可以在方便的边界(如缓存或日志文件的边界)停止
- 该函数调用必须处于临界区
Assert(CritSectionCount > 0);
- 保护共享资源,避免数据竞争
- CritSectionCount 变量见XLogFlush中开启临界区函数,会使该变量++
- 更新写入和刷新的位置result
LogwrtResult = XLogCtl->LogwrtResult;
- 初始化变量
npages = 0;
startidx = 0;
startoffset = 0;
curridx = XLogRecPtrToBufIdx(LogwrtResult.Write);
- npages:表示可以连续写入磁盘的 WAL 页面数量(待转储的页面数)。由于 WAL 页面在内存中通常是连续分配的,因此可以优化写入操作,通过一次磁盘 I/O 操作写入多个页面,从而减少磁盘操作的次数,提高性能
被初始化为 0,表示还没有找到任何可以连续写入的页面
- startidx:表示可以连续写入的 WAL 页面序列中第一个页面的缓存块索引。这个索引用于在 WAL 缓存中定位起始页面,以便从那里开始收集可以连续写入的页面。
被初始化为 0 或某个无效值,表示还没有确定起始页面
- startoffset:表示在 WAL 日志文件中,第一个可以写入的页面应该被写入的位置(即文件偏移量)。这个偏移量允许系统知道从哪里开始写入这些页面,以确保 WAL 日志的完整性和顺序性。
索引startidx和偏移量startoffset就决定了WAL日志写入的位置
- curridx:代表当前正在考虑的 WAL 缓存页面的索引,该索引由
XLogRecPtrToBufIdx(LogwrtResult.Write);返回该函数将传入的已经写入的末位置转换为缓存页面的索引
- 开始循环
while (LogwrtResult.Write < WriteRqst.Write)
{
}
该循环只能在请求写入的位置大于已经写入位置才能进行
XLogRecPtr EndPtr = XLogCtl->xlblocks[curridx];
if (LogwrtResult.Write >= EndPtr)
elog(PANIC, "xlog write request %X/%X is past end of log %X/%X",
LSN_FORMAT_ARGS(LogwrtResult.Write),
LSN_FORMAT_ARGS(EndPtr));
- 赋值末尾位置给EndPtr,可以理解为从EndPtr开始,要开始写入了,EndPtr是上一个的结尾,即当前缓冲区的结束位置
- 如果已经写入的位置比将要开始写的位置(或者说上一个结束的位置)要大,则报PANIC日志错误,并输出二者位置信息
LogwrtResult.Write = EndPtr;
ispartialpage = WriteRqst.Write < LogwrtResult.Write;
- 将已经写入的位置更新为当前缓冲区的结束位置
- 记录请求写入位置是否小于当前缓冲区结束位置
if (!XLByteInPrevSeg(LogwrtResult.Write, openLogSegNo, wal_segment_size))
{
Assert(npages == 0);
if (openLogFile >= 0)
XLogFileClose();
XLByteToPrevSeg

最低0.47元/天 解锁文章
790

被折叠的 条评论
为什么被折叠?



