海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数(1)
背景
本文主要针对海山数据库中CLOG日志管理器部分关键函数源码进行研读。主要涉及BootStrapCLOG、StartupCLOG
BootStrapCLOG
作用:系统初始化时需要调用该函数,以创建第一个CLOG日志段
函数源码:
void
BootStrapCLOG(void)
{
int slotno;
LWLockAcquire(XactSLRULock, LW_EXCLUSIVE);
/* Create and zero the first page of the commit log */
slotno = ZeroCLOGPage(0, false);
/* Make sure it's written out */
SimpleLruWritePage(XactCtl, slotno);
Assert(!XactCtl->shared->page_dirty[slotno]);
LWLockRelease(XactSLRULock);
}
- 定义
slotno,用于存储CLOG页面的槽位号
LWLockAcquire(XactSLRULock, LW_EXCLUSIVE);
- 获取
XactSLRULock锁,该锁mode是LW_EXCLUSIVE
slotno = ZeroCLOGPage(0, false);
- 调用
ZeroCLOGPage(0, false)函数,初始化页面编号为0的CLOG页面为0,即第一个CLOG页面,且此时false表示没有需要写入的Xlog信息(详情见ZeroCLOGPage文档)
SimpleLruWritePage(XactCtl, slotno);
- 调用
SimpleLruWritePage将上一步初始化的页面(由slotno槽位号指定)写入磁盘
Assert(!XactCtl->shared->page_dirty[slotno]);
- 判断该槽对用的page是否为脏,若不会脏,则报错
- 当数据块(如页面、记录等)被修改后,还没有被同步到磁盘上,那么这些数据就被认为是“脏”的
- 由于上一步已经执行了
SimpleLruWritePage将页面写入磁盘,所以按照逻辑来讲,这里的槽对应的页面应该是干净的
LWLockRelease(XactSLRULock);
- 释放XactSLRULock锁
StartupCLOG
作用:启动CLOG日志管理器
函数源码:
void
StartupCLOG(void)
{
TransactionId xid = XidFromFullTransactionId(ShmemVariableCache->nextXid);
int pageno = TransactionIdToPage(xid);
LWLockAcquire(XactSLRULock, LW_EXCLUSIVE);
/*
* Initialize our idea of the latest page number.
*/
XactCtl->shared->latest_page_number = pageno;
LWLockRelease(XactSLRULock);
}
TransactionId xid = XidFromFullTransactionId(ShmemVariableCache->nextXid);
- 获取下一个可分配的事务ID。参数
ShmemVariableCache->nextXid存储着下一个即将被分配的事务ID -
- 该参数是由
StartupXLOG进行初始化的
- 该参数是由
int pageno = TransactionIdToPage(xid);
- 将获取的事务ID转化为对应的页号,赋值给
pageno
LWLockAcquire(XactSLRULock, LW_EXCLUSIVE);
- 获取
XactSLRULock锁,mode为LW_EXCLUSIVE
XactCtl->shared->latest_page_number = pageno;
- 将上一步获得的页号赋值给
latest_page_number,该变量记录当前CLOG日志中最新的页号
LWLockRelease(XactSLRULock);
- 释放锁
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




