The BlockManager#removeFromExcessReplicateMap() method accepts a Block which is to remove from excessReplicateMap. However the excessReplicateMap maps a StorageID to the set of BlockInfo that are "extra" for the DataNode of the StorageID. Deleting a sub-class object from a collection provided a base-class object happens to work here.
Alternatively, we can make the removeFromExcessReplicateMap accept a BlockInfo object. As the current call stack is passing BlockInfo object mostly, the code change should be safe.