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:
S O'Donnell 2020-08-25 15:18:36 +01:00
parent 12fb9e0600
commit 0f234667dd
3 changed files with 15 additions and 3 deletions

View File

@ -2462,7 +2462,7 @@ public class BlockManager implements BlockStatsMXBean {
* with the most up-to-date block information (e.g. genstamp).
*/
BlockInfo bi = blocksMap.getStoredBlock(timedOutItems[i]);
if (bi == null) {
if (bi == null || bi.isDeleted()) {
continue;
}
NumberReplicas num = countNodes(timedOutItems[i]);

View File

@ -382,17 +382,18 @@ class LowRedundancyBlocks implements Iterable<BlockInfo> {
} else {
// Try to remove the block from all queues if the block was
// not found in the queue for the given priority level.
boolean found = false;
for (int i = 0; i < LEVEL; i++) {
if (i != priLevel && priorityQueues.get(i).remove(block)) {
NameNode.blockStateChangeLog.debug(
"BLOCK* NameSystem.LowRedundancyBlock.remove: Removing block" +
" {} from priority queue {}", block, i);
decrementBlockStat(block, i, oldExpectedReplicas);
return true;
found = true;
}
}
return found;
}
return false;
}
private void decrementBlockStat(BlockInfo blockInfo, int priLevel,

View File

@ -276,4 +276,15 @@ public class TestLowRedundancyBlockQueues {
}
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));
}
}