加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux内核md源代码解读 九 阵列raid5同步函数sync_reque

发布时间:2016-05-24 01:41:09 所属栏目:Linux 来源:网络整理
导读:欢迎使用ueditor! 我们再来回顾一下整个场景: 1)在运行阵列的时候调用md_wakeup_thread唤醒主线程 2)主线程调用md_check_recovery检查同步 3)md_check_reco

欢迎使用ueditor!

我们再来回顾一下整个场景:

1)在运行阵列的时候调用md_wakeup_thread唤醒主线程

2)主线程调用md_check_recovery检查同步
3)md_check_recovery函数中检查需要同步调用md_register_thread创建同步线程

4)同步线程调用md_do_sync函数处理同步过程

5)md_do_sync做同步过程的管理,一步步推同步点,记录同步完成点,调用sync_request进行各种阵列级别的同步

6)sync_request做同步数据流的派发工作

对于raid5阵列来说,同步是按struct stripe_head为基本单位进行派发的。打个比方,我们现在要把一个土豆炸成薯片,这时首先要把土豆切成片,再把土豆片放到油锅里炸,炸开了再捞起来装盒。那么md_do_sync的作用就相当于把土豆切片,这个切片的大小也就是STRIPE_SECTORS大小了。sync_request接收到这个土豆片之后不能立即下锅,要用struct stripe_head把它包装一下,这就类似要在土豆片外面刷一层调料。然后再调用handle_stripe进行处理并最终下发到磁盘,这就类似于把土豆片放在锅里油炸加工的过程。最后调用bitmap_cond_end_sync保存同步完成记录,这就类似回收土豆片并盒装。

这里还有一个细节,就是为了周期性保存同步结果,每隔几秒钟都会等待所有同步请求返回再记录下来。这就类似于这个炸土豆的锅很小,一次只能放20片土豆,一开始我们不停的放薯片,等放满20片,我们就停下来直接到所有土豆都熟了然后一次性打捞上来,然后再放20片,重复上面的过程。

理解上以上的处理机制,再看代码就非常容易了。

4453 static inline sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster)  
4454 {  
4455         struct r5conf *conf = mddev->private;  
4456         struct stripe_head *sh;  
4457         sector_t max_sector = mddev->dev_sectors;  
4458         sector_t sync_blocks;  
4459         int still_degraded = 0;  
4460         int i;  
4461  
4462         if (sector_nr >= max_sector) {  
4463                 /* just being told to finish up .. nothing much to do */
4464  
4465                 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) {  
4466                         end_reshape(conf);  
4467                         return 0;  
4468                 }  
4469  
4470                 if (mddev->curr_resync < max_sector) /* aborted */
4471                         bitmap_end_sync(mddev->bitmap, mddev->curr_resync,  
4472                                         &sync_blocks, 1);  
4473                 else /* completed sync */
4474                         conf->fullsync = 0;  
4475                 bitmap_close_sync(mddev->bitmap);  
4476  
4477                 return 0;  
4478         }

这一部分是处理同步完成的,同步完成有两种情况,一种是正常完成的,另一种是被中断的。

4462行,同步完成。

4470行,同步中断,通知bitmap最后一次同步是abort

4474行,同步成功完成,更新fullsync为0,fullsync表示阵列要强制完全同步。

4475行,通知bitmap同步完成。

虽然这部分代码是放在函数比较靠前的位置,但是这部分代码是在md_do_sync退出同步循环之后的7521行的sync_request调用到的。接下来这部分才是md_do_sync循环中sync_request会执行到的部分:

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读