Details
-
Improvement
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
3.0.0-alpha3
Description
In DatanodeManager#handleHeartbeat, it takes up to maxTransfer reconstruction tasks for non-EC, then if the request can not be full filled, it takes more tasks from EC reconstruction tasks.
List<BlockTargetPair> pendingList = nodeinfo.getReplicationCommand( maxTransfers); if (pendingList != null) { cmds.add(new BlockCommand(DatanodeProtocol.DNA_TRANSFER, blockPoolId, pendingList)); maxTransfers -= pendingList.size(); } // check pending erasure coding tasks List<BlockECReconstructionInfo> pendingECList = nodeinfo .getErasureCodeCommand(maxTransfers); if (pendingECList != null) { cmds.add(new BlockECReconstructionCommand( DNA_ERASURE_CODING_RECONSTRUCTION, pendingECList)); }
So on a large cluster, if there are large number of constantly non-EC reconstruction tasks, EC reconstruction tasks do not have a chance to run.