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