aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2022-05-18 18:09:09 +0200
committerMartin Polden <mpolden@mpolden.no>2022-05-18 18:09:58 +0200
commit77e26dd3783b54c294eb55530227f911cf3ee56c (patch)
tree6ec77d091c923614a6c17b7fcf3e8ecd3ee4c37a
parent550194c7b1f86616971b67bec5cdf662e4d98b9e (diff)
Never downsize if allocating exclusively
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java14
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java3
4 files changed, 11 insertions, 13 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
index 00671e14768..4aeb6722ba9 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
@@ -40,15 +40,15 @@ public class CapacityPolicies {
this.flagSource = nodeRepository.flagSource();
}
- public Capacity applyOn(Capacity capacity, ApplicationId application) {
- return capacity.withLimits(applyOn(capacity.minResources(), capacity, application),
- applyOn(capacity.maxResources(), capacity, application));
+ public Capacity applyOn(Capacity capacity, ApplicationId application, boolean exclusive) {
+ return capacity.withLimits(applyOn(capacity.minResources(), capacity, application, exclusive),
+ applyOn(capacity.maxResources(), capacity, application, exclusive));
}
- private ClusterResources applyOn(ClusterResources resources, Capacity capacity, ApplicationId application) {
+ private ClusterResources applyOn(ClusterResources resources, Capacity capacity, ApplicationId application, boolean exclusive) {
int nodes = decideSize(resources.nodes(), capacity.isRequired(), application.instance().isTester());
int groups = Math.min(resources.groups(), nodes); // cannot have more groups than nodes
- var nodeResources = decideNodeResources(resources.nodeResources(), capacity.isRequired());
+ var nodeResources = decideNodeResources(resources.nodeResources(), capacity.isRequired(), exclusive);
return new ClusterResources(nodes, groups, nodeResources);
}
@@ -65,8 +65,8 @@ public class CapacityPolicies {
}
}
- private NodeResources decideNodeResources(NodeResources target, boolean required) {
- if (required) return target;
+ private NodeResources decideNodeResources(NodeResources target, boolean required, boolean exclusive) {
+ if (required || exclusive) return target; // Cannot downsize if resources are required, or exclusively allocated
if (target.isUnspecified()) return target; // Cannot be modified
// Dev does not cap the cpu or network of containers since usage is spotty: Allocate just a small amount exclusively
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 24743b47c8e..c7bb42ded2e 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
@@ -97,9 +97,9 @@ public class NodeRepositoryProvisioner implements Provisioner {
NodeResources resources;
NodeSpec nodeSpec;
if (requested.type() == NodeType.tenant) {
- var actual = capacityPolicies.applyOn(requested, application);
+ boolean exclusive = capacityPolicies.decideExclusivity(requested, cluster.isExclusive());
+ Capacity actual = capacityPolicies.applyOn(requested, application, exclusive);
ClusterResources target = decideTargetResources(application, cluster, actual);
- boolean exclusive = capacityPolicies.decideExclusivity(actual, cluster.isExclusive());
ensureRedundancy(target.nodes(), cluster, actual.canFail(), application);
logIfDownscaled(requested.minResources().nodes(), actual.minResources().nodes(), cluster, logger);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java
index 8586704a426..0c164328086 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java
@@ -32,7 +32,6 @@ import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.Set;
import java.util.function.IntFunction;
@@ -314,7 +313,7 @@ class AutoscalingTester {
}
public Autoscaler.Advice autoscale(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity) {
- capacity = capacityPolicies.applyOn(capacity, applicationId);
+ capacity = capacityPolicies.applyOn(capacity, applicationId, capacityPolicies.decideExclusivity(capacity, cluster.isExclusive()));
Application application = nodeRepository().applications().get(applicationId).orElse(Application.empty(applicationId))
.withCluster(cluster.id(), false, capacity);
try (Mutex lock = nodeRepository().nodes().lock(applicationId)) {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
index af94bba2e70..d3730106d54 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
@@ -30,7 +30,6 @@ import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.curator.mock.MockCurator;
import com.yahoo.vespa.curator.transaction.CuratorTransaction;
import com.yahoo.vespa.flags.FlagSource;
-import com.yahoo.vespa.flags.Flags;
import com.yahoo.vespa.flags.InMemoryFlagSource;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeList;
@@ -153,7 +152,7 @@ public class ProvisioningTester {
public Node node(String hostname) { return nodeRepository.nodes().node(hostname).get(); }
public int decideSize(Capacity capacity, ApplicationId application) {
- return capacityPolicies.applyOn(capacity, application).minResources().nodes();
+ return capacityPolicies.applyOn(capacity, application, false).minResources().nodes();
}
public Node patchNode(Node node, UnaryOperator<Node> patcher) {