summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2023-01-06 13:11:46 +0100
committerJon Bratseth <bratseth@gmail.com>2023-01-06 13:11:46 +0100
commit8e66f239ab0230db3882bd63bb68e4a055ae5873 (patch)
tree02ade0bf1843d43dc80c9272bc9d9460a9e3d6d4 /node-repository
parent9d499d42bcca59c69cb87335a2555e2bbcbdb976 (diff)
No functional changes
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java3
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodeSerializer.java94
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java22
3 files changed, 69 insertions, 50 deletions
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 388c77e4e5d..fc9d77d7486 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
@@ -111,7 +111,6 @@ public class ClusterModel {
/** Returns the relative load adjustment that should be made to this cluster given available measurements. */
public Load loadAdjustment() {
if (nodeTimeseries().isEmpty()) return Load.one();
-
Load adjustment = peakLoad().divide(idealLoad());
if (! safeToScaleDown())
adjustment = adjustment.map(v -> v < 1 ? 1 : v);
@@ -119,7 +118,7 @@ public class ClusterModel {
}
/** Are we in a position to make decisions to scale down at this point? */
- private boolean safeToScaleDown() {
+ public boolean safeToScaleDown() {
if (hasScaledIn(scalingDuration().multipliedBy(3))) return false;
if (nodeTimeseries().nodesMeasured() != nodeCount()) return false;
return true;
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodeSerializer.java
index 6282c072001..8e5fedf69ff 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodeSerializer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodeSerializer.java
@@ -12,63 +12,61 @@ import com.yahoo.vespa.hosted.provision.Node;
public class NodeSerializer {
public static Node.State stateFrom(String state) {
- switch (state) {
- case "active": return Node.State.active;
- case "dirty": return Node.State.dirty;
- case "failed": return Node.State.failed;
- case "inactive": return Node.State.inactive;
- case "parked": return Node.State.parked;
- case "provisioned": return Node.State.provisioned;
- case "ready": return Node.State.ready;
- case "reserved": return Node.State.reserved;
- case "deprovisioned": return Node.State.deprovisioned;
- case "breakfixed": return Node.State.breakfixed;
- default: throw new IllegalArgumentException("Unknown node state '" + state + "'");
- }
+ return switch (state) {
+ case "active" -> Node.State.active;
+ case "dirty" -> Node.State.dirty;
+ case "failed" -> Node.State.failed;
+ case "inactive" -> Node.State.inactive;
+ case "parked" -> Node.State.parked;
+ case "provisioned" -> Node.State.provisioned;
+ case "ready" -> Node.State.ready;
+ case "reserved" -> Node.State.reserved;
+ case "deprovisioned" -> Node.State.deprovisioned;
+ case "breakfixed" -> Node.State.breakfixed;
+ default -> throw new IllegalArgumentException("Unknown node state '" + state + "'");
+ };
}
public static String toString(Node.State state) {
- switch (state) {
- case active: return "active";
- case dirty: return "dirty";
- case failed: return "failed";
- case inactive: return "inactive";
- case parked: return "parked";
- case provisioned: return "provisioned";
- case ready: return "ready";
- case reserved: return "reserved";
- case deprovisioned: return "deprovisioned";
- case breakfixed: return "breakfixed";
- default: throw new IllegalArgumentException("Unknown node state '" + state + "'");
- }
+ return switch (state) {
+ case active -> "active";
+ case dirty -> "dirty";
+ case failed -> "failed";
+ case inactive -> "inactive";
+ case parked -> "parked";
+ case provisioned -> "provisioned";
+ case ready -> "ready";
+ case reserved -> "reserved";
+ case deprovisioned -> "deprovisioned";
+ case breakfixed -> "breakfixed";
+ };
}
public static NodeType typeFrom(String nodeType) {
- switch (nodeType) {
- case "tenant": return NodeType.tenant;
- case "host": return NodeType.host;
- case "proxy": return NodeType.proxy;
- case "proxyhost": return NodeType.proxyhost;
- case "config": return NodeType.config;
- case "confighost": return NodeType.confighost;
- case "controller": return NodeType.controller;
- case "controllerhost": return NodeType.controllerhost;
- default: throw new IllegalArgumentException("Unknown node type '" + nodeType + "'");
- }
+ return switch (nodeType) {
+ case "tenant" -> NodeType.tenant;
+ case "host" -> NodeType.host;
+ case "proxy" -> NodeType.proxy;
+ case "proxyhost" -> NodeType.proxyhost;
+ case "config" -> NodeType.config;
+ case "confighost" -> NodeType.confighost;
+ case "controller" -> NodeType.controller;
+ case "controllerhost" -> NodeType.controllerhost;
+ default -> throw new IllegalArgumentException("Unknown node type '" + nodeType + "'");
+ };
}
public static String toString(NodeType type) {
- switch (type) {
- case tenant: return "tenant";
- case host: return "host";
- case proxy: return "proxy";
- case proxyhost: return "proxyhost";
- case config: return "config";
- case confighost: return "confighost";
- case controller: return "controller";
- case controllerhost: return "controllerhost";
- default: throw new IllegalArgumentException("Unknown node type '" + type.name() + "'");
- }
+ return switch (type) {
+ case tenant -> "tenant";
+ case host -> "host";
+ case proxy -> "proxy";
+ case proxyhost -> "proxyhost";
+ case config -> "config";
+ case confighost -> "confighost";
+ case controller -> "controller";
+ case controllerhost -> "controllerhost";
+ };
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java
index 4ce07d53ea9..d48a3d169a2 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java
@@ -743,6 +743,28 @@ public class AutoscalingTest {
fixture.currentResources().advertisedResources());
}
+ /** Tests an autoscaling scenario which should cause in-place resize. */
+ @Test
+ public void test_resize() {
+ var min = new ClusterResources(7, 1, new NodeResources( 2, 10, 384, 1));
+ var now = new ClusterResources(7, 1, new NodeResources( 3.4, 16.2, 450.1, 1));
+ var max = new ClusterResources(7, 1, new NodeResources( 4, 32, 768, 1));
+ var fixture = AutoscalingTester.fixture()
+ .awsProdSetup(true)
+ .capacity(Capacity.from(min, max))
+ .initialResources(Optional.of(now))
+ .build();
+ var initialNodes = fixture.nodes().asList();
+ fixture.tester().clock().advance(Duration.ofDays(2));
+ fixture.loader().applyLoad(new Load(0.06, 0.52, 0.27), 100);
+ var autoscaling = fixture.autoscale();
+ fixture.tester().assertResources("Scaling down",
+ 7, 1, 2, 15.9, 384.0,
+ autoscaling);
+ fixture.deploy(Capacity.from(autoscaling.resources().get()));
+ assertEquals("Initial nodes are kept", initialNodes, fixture.nodes().asList());
+ }
+
private ClusterSpec clusterSpec(boolean exclusive) {
return ClusterSpec.request(ClusterSpec.Type.container,
ClusterSpec.Id.from("test")).vespaVersion("8.1.2")