Aliyun Code

首页  >   chuyu / tfs

项目语言:c

创建者:hy05190134 创建时间:2012年11月20日

一、 心跳线程

这里的心跳是指Ds向Ns发的周期性统计信息。原先的做法是当Ds需要汇报block时会将blockInfo的信息通过心跳包的形式发给Ns。而现在的心跳只负责keepalive,汇报block的工作由专门的包进行发送。(所以之前的做法是Ns会在心跳的回复包中带上一个状态(status),Ds在收到这个状态包后,会根据状态进行一些相应的操作(比如淘汰过期的Block以及新增Block操作等))。

二、 复制线程(replicate_block.cpp)

人工或者Ns可以添加复制Block任务至复制队列中,复制线程会从复制队列中取出并执行。结合Ns,整个复制的大致过程是ns向复制的源Ds发起复制任务,源Ds将复制任务所需要的信息结构(ReplBlockExt)加入复制队列中。复制线程取出一个复制任务后,会先通过ReadRawData接口将源Ds的Block数据读出,然后向目标Ds发WriteRawData消息,目标ds在接到writeRawData消息后复制数据,然后通过batch_write_info进行index的复制。然后源Ds将复制是否成功的状态向Ns进行回复,Ns在收到复制成功的消息后会进行Block与Ds关系的更新。当从ns中收到move的操作后,还会将源ds上的Block删除掉。在管理复制的过程中,还用到两个重要的数据结构ReplicateBlockMap_和ClonedBlockMap_,前者用来记录源中将要进行复制的Block,后者用来记录目标中正在复制Block的状态。

三、 压缩线程(compact_block.cpp)

真正的压缩线程也从压缩队列中取出并进行执行(按文件进行,小文件合成一起发送)。压缩的过程其实和复制有点像,只是说不需要将删除的文件数据以及index数据复制到新创建的压缩块中。要判断某个文件是否被删除,还需要拿index文件的offset去fileinfo里面取删除标记,如果标记不是删除的,那么就可以进行write_raw_data的操作,否则则滤过。

四、 检查线程

a 清理过期的Datafile; b 修复check_file_queue_中的逻辑块(block_checker.cpp) c 清理过期的复制块(由于复制过程中出错导致的错误复制块,复制目标的ds做) d 清理过期的压缩块(由于压缩过程中出错导致的错误压缩块,压缩在同一个ds上做) e 每天rotate读写日志,清理过期的错误逻辑块 f 读日志累积后刷磁盘

b的详细过程: 每次对文件进行读写删操作失败的时候,会try_add_repair_task(blockid, ret)来将ret错误的block加入check_file_queue_中,正常情况下加入的为-EIO(I/O错误)的错误Block,那什么时候加入的是CRC的错误呢?人工进行修复的时候发该类型的CRC_ERROR_MESSAGE消息,然后也会加入check_file_queue_中.也就是说人工修复是认为CRC错误的。然后在check的时候会根据类型进行do_repair_crc还是do_repair_eio操作,对各自类型进行错误统计,其中check_block的过程就是通过crc_error和eio_error数量来判断该Block是否过期(对于过期的逻辑块,在错误位图上进行相应物理块的设置),如果是,则请求Ns进行update_block_info, 如果不是,对于eio请求,则无法修复,设置Block不正常(abnormal)的最新时间,对于Crc的则尝试修复,修复过程中会从其他Ds上读副本来进行修复,若出错则会请求Ns进行update_block_info,否则设置Block不正常的最新时间。