Aliyun Code

首页  >   chuyu / tfs

项目语言:c

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

1 Ns中的BlockManager用来管理所有来自Ds的Block信息。因为Block的数量比较多,因此,BlockManager将Block组织成HashMap的数据结构,Hash的桶的个数由MAX_BLOCK_CHUNK_NUMS决定。另外,为了组织方便,定义了一个双向队列std::deque<std::pair<uint32, uint64> > delete_block_queue_,用来对删除的Block(以及Block所在的Server)进行一个管理并且将最近(在规定时间内)写过的Block也组织成一个HashMap便于管理(难道这个和延迟删有关,就是最近时间内有写入的不马上删除?)。通过这些数据结构,BlockManager可以实现insert一个Block,remove一个Block,将删除的Block以及对应的Server加入和从删除队列中移除,dump所有的Block信息以及最近写入比较频繁的Block信息。 此外,BlockManager还可以判断某个Block是否存在(通过BlockId)以及先通过BlockId获得BlockCollect结构,进而获取到该Block所对应的Ds的信息(这里提供多个重载)。在与Ds的关系方便,BlockManager提供了建立、解除以及更新具体Block与Ds关系接口,以及判断某个Block是否需要复制、压缩、迁移的接口。最后,BlockManager还会根据时间在last_write_blocks_[i]中插入和删除最近写入的Block。

2 Ns中的ServerManager用来管理所有的Server信息。为了管理好活动的和不可服务的DS,ServerManager定义了两个Server列表servers_和dead_servers_。针对具体的DS的操作大致包括加入Server到活动列表(分为是新加入的还是暂时不可服务又好了的),从活动列表中移除Server到不可服务列表(这种情况可能发生在Ds某种原因退出)。当Server在不可服务列表中超过一定时间后,就会将它从不可服务列表中移除(这种情况可能是磁盘坏掉了,所以等换好新盘启动需要一定的时间)。另外,通过ServerManager可以得到活动Server列表以及不可服务Server列表以及某一个范围内的Server列表。 与BlockManager类似,ServerManager也提供了建立和解除具体Ds与Block的关系接口,但这些过程是以各个Server为中心来完成的。此外,ServerManager还负责挑选可写主块,先由ServerManager挑一个Server,再由Server挑一个Block。当BlockManager中发现某些Block需要复制时,由于每个Block对应多个Server,ServerManager负责挑选出要复制的源Server和目标Server。当ServerManager发现某个Server不满足均衡(目前是将活动列表中的前32个server根据容量百分比,特别小的作为目标Server,特别大的作为源Server)时,针对该Server(作为Source Server)里面的具体Block,ServerManager负责挑选出可做为目标的Server。当某种原因导致Block的副本数大于最大副本数时,ServerManager会根据包含该Block的Server的容量进行排序并在满足一定条件下选择一个Server将多余的Block进行删除。(在选择复制、迁移目标Server时需要考虑Server是否不在任务队列里,是否有空间,以及是否和已经挑选的Server在不同机架)