wiredTiger存储引擎源码解读---缓存数据写到磁盘的函数调用栈

本文详细介绍了WiredTiger存储引擎从事务checkpoint开始,如何将缓存数据写入磁盘的过程。通过函数调用栈,从__wt_txn_checkpoint开始,经过__wt_cache_op,最终由pwrite函数将数据实际写入文件。过程中涉及事务处理、日志记录、元数据更新和页缓存同步等关键步骤。
摘要由CSDN通过智能技术生成

先贴一下运行时函数栈
这个图是做checkpoint写磁盘时的函数栈(gdb调试的3.6的源码)
对,最终写磁盘的函数是 pwrite,把wt缓存里的数据写到磁盘上
pwrite函数功能:

带偏移量地写数据到文件中,写入地址=文件开始+offset,len 写入长度;

注意,执行后,文件便宜指针不变;

执行成功,返回写入到文件中的字节数;失败,返回-1

下面介绍下每一层的函数都在做什么,我们至顶向下,根据调用关系一层一层看:

__wt_txn_checkpoint

transaction层处理checkpoint,保证每次checkpoint的事务性

__checkpoint_apply

Apply an operation to all handles locked for a checkpoint.

在做checkpoint时 会锁住本次checkpoint要写的btree的对应的句柄(__wt_data_handle),在__checkpoint_apply 函数中会遍历锁住的所有btree

(每一棵btree都有一个 session->dhandle = session->ckpt_handle[i];),一个一个做checkpoint,调用的函数就是__checkpoint_tree_helper ,传入session参数

__checkpoint_tree_helper

通过 session→dhandle 来或取是checkpoint哪一棵树

__checkpoint_tree

Checkpoint a single tree.

1、记日志(journal) 记录checkpoint开始标记 ,以及ckptlsn号
__wt_txn_checkpoint_log(… WT_TXN_LOG_CKPT_START, ckptlsn)
2、blockmanager start a checkpoint
bm->checkpoint_start(bm, session)
3、Flush the file from the cache, creating the checkpoint.
__wt_cache_op(session, WT_SYNC_CHECKPOINT)

后面会详细介绍这个函数具体怎么把cache里的数据写到磁盘上的
4、set the object’s write generation
ckpt->write_gen = btree->write_gen;
5、Update the object’s metadata etc.
__wt_meta_ckptlist_set
6、__wt_meta_track_checkpoint
7、记日志(journal),checkpoint结束标记
__wt_txn_checkpoint_log(… WT_TXN_LOG_CKPT_STOP)
8、释放meta_ckptlist
__wt_meta_ckptlist_free(session, &btree->ckpt);

__wt_cache_op

这个函数就是具体把cache写到磁盘的,传入的参数有session, WT_SYNC_CHECKPOINT
session,通过session可以找到btree,
WT_SYNC_CHECKPOINT,操作类型,因为该函数里还实现了cache的其他操作,这里我们只看WT_SYNC_CHECKPOINT操作。

	switch (op) {
	case WT_SYNC_CHECKPOINT:
	case WT_SYNC_WRITE_LEAVES:
		ret = __sync_file(session, op);
		break;

调用了__sync_file函数

__sync_file

这个函数的功能 Flush pages for a specific file. page为btree在内存里的存储单位,一个page可以看成btree的一个节点
调用这个函数时传入依然是session, op 两个参数,op的值为WT_SYNC_CHECKPOINT,这里我们只关注这个操作

1、通过session获取btree ,获取事务结构体
btree = S2BT(session);
txn = &session->txn;

2、按照read-committed隔离级别进行事务操作
分配一个snapshot

if (txn->isolation == WT_ISO_READ_COMMITTED)
			__wt_txn_get_snapshot(session);

btree加flush锁

__wt_spin_lock(session, &btree->flush_lock);

更新btree->checkpointing状态

        btree->checkpointing = WT_CKPT_PREPARE;
		(void)__wt_gen_next_drain(session, WT_GEN_EVICT);
		btree->checkpointing = WT_CKPT_RUNNING;

3、 Write all dirty in-cache pages.
遍历btree的每一个page,skip clean pages,write dirty pages


	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值