|
@@ -3354,8 +3354,7 @@ public class BlockManager {
|
|
|
// file already removes them from the block map below.
|
|
|
block.setNumBytes(BlockCommand.NO_ACK);
|
|
|
addToInvalidates(block);
|
|
|
- corruptReplicas.removeFromCorruptReplicasMap(block);
|
|
|
- blocksMap.removeBlock(block);
|
|
|
+ removeBlockFromMap(block);
|
|
|
// Remove the block from pendingReplications and neededReplications
|
|
|
pendingReplications.remove(block);
|
|
|
neededReplications.remove(block, UnderReplicatedBlocks.LEVEL);
|
|
@@ -3531,11 +3530,30 @@ public class BlockManager {
|
|
|
}
|
|
|
|
|
|
public void removeBlockFromMap(Block block) {
|
|
|
+ removeFromExcessReplicateMap(block);
|
|
|
blocksMap.removeBlock(block);
|
|
|
// If block is removed from blocksMap remove it from corruptReplicasMap
|
|
|
corruptReplicas.removeFromCorruptReplicasMap(block);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * If a block is removed from blocksMap, remove it from excessReplicateMap.
|
|
|
+ */
|
|
|
+ private void removeFromExcessReplicateMap(Block block) {
|
|
|
+ for (DatanodeStorageInfo info : blocksMap.getStorages(block)) {
|
|
|
+ String uuid = info.getDatanodeDescriptor().getDatanodeUuid();
|
|
|
+ LightWeightLinkedSet<Block> excessReplicas = excessReplicateMap.get(uuid);
|
|
|
+ if (excessReplicas != null) {
|
|
|
+ if (excessReplicas.remove(block)) {
|
|
|
+ excessBlocksCount.decrementAndGet();
|
|
|
+ if (excessReplicas.isEmpty()) {
|
|
|
+ excessReplicateMap.remove(uuid);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public int getCapacity() {
|
|
|
return blocksMap.getCapacity();
|
|
|
}
|