diff options
Diffstat (limited to 'node-repository')
4 files changed, 44 insertions, 7 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java index ab8b954610a..4fe56e3a6af 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java @@ -47,7 +47,7 @@ public class AllocatableClusterResources { this.nodes = nodes.size(); this.groups = (int)nodes.stream().map(node -> node.allocation().get().membership().cluster().group()).distinct().count(); this.realResources = averageRealResourcesOf(nodes, nodeRepository, exclusive); // Average since we average metrics over nodes - this.advertisedResources = nodes.get(0).resources(); + this.advertisedResources = nodes.get(0).allocation().get().requestedResources(); this.clusterSpec = nodes.get(0).allocation().get().membership().cluster(); this.fulfilment = 1; } @@ -123,7 +123,7 @@ public class AllocatableClusterResources { NodeResources sum = new NodeResources(0, 0, 0, 0); for (Node node : nodes) sum = sum.add(nodeRepository.resourcesCalculator().realResourcesOf(node, nodeRepository, exclusive).justNumbers()); - return nodes.get(0).resources().justNonNumbers() + return nodes.get(0).allocation().get().requestedResources().justNonNumbers() .withVcpu(sum.vcpu() / nodes.size()) .withMemoryGb(sum.memoryGb() / nodes.size()) .withDiskGb(sum.diskGb() / nodes.size()) 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 4b9dc2e6417..3fef1d9746b 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 @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.provision.autoscale; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.Cloud; import com.yahoo.config.provision.ClusterResources; import com.yahoo.config.provision.ClusterSpec; @@ -138,6 +139,36 @@ public class AutoscalingTest { } @Test + public void autoscaling_target_preserves_any() { + NodeResources hostResources = new NodeResources(3, 100, 100, 1); + AutoscalingTester tester = new AutoscalingTester(hostResources); + + ApplicationId application1 = tester.applicationId("application1"); + ClusterSpec cluster1 = tester.clusterSpec(ClusterSpec.Type.content, "cluster1"); + + // Initial deployment + NodeResources resources = new NodeResources(1, 10, 10, 1); + var min = new ClusterResources( 2, 1, resources.with(NodeResources.DiskSpeed.any)); + var max = new ClusterResources( 10, 1, resources.with(NodeResources.DiskSpeed.any)); + tester.deploy(application1, cluster1, Capacity.from(min, max)); + + // Redeployment without target: Uses current resource numbers with *requested* non-numbers (i.e disk-speed any) + assertTrue(tester.nodeRepository().applications().get(application1).get().cluster(cluster1.id()).get().targetResources().isEmpty()); + tester.deploy(application1, cluster1, Capacity.from(min, max)); + assertEquals(NodeResources.DiskSpeed.any, + tester.nodeRepository().nodes().list().owner(application1).cluster(cluster1.id()).first().get() + .allocation().get().requestedResources().diskSpeed()); + + // Autoscaling: Uses disk-speed any as well + tester.clock().advance(Duration.ofDays(2)); + tester.addCpuMeasurements(0.8f, 1f, 120, application1); + Autoscaler.Advice advice = tester.autoscale(application1, cluster1.id(), min, max); + assertEquals(NodeResources.DiskSpeed.any, advice.target().get().nodeResources().diskSpeed()); + + + } + + @Test public void autoscaling_respects_upper_limit() { NodeResources hostResources = new NodeResources(6, 100, 100, 1); ClusterResources min = new ClusterResources( 2, 1, new NodeResources(1, 1, 1, 1)); 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 3f3655dcab6..0619b0ad645 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 @@ -74,6 +74,8 @@ class AutoscalingTester { autoscaler = new Autoscaler(db, nodeRepository()); } + public ProvisioningTester provisioning() { return provisioningTester; } + public ApplicationId applicationId(String applicationName) { return ApplicationId.from("tenant1", applicationName, "instance1"); } @@ -87,7 +89,11 @@ class AutoscalingTester { } public List<HostSpec> deploy(ApplicationId application, ClusterSpec cluster, int nodes, int groups, NodeResources resources) { - List<HostSpec> hosts = provisioningTester.prepare(application, cluster, Capacity.from(new ClusterResources(nodes, groups, resources))); + return deploy(application, cluster, Capacity.from(new ClusterResources(nodes, groups, resources))); + } + + public List<HostSpec> deploy(ApplicationId application, ClusterSpec cluster, Capacity capacity) { + List<HostSpec> hosts = provisioningTester.prepare(application, cluster, capacity); for (HostSpec host : hosts) makeReady(host.hostname()); provisioningTester.activateTenantHosts(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java index af745608679..78965f0b902 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java @@ -72,9 +72,9 @@ public class ScalingSuggestionsMaintainerTest { new TestMetric()); maintainer.maintain(); - assertEquals("14 nodes with [vcpu: 6.9, memory: 5.1 Gb, disk 15.0 Gb, bandwidth: 0.1 Gbps, storage type: remote]", + assertEquals("14 nodes with [vcpu: 6.9, memory: 5.1 Gb, disk 15.0 Gb, bandwidth: 0.1 Gbps]", suggestionOf(app1, cluster1, tester).get().resources().toString()); - assertEquals("8 nodes with [vcpu: 14.7, memory: 4.0 Gb, disk 11.8 Gb, bandwidth: 0.1 Gbps, storage type: remote]", + assertEquals("8 nodes with [vcpu: 14.7, memory: 4.0 Gb, disk 11.8 Gb, bandwidth: 0.1 Gbps]", suggestionOf(app2, cluster2, tester).get().resources().toString()); // Utilization goes way down @@ -82,14 +82,14 @@ public class ScalingSuggestionsMaintainerTest { addMeasurements(0.10f, 0.10f, 0.10f, 0, 500, app1, tester.nodeRepository(), metricsDb); maintainer.maintain(); assertEquals("Suggestion stays at the peak value observed", - "14 nodes with [vcpu: 6.9, memory: 5.1 Gb, disk 15.0 Gb, bandwidth: 0.1 Gbps, storage type: remote]", + "14 nodes with [vcpu: 6.9, memory: 5.1 Gb, disk 15.0 Gb, bandwidth: 0.1 Gbps]", suggestionOf(app1, cluster1, tester).get().resources().toString()); // Utilization is still way down and a week has passed tester.clock().advance(Duration.ofDays(7)); addMeasurements(0.10f, 0.10f, 0.10f, 0, 500, app1, tester.nodeRepository(), metricsDb); maintainer.maintain(); assertEquals("Peak suggestion has been outdated", - "6 nodes with [vcpu: 2.0, memory: 4.0 Gb, disk 10.0 Gb, bandwidth: 0.1 Gbps, storage type: remote]", + "6 nodes with [vcpu: 2.0, memory: 4.0 Gb, disk 10.0 Gb, bandwidth: 0.1 Gbps]", suggestionOf(app1, cluster1, tester).get().resources().toString()); assertTrue(shouldSuggest(app1, cluster1, tester)); |