diff options
author | toby <smorgrav@yahoo-inc.com> | 2017-08-23 15:11:45 +0200 |
---|---|---|
committer | toby <smorgrav@yahoo-inc.com> | 2017-08-25 10:34:27 +0200 |
commit | d73ceea1a16a59bc2d4a0e421bd9d224ff0ec0b6 (patch) | |
tree | 51541e43c25b78d2d602fa130acd40603a78d2f6 /node-repository | |
parent | 9a002b237f31a2e919f7a597b0ae1fc9684bbeb8 (diff) |
Only move smallest container from headroom violated hosts
Diffstat (limited to 'node-repository')
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java index eb7c8ab7f3c..aa3870bd61c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java @@ -30,7 +30,7 @@ import java.util.stream.Collectors; * * @author smorgrav */ -public class NodePrioritizer { +class NodePrioritizer { private final Map<Node, PrioritizableNode> nodes = new HashMap<>(); private final List<Node> allNodes; @@ -50,8 +50,8 @@ public class NodePrioritizer { this.clusterSpec = clusterSpec; this.appId = appId; - spareHosts = findSpareHosts(allNodes, spares); - headroomHosts = findHeadroomHosts(allNodes, spareHosts, nodeFlavors); + this.spareHosts = findSpareHosts(allNodes, spares); + this.headroomHosts = findHeadroomHosts(allNodes, spareHosts, nodeFlavors); this.capacity = new DockerHostCapacity(allNodes); @@ -68,14 +68,14 @@ public class NodePrioritizer { .filter(node -> node.allocation().get().membership().cluster().id().equals(clusterSpec.id())) .count(); - isAllocatingForReplacement = isReplacement(nofNodesInCluster, nofFailedNodes); - isDocker = isDocker(); + this.isAllocatingForReplacement = isReplacement(nofNodesInCluster, nofFailedNodes); + this.isDocker = isDocker(); } /** * From ipAddress - get hostname * - * @return hostname or null if not able to do the loopup + * @return hostname or null if not able to do the lookup */ private static String lookupHostname(String ipAddress) { try { @@ -264,7 +264,7 @@ public class NodePrioritizer { pri.violatesSpares = true; } - if (headroomHosts.containsKey(parent)) { + if (headroomHosts.containsKey(parent) && isSmallestNodeOnParent(node, parent)) { ResourceCapacity neededCapacity = headroomHosts.get(parent); // If the node is new then we need to check the headroom requirement after it has been added @@ -278,6 +278,17 @@ public class NodePrioritizer { return pri; } + private boolean isSmallestNodeOnParent(Node node, Node parent) { + NodeList list = new NodeList(allNodes); + ResourceCapacity nodeSize = new ResourceCapacity(node); + for (Node child : list.childNodes(parent).asList()) { + if (new ResourceCapacity(child).compare(nodeSize) < 0) { + return false; + } + } + return true; + } + private boolean isReplacement(long nofNodesInCluster, long nodeFailedNodes) { if (nodeFailedNodes == 0) return false; |