海山数据库(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);
- 释放锁