From beeee393fd2479ae092936ea313e92cebe3899e3 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 3 Aug 2022 16:00:30 +0200 Subject: Now we can adjust for redundancy when preserving --- .../provision/autoscale/AllocationOptimizer.java | 12 ++++-------- .../hosted/provision/autoscale/ClusterModel.java | 2 +- .../hosted/provision/autoscale/ResourceTarget.java | 19 ++++++------------- .../provisioning/NodeRepositoryProvisioner.java | 2 +- 4 files changed, 12 insertions(+), 23 deletions(-) (limited to 'node-repository/src/main/java') diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java index 48ba701849c..8c01696d275 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java @@ -51,8 +51,8 @@ public class AllocationOptimizer { // Adjust for redundancy: Node in group if groups = 1, an extra group if multiple groups // TODO: Make the best choice between those two based on size and redundancy setting instead - int nodesAdjustedForRedundancy = target.adjustForRedundancy() ? clusterModel.nodesAdjustedForRedundancy(nodes, groups) : nodes; - int groupsAdjustedForRedundancy = target.adjustForRedundancy() ? clusterModel.groupsAdjustedForRedundancy(nodes, groups) : groups; + int nodesAdjustedForRedundancy = clusterModel.nodesAdjustedForRedundancy(nodes, groups); + int groupsAdjustedForRedundancy = clusterModel.groupsAdjustedForRedundancy(nodes, groups); ClusterResources next = new ClusterResources(nodes, groups, @@ -79,12 +79,8 @@ public class AllocationOptimizer { ResourceTarget target, AllocatableClusterResources current, ClusterModel clusterModel) { - int currentNodes = clusterModel.nodeCount(); - int currentGroups = clusterModel.groupCount(); - if (target.adjustForRedundancy()) { - currentNodes = clusterModel.nodesAdjustedForRedundancy(clusterModel.nodeCount(), clusterModel.groupCount()); - currentGroups = clusterModel.groupsAdjustedForRedundancy(clusterModel.nodeCount(), clusterModel.groupCount()); - } + int currentNodes = clusterModel.nodesAdjustedForRedundancy(clusterModel.nodeCount(), clusterModel.groupCount()); + int currentGroups = clusterModel.groupsAdjustedForRedundancy(clusterModel.nodeCount(), clusterModel.groupCount()); var scaled = clusterModel.loadWith(nodes, groups) .scaled(Load.one().divide(clusterModel.loadWith(currentNodes, currentGroups)).scaled(target.resources())); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java index 5af1325dd91..abcd626e64a 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java @@ -152,7 +152,7 @@ public class ClusterModel { return (int)Math.ceil((double)nodeCount() / groupCount()); } - /** Returns the load with the given nodes+groups relative to achieving the target with the allocation in this. */ + /** Returns the relative load adjustment given these nodes+groups relative to node nodes+groups in this. */ public Load loadWith(int nodes, int groups) { if (clusterSpec().type() == ClusterSpec.Type.content) { // load scales with node share of content int groupSize = nodes / groups; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java index 8d2f98187b3..7bc019caabb 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java @@ -16,38 +16,31 @@ import java.util.OptionalDouble; */ public class ResourceTarget { - private final boolean adjustForRedundancy; - /** The target real resources per node, assuming the node assignment where this was decided */ private final NodeResources resources; - private ResourceTarget(NodeResources resources, boolean adjustForRedundancy) { + private ResourceTarget(NodeResources resources) { this.resources = resources; - this.adjustForRedundancy = adjustForRedundancy; } - /** Are the target resources given by this including redundancy or not */ - public boolean adjustForRedundancy() { return adjustForRedundancy; } - /** Returns the target resources per node in terms of the current allocation */ public NodeResources resources() { return resources; } @Override public String toString() { - return "target " + resources + (adjustForRedundancy ? "(with redundancy adjustment) " : ""); + return "target " + resources; } /** Create a target of achieving ideal load given a current load */ public static ResourceTarget idealLoad(ClusterModel clusterModel, AllocatableClusterResources current) { - System.out.println("Adjustment: " + clusterModel.loadAdjustment()); - System.out.println("Target: " + new ResourceTarget(clusterModel.loadAdjustment().scaled(current.realResources().nodeResources()), false)); - return new ResourceTarget(clusterModel.loadAdjustment().scaled(current.realResources().nodeResources()), true); + return new ResourceTarget(clusterModel.loadAdjustment().scaled(current.realResources().nodeResources())); } /** Crete a target of preserving a current allocation */ - public static ResourceTarget preserve(AllocatableClusterResources current) { - return new ResourceTarget(current.realResources().nodeResources(), false); + public static ResourceTarget preserve(ClusterModel clusterModel, + AllocatableClusterResources current) { + return new ResourceTarget(current.realResources().nodeResources()); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java index 4ffe04d748c..8e00a623e1c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java @@ -196,7 +196,7 @@ public class NodeRepositoryProvisioner implements Provisioner { if (! firstDeployment && currentAsAdvertised.isWithin(limits.min(), limits.max())) return currentAsAdvertised; // Otherwise, find an allocation that preserves the current resources as well as possible - return allocationOptimizer.findBestAllocation(ResourceTarget.preserve(current), + return allocationOptimizer.findBestAllocation(ResourceTarget.preserve(clusterModel, current), current, clusterModel, limits) -- cgit v1.2.3