zfs当中的事务处理研究与探索
来源:互联网 发布:js cookie 代码 编辑:程序博客网 时间:2024/05/20 14:19
对于zfs而言,每一层都会有事务处理的痕迹。
zio,metaslab,spa,dmu 每层基本上都少不了transaction group。transaction group的更新主要是在txg的两个线程中完成的,使用最多的是spa 和dmu 层。
transaction group 总共分三组:
open 刚开始的写的请求分配一个open txg。
quiesce 等待同步的写请求 分配一个 quiesce txg。
sync 正在同步的写请求属于sync txg。
一个线程为tx_quiesce_thread,另一个为tx_sync_thread。
点击(此处)折叠或打开
- tx->tx_quiesce_thread = thread_create(NULL, 0, txg_quiesce_thread,
- dp, 0, &p0, TS_RUN, minclsyspri);
- /*
- * The sync thread can need a larger-than-default stack size on
- * 32-bit x86. This is due in part to nested pools and
- * scrub_visitbp() recursion.
- */
- tx->tx_sync_thread = thread_create(NULL, 32<<10, txg_sync_thread,
- dp, 0, &p0, TS_RUN, minclsyspri);
对于一个dsl_pool而言,会创建有两个线程,txg_sync_thread,和txg_quiesce_thread.
而这两个线程维护了所有的txg。
当zfs发生一个写请求的时候,会找到该请求的dsl_pool,然后通过dsl_pool找到相应的tx_state,从中找到当前的open transaction的ID(在zfs的transaction group的状态池当中更新引用该txg的计数,count++),然后封装成一个dmu_tx_t的数据结构给dmu buffer层。 当数据从req当中拷贝到dmu buffer之后返回,系统会调用dmu_tx_commit操作,做事务处理的最后的收回工作,并从zfs的transaction group的状态池当中减少对该txg的引用计数。当txg的引用计数为0的时候,通知该tc->tc_cv[g]条件满足。
下面的这个函数正好是quiesce thread 线程所要做的事情,该线程会等待所有的写操作返回,等该txg 为0。
txg_quiesce的部分代码。
点击(此处)折叠或打开
- for (c = 0; c < max_ncpus; c++) {
- tx_cpu_t *tc = &tx->tx_cpu[c];
- mutex_enter(&tc->tc_lock);
- while (tc->tc_count[g] != 0)
- cv_wait(&tc->tc_cv[g], &tc->tc_lock);
- mutex_exit(&tc->tc_lock);
- }
点击(此处)折叠或打开
- mutex_exit(&tx->tx_sync_lock);
- txg_quiesce(dp, txg);
- mutex_enter(&tx->tx_sync_lock);
- /*
- * Hand this txg off to the sync thread.
- */
- dprintf("quiesce done, handing off txg %llu\n", txg);
- tx->tx_quiesced_txg = txg;
- cv_broadcast(&tx->tx_sync_more_cv);
- cv_broadcast(&tx->tx_quiesce_done_cv);
可以从上面的代码看到,这个所谓的等待,实际上等待的是异步写,也就是写buffer,而不是写磁盘的操作。当该txg的写请求结束之后,标志该txg的已经静默完的。然后发广播说:异步写结束啦,快来同步我们吧,我们已经完成静默啦。
当系统要进行同步的时候,也就是txg_sync_thread会调用spa_sync(spa,txg)。spa_sync(spa,txg)会设置spa ->spa_syncing_txg = txg;
最后的路径可以追溯到dbuf_sync_leaf这个函数,他负责同步dbuf叶子节点,也是dbuf同步的最后一步。他会设置db->db_data_pending = dr; 然后调用dbuf_write 产生一个写请求。通过zio_nowait(zio)执行这个请求。
在dbuf_write 函数之中,会在其中传入回调函数指针,在dbuf_write_done函数调用中,也就是写操作结束后,会将db->db_data_pending 指针设置为NULL。标志着写操作的结束。
0
上一篇:对zfs脏记录的一些疑问
下一篇:linux打印当前函数调用栈backtrace
相关热门文章
- 致力于将奥的斯的先进技术本土...
- crtmpserver实现防盗流和流推...
- Flash文件系统TFFS简介
- 主流Linux/Unix文件系统架构简...
- 内核调试之kprobes
- 双机热备Oracle数据库服务器操...
- 双机热备Oracle数据库服务器操...
- 双机热备Oracle数据库服务器操...
- 缘聚湘西南 武冈深圳同乡会 欢...
- 虚拟磁带库 变革数据保护流程(...
- 这样配置的服务器能够承受8k并...
- vm里的系统能够ping到nfs,但...
- bind是否随机从两台master中读...
- 在win7下用cygwin搭建hadoop,...
- Mysql的binglog日志能否分库备...
给主人留下些什么吧!~~
评论热议
- zfs当中的事务处理研究与探索
- zfs当中的事务处理(二)
- ZFS 文件系统研究
- 广东电信公话业务中CRM系统的研究与探索
- 基于SmartAction工具的自动化,研究与探索
- java 对象的初始化过程研究与探索
- zfs块申请机制研究
- Oracle与NetApp达成在ZFS诉讼方面的和解
- iOS XMPP研究探索:登录与注册
- solaris 的ZFS操作
- JDBC 的事务处理与批处理
- 【转】ZFS读缓存深入研究:ARC
- ZFS
- ZFS
- 使用Oracle的PROFILE对用户资源限制和密码限制的研究与探索
- 基于关系数据库的数据仓库星形模式下维使用原则的研究与探索
- ZFS与数据去重
- x265探索与研究(三):如何播放*.265格式的视频或解码视频流
- ZFS中的RAIDZ对RAID5的改进。
- 解决在使用tab时里面嵌套activity,不能正确监听返回键异常
- 迁移到csdn
- 《virtualbox完全学习手册》之 虚拟机也玩多屏显示
- 对zfs脏记录的一些疑问
- zfs当中的事务处理研究与探索
- linux打印当前函数调用栈backtrace
- zfs当中的事务处理(二)
- Linux,zfs耗内存的原因剖析
- zfs的块设备写操作很慢的原因分析
- apt-get update 更新源Ubuntu 10.10
- seo行业的隐患
- vmalloc内核函数分析。
- zfs的zio代码部分学习
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
龟文堂铁壶
日式铁壶价格
铁壶 泡茶
铁铸壶
铁壶收藏
铁壶铸造
铁壶泡什么茶
铸铁壶泡茶
铁壶文化
铁壶煮水
工艺铁壶
品茶忆友铁壶
老铁壶
茶壶 过滤
随手泡电水壶
随手泡图片
随手泡
旅行茶具
保温杯哪个牌子好
喝茶用什么茶具好
不锈钢真空杯
不锈钢杯
什么牌子的保温杯好
瓷器茶具
茶具茶盘
玉石茶具
sd敢达ol铁奥
铁娃
铁娘
铁尺
铁尺图片
铁尺梁
铁屑输送机
铁屑撕碎机
铁屑压块机
铁屑破碎机
铁屑烘干机
铁屑物语
铁屑是什么
铁屑
铁屑回收价格