海山数据库(He3DB)源码详解:He3DB-XLogWrite函数

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值