diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java index 1d8a06fbbb4c..23abe6e93490 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java @@ -120,7 +120,8 @@ public NavigableSet getCandidateContainers( * @param second second container to compare * @return An integer greater than 0 if first is more used, 0 if they're * the same containers or a container is not found, and a value less than 0 - * if first is not more used than second. + * if first is less used than second. If both containers have equal used + * space, they're compared using {@link ContainerID#compareTo(ContainerID)}. */ private int isContainerMoreUsed(ContainerID first, ContainerID second) { @@ -132,8 +133,10 @@ private int isContainerMoreUsed(ContainerID first, ContainerInfo secondInfo = containerManager.getContainer(second); if (firstInfo.getUsedBytes() > secondInfo.getUsedBytes()) { return 1; - } else { + } else if (firstInfo.getUsedBytes() < secondInfo.getUsedBytes()) { return -1; + } else { + return first.compareTo(second); } } catch (ContainerNotFoundException e) { LOG.warn("Could not retrieve ContainerInfo from container manager for " + diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java index ac7de02bd7ae..e3dba0a22fca 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java @@ -1163,7 +1163,8 @@ private void createReplicasForContainers() { // randomly pick a datanode for this replica int datanodeIndex = RANDOM.nextInt(0, numberOfNodes); - if (nodeUtilizations.get(i) != 0.0d) { + // don't put replicas in DNs that are supposed to have 0 utilization + if (Math.abs(nodeUtilizations.get(datanodeIndex) - 0.0d) > 0.00001) { DatanodeDetails node = nodesInCluster.get(datanodeIndex).getDatanodeDetails(); Set replicas = @@ -1171,6 +1172,8 @@ private void createReplicasForContainers() { replicas.add(createReplica(container.containerID(), node, container.getUsedBytes())); cidToReplicasMap.put(container.containerID(), replicas); + datanodeToContainersMap.get(nodesInCluster.get(datanodeIndex)) + .add(container.containerID()); } } }