海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数(1)

海山数据库(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);
  • 释放锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值