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 8171320a54f8..b44fa426e818 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 @@ -32,7 +32,9 @@ import org.slf4j.LoggerFactory; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.NavigableSet; import java.util.Set; import java.util.TreeSet; @@ -52,6 +54,7 @@ public class ContainerBalancerSelectionCriteria { private Set selectedContainers; private Set excludeContainers; private FindSourceStrategy findSourceStrategy; + private Map> setMap; public ContainerBalancerSelectionCriteria( ContainerBalancerConfiguration balancerConfiguration, @@ -66,6 +69,7 @@ public ContainerBalancerSelectionCriteria( selectedContainers = new HashSet<>(); excludeContainers = balancerConfiguration.getExcludeContainers(); this.findSourceStrategy = findSourceStrategy; + this.setMap = new HashMap<>(); } /** @@ -92,15 +96,31 @@ private boolean isContainerReplicatingOrDeleting(ContainerID containerID) { */ public NavigableSet getCandidateContainers( DatanodeDetails node, long sizeMovedAlready) { - NavigableSet containerIDSet = - new TreeSet<>(orderContainersByUsedBytes().reversed()); + // Initialize containerSet for node + if (!setMap.containsKey(node)) { + NavigableSet newSet = + new TreeSet<>(orderContainersByUsedBytes().reversed()); + try { + newSet.addAll(nodeManager.getContainers(node)); + } catch (NodeNotFoundException e) { + LOG.warn("Could not find Datanode {} while selecting candidate " + + "containers for Container Balancer.", node.toString(), e); + return newSet; + } + setMap.put(node, newSet); + } + + // In case the node is removed try { - containerIDSet.addAll(nodeManager.getContainers(node)); + nodeManager.getContainers(node); } catch (NodeNotFoundException e) { LOG.warn("Could not find Datanode {} while selecting candidate " + "containers for Container Balancer.", node.toString(), e); - return containerIDSet; + setMap.remove(node); + return new TreeSet<>(); } + + NavigableSet containerIDSet = setMap.get(node); if (excludeContainers != null) { containerIDSet.removeAll(excludeContainers); }