diff options
author | Jon Bratseth <bratseth@oath.com> | 2021-09-28 21:19:54 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-28 21:19:54 +0200 |
commit | b57543dc1a1e3d32bcd03afb7af972490d691bf1 (patch) | |
tree | 1e36b7442236e4d4b6493a32bfddd44d0018df16 | |
parent | 35223653327b86a059d23c543bbac3611d43775f (diff) | |
parent | b3e085fdcd7b2a5abfc569c4da659d7e0dd690e7 (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.
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; |