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:
parent
3d020e914f
commit
f9a7b442fd
@ -345,7 +345,9 @@ private void setInMaintenance(DatanodeDescriptor dn) {
|
|||||||
* @return true if sufficient, else false.
|
* @return true if sufficient, else false.
|
||||||
*/
|
*/
|
||||||
private boolean isSufficient(BlockInfo block, BlockCollection bc,
|
private boolean isSufficient(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);
|
||||||
@ -379,6 +381,10 @@ private boolean isSufficient(BlockInfo block, BlockCollection bc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (isMaintenance
|
||||||
|
&& numLive >= blockManager.getMinReplicationToBeInMaintenance()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -705,6 +711,7 @@ private void processBlocksInternal(
|
|||||||
// Schedule low redundancy blocks for reconstruction
|
// Schedule low redundancy blocks for reconstruction
|
||||||
// if not already pending.
|
// if not already pending.
|
||||||
boolean isDecommission = datanode.isDecommissionInProgress();
|
boolean isDecommission = datanode.isDecommissionInProgress();
|
||||||
|
boolean isMaintenance = datanode.isEnteringMaintenance();
|
||||||
boolean neededReconstruction = isDecommission ?
|
boolean neededReconstruction = isDecommission ?
|
||||||
blockManager.isNeededReconstruction(block, num) :
|
blockManager.isNeededReconstruction(block, num) :
|
||||||
blockManager.isNeededReconstructionForMaintenance(block, num);
|
blockManager.isNeededReconstructionForMaintenance(block, num);
|
||||||
@ -723,7 +730,7 @@ private void processBlocksInternal(
|
|||||||
// Even if the block is without sufficient redundancy,
|
// Even if the block is without sufficient redundancy,
|
||||||
// it might not block decommission/maintenance if it
|
// it might not block decommission/maintenance if it
|
||||||
// has sufficient redundancy.
|
// has sufficient redundancy.
|
||||||
if (isSufficient(block, bc, num, isDecommission)) {
|
if (isSufficient(block, bc, num, isDecommission, isMaintenance)) {
|
||||||
if (pruneReliableBlocks) {
|
if (pruneReliableBlocks) {
|
||||||
it.remove();
|
it.remove();
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user