diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/placement/algorithms/SCMContainerPlacementRackScatter.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/placement/algorithms/SCMContainerPlacementRackScatter.java index 6c5fea196937..25105497c53e 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/placement/algorithms/SCMContainerPlacementRackScatter.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/placement/algorithms/SCMContainerPlacementRackScatter.java @@ -227,6 +227,16 @@ public List chooseDatanodes( placementStatus.expectedPlacementCount(); throw new SCMException(errorMsg, null); } + if (nodesRequiredToChoose != chosenNodes.size()) { + String reason = "Chosen nodes size: " + chosenNodes + .size() + ", but required nodes to choose: " + nodesRequiredToChoose + + " do not match."; + LOG.warn("Placement policy could not choose the enough nodes." + + " {} Available nodes count: {}, Excluded nodes count: {}", + reason, totalNodesCount, excludedNodesCount); + throw new SCMException(reason, + SCMException.ResultCodes.FAILED_TO_FIND_HEALTHY_NODES); + } return chosenNodes; } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineFactory.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineFactory.java index 780a4ee714cb..604c3466c340 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineFactory.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineFactory.java @@ -85,9 +85,27 @@ public Pipeline create( ReplicationConfig replicationConfig, List excludedNodes, List favoredNodes) throws IOException { - return providers - .get(replicationConfig.getReplicationType()) + Pipeline pipeline = providers.get(replicationConfig.getReplicationType()) .create(replicationConfig, excludedNodes, favoredNodes); + checkPipeline(pipeline); + return pipeline; + } + + private void checkPipeline(Pipeline pipeline) throws IOException { + // In case in case if provided pipeline provider returns null. + if (pipeline == null) { + throw new SCMException("Pipeline cannot be null", + SCMException.ResultCodes.INTERNAL_ERROR); + } + // In case if provided pipeline returns less number of nodes than + // required. + if (pipeline.getNodes().size() != pipeline.getReplicationConfig() + .getRequiredNodes()) { + throw new SCMException("Nodes size= " + pipeline.getNodes() + .size() + ", replication factor= " + pipeline.getReplicationConfig() + .getRequiredNodes() + " do not match", + SCMException.ResultCodes.FAILED_TO_FIND_HEALTHY_NODES); + } } public Pipeline create(ReplicationConfig replicationConfig,