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-17 15:16:41 -07:00
parent 3d020e914f
commit f9a7b442fd
2 changed files with 10 additions and 2 deletions

View File

@ -345,7 +345,9 @@ public class DatanodeAdminManager {
* @return true if sufficient, else false.
*/
private boolean isSufficient(BlockInfo block, BlockCollection bc,
NumberReplicas numberReplicas, boolean isDecommission) {
NumberReplicas numberReplicas,
boolean isDecommission,
boolean isMaintenance) {
if (blockManager.hasEnoughEffectiveReplicas(block, numberReplicas, 0)) {
// Block has enough replica, skip
LOG.trace("Block {} does not need replication.", block);
@ -379,6 +381,10 @@ public class DatanodeAdminManager {
}
}
}
if (isMaintenance
&& numLive >= blockManager.getMinReplicationToBeInMaintenance()) {
return true;
}
return false;
}
@ -705,6 +711,7 @@ public class DatanodeAdminManager {
// Schedule low redundancy blocks for reconstruction
// if not already pending.
boolean isDecommission = datanode.isDecommissionInProgress();
boolean isMaintenance = datanode.isEnteringMaintenance();
boolean neededReconstruction = isDecommission ?
blockManager.isNeededReconstruction(block, num) :
blockManager.isNeededReconstructionForMaintenance(block, num);
@ -723,7 +730,7 @@ public class DatanodeAdminManager {
// Even if the block is without sufficient redundancy,
// it might not block decommission/maintenance if it
// has sufficient redundancy.
if (isSufficient(block, bc, num, isDecommission)) {
if (isSufficient(block, bc, num, isDecommission, isMaintenance)) {
if (pruneReliableBlocks) {
it.remove();
}

View File

@ -373,6 +373,7 @@ public class TestMaintenanceState extends AdminStatesBaseTest {
testExpectedReplication(2);
testExpectedReplication(3);
testExpectedReplication(4);
testExpectedReplication(10);
}
private void testExpectedReplication(int replicationFactor)