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 +- .../provision/provisioning/ProvisioningTest.java | 4 ++-- ...ualNodeProvisioningCompleteHostCalculatorTest.java | 11 +++++------ .../provisioning/VirtualNodeProvisioningTest.java | 6 +++--- 7 files changed, 22 insertions(+), 34 deletions(-) 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) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index 34219a15caa..8c9c8939616 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -546,14 +546,14 @@ public class ProvisioningTest { tester.activate(app1, cluster1, Capacity.from(resources(6, 3, 8, 25, 10), resources(9, 3, 12, 35, 15))); tester.assertNodes("Groups changed", - 9, 3, 8, 35, 15, + 9, 3, 8, 30, 13, app1, cluster1); // Stop specifying node resources tester.activate(app1, cluster1, Capacity.from(new ClusterResources(6, 3, NodeResources.unspecified()), new ClusterResources(9, 3, NodeResources.unspecified()))); tester.assertNodes("No change", - 9, 3, 8, 35, 15, + 9, 3, 8, 30, 13, app1, cluster1); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningCompleteHostCalculatorTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningCompleteHostCalculatorTest.java index 2f0caf8092f..d703ecf44e8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningCompleteHostCalculatorTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningCompleteHostCalculatorTest.java @@ -37,24 +37,23 @@ public class VirtualNodeProvisioningCompleteHostCalculatorTest { ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build(); var initialResources = new NodeResources(20, 16, 50, 1); - tester.activate(app1, cluster1, Capacity.from(new ClusterResources(2, 1, initialResources), - new ClusterResources(2, 1, initialResources))); + tester.activate(app1, cluster1, Capacity.from(new ClusterResources(2, 1, initialResources))); tester.assertNodes("Initial allocation", 2, 1, 20, 16, 50, 1.0, app1, cluster1); var newMinResources = new NodeResources( 5, 4, 11, 1); var newMaxResources = new NodeResources(20, 10, 30, 1); + tester.activate(app1, cluster1, Capacity.from(new ClusterResources(7, 1, newMinResources), new ClusterResources(7, 1, newMaxResources))); - tester.assertNodes("New allocation preserves total resources", - 7, 1, 7, 4.6, 14.3, 1.0, + tester.assertNodes("New allocation preserves (redundancy adjusted) total resources", + 7, 1, 5, 4.0, 11, 1.0, app1, cluster1); - tester.activate(app1, cluster1, Capacity.from(new ClusterResources(7, 1, newMinResources), new ClusterResources(7, 1, newMaxResources))); tester.assertNodes("Redeploying the same ranges does not cause changes", - 7, 1, 7, 4.6, 14.3, 1.0, + 7, 1, 5, 4.0, 11, 1.0, app1, cluster1); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java index a1c55833862..7728e0ac9c8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java @@ -522,14 +522,14 @@ public class VirtualNodeProvisioningTest { var newMaxResources = new NodeResources(20, 10, 30, 1); tester.activate(app1, cluster1, Capacity.from(new ClusterResources(7, 1, newMinResources), new ClusterResources(7, 1, newMaxResources))); - tester.assertNodes("New allocation preserves total resources", - 7, 1, 7, 6.7, 14.3, 1.0, + tester.assertNodes("New allocation preserves total (redundancy adjusted) resources", + 7, 1, 5, 6.0, 11, 1.0, app1, cluster1); tester.activate(app1, cluster1, Capacity.from(new ClusterResources(7, 1, newMinResources), new ClusterResources(7, 1, newMaxResources))); tester.assertNodes("Redeploying does not cause changes", - 7, 1, 7, 6.7, 14.3, 1.0, + 7, 1, 5, 6.0, 11, 1.0, app1, cluster1); } -- cgit v1.2.3