diff options
author | Jon Bratseth <bratseth@gmail.com> | 2023-01-06 13:11:46 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2023-01-06 13:11:46 +0100 |
commit | 8e66f239ab0230db3882bd63bb68e4a055ae5873 (patch) | |
tree | 02ade0bf1843d43dc80c9272bc9d9460a9e3d6d4 /node-repository | |
parent | 9d499d42bcca59c69cb87335a2555e2bbcbdb976 (diff) |
No functional changes
Diffstat (limited to 'node-repository')
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") |