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). * 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]);

View File

@ -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,

View File

@ -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));
}
} }