HDFS源码分析之UnderReplicatedBlocks(二)

        UnderReplicatedBlocks还提供了一个数据块迭代器BlockIterator,用于遍历其中的数据块。它是UnderReplicatedBlocks的内部类,有三个成员变量,如下:

	// 当前迭代级别
    private int level;
    
    // 标志位:是否为特定复制优先级的迭代器
    private boolean isIteratorForLevel = false;
    
    // 数据块Block迭代器Iterator列表,存储各级别数据块迭代器
    private final List<Iterator<Block>> iterators = new ArrayList<Iterator<Block>>();
        其中,level代表了迭代器当前处于的迭代级别,表示正在哪个块复制级别迭代数据块;isIteratorForLevel是一个标志位,是否为特定复制优先级的迭代器的标志位,也就意味着只在特定级别进行迭代;而iterators则是一个数据块Block迭代器Iterator列表,由前往后、由高到低的存储各级别数据块迭代器。
        BlockIterator提供了两个构造函数,一个是无参构造函数:生成所有级别的数据块迭代器,另外一个是有参构造函数:生成指定级别的数据块迭代器,代码分别如下:

    /**
     * Construct an iterator over all queues.
     * 无参构造函数:生成所有级别的数据块迭代器
     */
    private BlockIterator() {
      // 当前迭代级别level设置为0
      level=0;
      // iterators中添加全部级别的数据块迭代器
      for(int i=0; i<LEVEL; i++) {
        iterators.add(priorityQueues.get(i).iterator());
      }
    }

    /**
     * Constrict an iterator for a single queue level
     * 有参构造函数:生成指定级别的数据块迭代器
     * @param l the priority level to iterate over
     */
    private BlockIterator(int l) {
      // 当前迭代级别level设置为指定级别
      level = l;
      // 标志位:是否为特定复制优先级的迭代器设置为true
      isIteratorForLevel = true;
      // iterators中添加指定级别的数据块迭代器
      iterators.add(priorityQueues.get(level).iterator());
    }
        注释很清晰,读者可自行阅读。另外,数据块是根据复制级别由高到低的顺序迭代的,当某一级别数据块迭代完毕,那么我们需要更新当前迭代级别,此时update()方法就完成这一个工作,代码如下:

    // 如果需要,更新当前迭代级别(由高往低迭代)
    private void update() {
    	
      // 标志位:是否为特定复制优先级的迭代器,为true的话,直接返回
      if (isIteratorFor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值