aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authortoby <smorgrav@yahoo-inc.com>2017-08-23 15:11:45 +0200
committertoby <smorgrav@yahoo-inc.com>2017-08-25 10:34:27 +0200
commitd73ceea1a16a59bc2d4a0e421bd9d224ff0ec0b6 (patch)
tree51541e43c25b78d2d602fa130acd40603a78d2f6 /node-repository
parent9a002b237f31a2e919f7a597b0ae1fc9684bbeb8 (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.java25
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;