aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2021-09-28 21:19:54 +0200
committerGitHub <noreply@github.com>2021-09-28 21:19:54 +0200
commitb57543dc1a1e3d32bcd03afb7af972490d691bf1 (patch)
tree1e36b7442236e4d4b6493a32bfddd44d0018df16
parent35223653327b86a059d23c543bbac3611d43775f (diff)
parentb3e085fdcd7b2a5abfc569c4da659d7e0dd690e7 (diff)
Merge pull request #19336 from vespa-engine/balder/precompute-hostresources-part-2
Compute capacity once for each host, instead of once per host per node.
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMover.java28
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java1
2 files changed, 23 insertions, 6 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMover.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMover.java
index 54e9886d2b7..3003e519fcd 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMover.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMover.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.provision.maintenance;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Deployer;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.hosted.provision.Node;
@@ -12,6 +13,8 @@ import com.yahoo.vespa.hosted.provision.provisioning.HostCapacity;
import java.time.Duration;
import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Random;
import java.util.Set;
@@ -38,6 +41,19 @@ public abstract class NodeMover<MOVE> extends NodeRepositoryMaintainer {
/** Returns a suggested move for given node */
protected abstract MOVE suggestedMove(Node node, Node fromHost, Node toHost, NodeList allNodes);
+ private static class HostWithResources {
+ private final Node node;
+ private final NodeResources hostResources;
+ HostWithResources(Node node, NodeResources hostResources) {
+ this.node = node;
+ this.hostResources = hostResources;
+ }
+ boolean hasCapacity(NodeResources requested) {
+ return hostResources.satisfies(requested);
+ }
+
+ }
+
/** Find the best possible move */
protected final MOVE findBestMove(NodeList allNodes) {
HostCapacity capacity = new HostCapacity(allNodes, nodeRepository().resourcesCalculator());
@@ -48,17 +64,19 @@ public abstract class NodeMover<MOVE> extends NodeRepositoryMaintainer {
.state(Node.State.active)
.shuffle(random);
Set<Node> spares = capacity.findSpareHosts(allNodes.asList(), nodeRepository().spareCount());
+ List<HostWithResources> hostResources = new ArrayList<>();
+ allNodes.matching(nodeRepository().nodes()::canAllocateTenantNodeTo).forEach(host -> hostResources.add(new HostWithResources(host, capacity.availableCapacityOf(host))));
for (Node node : activeNodes) {
if (node.parentHostname().isEmpty()) continue;
ApplicationId applicationId = node.allocation().get().owner();
if (applicationId.instance().isTester()) continue;
if (deployedRecently(applicationId)) continue;
- for (Node toHost : allNodes.matching(nodeRepository().nodes()::canAllocateTenantNodeTo)) {
- if (toHost.hostname().equals(node.parentHostname().get())) continue;
- if (spares.contains(toHost)) continue; // Do not offer spares as a valid move as they are reserved for replacement of failed nodes
- if ( ! capacity.hasCapacity(toHost, node.resources())) continue;
+ for (HostWithResources toHost : hostResources) {
+ if (toHost.node.hostname().equals(node.parentHostname().get())) continue;
+ if (spares.contains(toHost.node)) continue; // Do not offer spares as a valid move as they are reserved for replacement of failed nodes
+ if ( ! toHost.hasCapacity(node.resources())) continue;
- MOVE suggestedMove = suggestedMove(node, allNodes.parentOf(node).get(), toHost, allNodes);
+ MOVE suggestedMove = suggestedMove(node, allNodes.parentOf(node).get(), toHost.node, allNodes);
bestMove = bestMoveOf(bestMove, suggestedMove);
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java
index ce9193e9669..462187a5add 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java
@@ -7,7 +7,6 @@ import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeList;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;