HDFS-14465. When the Block expected replications is larger than the number of DataNodes, entering maintenance will never exit. Contributed by Yicong Cai.
(cherry picked from commit 7db922c6474cb29e0e9bad320fcda4769366340a)
(cherry picked from commit 0eb42e1e05
)
This commit is contained in:
parent
b082628e5a
commit
b3e0430c3b
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -706,6 +712,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);
|
||||
|
@ -724,7 +731,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();
|
||||
}
|
||||
|
|
|
@ -373,6 +373,7 @@ public class TestMaintenanceState extends AdminStatesBaseTest {
|
|||
testExpectedReplication(2);
|
||||
testExpectedReplication(3);
|
||||
testExpectedReplication(4);
|
||||
testExpectedReplication(10);
|
||||
}
|
||||
|
||||
private void testExpectedReplication(int replicationFactor)
|
||||
|
|
Loading…
Reference in New Issue