HDFS-14852. Removing from LowRedundancyBlocks does not remove the block from all queues. Contributed by Fei Hui.
(cherry picked from commit 6a49bf9bff
)
This commit is contained in:
parent
12fb9e0600
commit
0f234667dd
|
@ -2462,7 +2462,7 @@ public class BlockManager implements BlockStatsMXBean {
|
||||||
* with the most up-to-date block information (e.g. genstamp).
|
* with the most up-to-date block information (e.g. genstamp).
|
||||||
*/
|
*/
|
||||||
BlockInfo bi = blocksMap.getStoredBlock(timedOutItems[i]);
|
BlockInfo bi = blocksMap.getStoredBlock(timedOutItems[i]);
|
||||||
if (bi == null) {
|
if (bi == null || bi.isDeleted()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
NumberReplicas num = countNodes(timedOutItems[i]);
|
NumberReplicas num = countNodes(timedOutItems[i]);
|
||||||
|
|
|
@ -382,17 +382,18 @@ class LowRedundancyBlocks implements Iterable<BlockInfo> {
|
||||||
} else {
|
} else {
|
||||||
// Try to remove the block from all queues if the block was
|
// Try to remove the block from all queues if the block was
|
||||||
// not found in the queue for the given priority level.
|
// not found in the queue for the given priority level.
|
||||||
|
boolean found = false;
|
||||||
for (int i = 0; i < LEVEL; i++) {
|
for (int i = 0; i < LEVEL; i++) {
|
||||||
if (i != priLevel && priorityQueues.get(i).remove(block)) {
|
if (i != priLevel && priorityQueues.get(i).remove(block)) {
|
||||||
NameNode.blockStateChangeLog.debug(
|
NameNode.blockStateChangeLog.debug(
|
||||||
"BLOCK* NameSystem.LowRedundancyBlock.remove: Removing block" +
|
"BLOCK* NameSystem.LowRedundancyBlock.remove: Removing block" +
|
||||||
" {} from priority queue {}", block, i);
|
" {} from priority queue {}", block, i);
|
||||||
decrementBlockStat(block, i, oldExpectedReplicas);
|
decrementBlockStat(block, i, oldExpectedReplicas);
|
||||||
return true;
|
found = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return found;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void decrementBlockStat(BlockInfo blockInfo, int priLevel,
|
private void decrementBlockStat(BlockInfo blockInfo, int priLevel,
|
||||||
|
|
|
@ -276,4 +276,15 @@ public class TestLowRedundancyBlockQueues {
|
||||||
}
|
}
|
||||||
fail("Block " + block + " not found in level " + level);
|
fail("Block " + block + " not found in level " + level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRemoveBlockInManyQueues() {
|
||||||
|
LowRedundancyBlocks neededReconstruction = new LowRedundancyBlocks();
|
||||||
|
BlockInfo block = new BlockInfoContiguous(new Block(), (short)1024);
|
||||||
|
neededReconstruction.add(block, 2, 0, 1, 3);
|
||||||
|
neededReconstruction.add(block, 0, 0, 0, 3);
|
||||||
|
neededReconstruction.remove(block, LowRedundancyBlocks.LEVEL);
|
||||||
|
assertFalse("Should not contain the block.",
|
||||||
|
neededReconstruction.contains(block));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue