重构流程概述:
重构步骤如下,后面会有相关主要代码分析,具体代码实现可参考http://git.erc.ict.ac.cn/?p=bwfs_pnfs.sles11u1.git;a=shortlog;h=refs/heads/replication
1. 客户端在下刷或者读取磁盘时候,发现错误,记录到nfs_inode中的链表中。
2. 读写完成时,把错误链表发送到服务器。
3. 服务器收到错误链表后,将其插入到exfs_inode_info中的链表。启动异步重构线程
4. 重构线程,先召回需要重构文件的layout。设置重构标志位,构建file_handle和stateid等结构。然后选择一个client,发送重构命令和必要的信息。
5. 客户端接到重构要求后,异步启动一个重构线程。
6. 客户端的重构线程根据fh和i_ino等信息,调用getattr,构建出nfs_inode dentry(此结构只有重构线程可见)nfs_open_contex等必要信息,完成重构。
7. 客户端完成重构后,向服务器发送rebuild_done,服务器更新exfs_inode_info中的错误链表。
三副本读写情景分析:
1.在bl_read_pagelist()函数中,选择可用的副本完成磁盘内容的读取,代码如下:
for (i = pg_index; i < nr_pages; i++) {
。。。
be =find_get_extent(BLK_LSEG2EXT(rdata->pdata.lseg),