zfs当中的事务处理(二)

当写buffer的操作完成之后,在dbuf_dirty函数当中,会创建一个dr,dr所属的txg 为 open txg 的 txg id。
然后 他会插入到dnode的dn_dirty_records当中。
为了以后同步的时候使用,所以 根据txgoff=txg & TXG_MASK,算出相应的txgoff,然后插入进去。

当open txg 变成 sync txg的时候,sync thread会调用函数spa_sync ,大范围内的进行同步操作。

spa_sync(spa,txg)

点击(此处)折叠或打开

  1. list_insert_tail(&dn->dn_dirty_records[txgoff], dr);
向下同步的时候,他会从dn->dn_dirty_records[txgoff]当中,同步之前插入的脏记录。
简单的事例代码如下:

点击(此处)折叠或打开

  1. list = dn->dn_dirty_records[txgoff];
  2. dbuf_sync_list(list, tx);
完成了dbuf_sync_leaf 操作,zfs会记录这次写磁盘的块的blk_birth 为txg。相当于块的创建时间,然后执行zio_nowait(zio),异步的将脏记录写入到磁盘上了。

这样就完成了一次写操作。但是我的分析是高度概括的,很多的实现细节由于篇幅有限没法完全说清楚,有机会再逐渐的补充吧。




<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值