先贴一下运行时函数栈
对,最终写磁盘的函数是 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