journal_start
journal_start函数的作用是取得一个原子操作描述符handle_t。该handle_t要么是当前进程已有的,要么是新创建的。且要保证日志中还剩下参数nblocks规定的空闲块数
start_this_handle
在journal_start函数得到一个handle_t之后,要确保日志中有nblocks块供该handle_t使用。
首先handle_t是肯定要与当前的transaction绑定的,当然如果当前没有running transaction。就需要新建一个transaction。
因为是给当前transaction新增一个handle_t,即相当于要改变journal的状态。所以需要获得自旋锁journal->j_state_lock。然后再通过is_journal_aborted(journal)检查journal是否在以前某个地方出错,出错的话就不要再新增什么handle_t了,直接返回错误好了。
关于journal的barrier我还没看懂。。先占个坑( ̄▽ ̄)”
好了。现在主要是判断hanle_t希望申请的nblocks块空间能否得到满足。首先要判断当前的transaction是否过大,过大的话会影响数据的新旧程度。所以为了不让transaction过大,当本次handle_t加上transaction已有的空间已经过大时,就等待该transaction commit吧。这段时间会调用schedule(),让transaction默默commit。然后用goto回到之前新建transaction的地方。
接下来是判断整个journal有没有空间,这中间的checkpoint与commit貌似有一个竞争条件(-__-)b。但是我没看懂。
当确定有空间的话。就可以把handle_t绑定到transaction上了。并进行相应的更新。
journal_stop
看函数注释说好像是完成一个transaction。也就是提交一个transaction。但是为什么要在transaction减掉handle_t中的credits。没看懂( ̄▽ ̄)”
不过看该函数的意思似乎对比较快的硬盘做了个优化。就是如果transaction 的运行时间小于commit 时间,那么就去睡commit time这么长的时间,不然就马上开始commit(在设置了sync标志的情况下)