From b3e085fdcd7b2a5abfc569c4da659d7e0dd690e7 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 28 Sep 2021 06:04:38 +0200 Subject: Compute capacity once for each host, instead of once per host per node. --- .../hosted/provision/maintenance/NodeMover.java | 28 ++++++++++++++++++---- .../provision/provisioning/HostCapacity.java | 1 - 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 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 extends NodeRepositoryMaintainer { .state(Node.State.active) .shuffle(random); Set spares = capacity.findSpareHosts(allNodes.asList(), nodeRepository().spareCount()); + List 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; -- cgit v1.2.3