HDFS-14465. When the Block expected replications is larger than the number of DataNodes, entering maintenance will never exit. Contributed by Yicong Cai.

This commit is contained in:
Wei-Chiu Chuang 2019-06-20 19:36:44 -07:00
parent a68de43957
commit f876e82abc
2 changed files with 8 additions and 2 deletions

View File

@ -349,7 +349,7 @@ private void setInMaintenance(DatanodeDescriptor dn) {
* @return true if sufficient, else false. * @return true if sufficient, else false.
*/ */
private boolean isSufficientlyReplicated(BlockInfo block, BlockCollection bc, private boolean isSufficientlyReplicated(BlockInfo block, BlockCollection bc,
NumberReplicas numberReplicas, boolean isDecommission) { NumberReplicas numberReplicas, boolean isDecommission, boolean isMaintenance) {
if (blockManager.hasEnoughEffectiveReplicas(block, numberReplicas, 0)) { if (blockManager.hasEnoughEffectiveReplicas(block, numberReplicas, 0)) {
// Block has enough replica, skip // Block has enough replica, skip
LOG.trace("Block {} does not need replication.", block); LOG.trace("Block {} does not need replication.", block);
@ -382,6 +382,10 @@ private boolean isSufficientlyReplicated(BlockInfo block, BlockCollection bc,
} }
} }
} }
if (isMaintenance && numLive >= blockManager.getMinReplicationToBeInMaintenance()) {
return true;
}
return false; return false;
} }
@ -726,6 +730,7 @@ private void processBlocksInternal(
// Schedule under-replicated blocks for replication if not already // Schedule under-replicated blocks for replication if not already
// pending // pending
boolean isDecommission = datanode.isDecommissionInProgress(); boolean isDecommission = datanode.isDecommissionInProgress();
boolean isMaintenance = datanode.isEnteringMaintenance();
boolean neededReplication = isDecommission ? boolean neededReplication = isDecommission ?
blockManager.isNeededReplication(block, num) : blockManager.isNeededReplication(block, num) :
blockManager.isNeededReplicationForMaintenance(block, num); blockManager.isNeededReplicationForMaintenance(block, num);
@ -743,7 +748,7 @@ private void processBlocksInternal(
// Even if the block is under-replicated, // Even if the block is under-replicated,
// it doesn't block decommission if it's sufficiently replicated // it doesn't block decommission if it's sufficiently replicated
if (isSufficientlyReplicated(block, bc, num, isDecommission)) { if (isSufficientlyReplicated(block, bc, num, isDecommission, isMaintenance)) {
if (pruneSufficientlyReplicated) { if (pruneSufficientlyReplicated) {
it.remove(); it.remove();
} }

View File

@ -373,6 +373,7 @@ public void testExpectedReplications() throws IOException {
testExpectedReplication(2); testExpectedReplication(2);
testExpectedReplication(3); testExpectedReplication(3);
testExpectedReplication(4); testExpectedReplication(4);
testExpectedReplication(10);
} }
private void testExpectedReplication(int replicationFactor) private void testExpectedReplication(int replicationFactor)