summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-08-03 16:00:30 +0200
committerJon Bratseth <bratseth@gmail.com>2022-08-03 16:00:30 +0200
commitbeeee393fd2479ae092936ea313e92cebe3899e3 (patch)
tree7c51d820759b8d542014e3edce795a8fd255b89a
parent075a95282a5c54d13e1e506764ed70e57cdc3826 (diff)
Now we can adjust for redundancy when preserving
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java19
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningCompleteHostCalculatorTest.java11
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java6
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);
}