From 5fd9d629aca9ab08bf3a87e709c6648889929e14 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 4 Mar 2020 13:40:56 +0100 Subject: Handle remote disk --- .../yahoo/vespa/hosted/provision/autoscale/Autoscaler.java | 3 +++ .../vespa/hosted/provision/autoscale/AutoscalingTest.java | 12 +++++------- .../vespa/hosted/provision/autoscale/AutoscalingTester.java | 11 ++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) (limited to 'node-repository') diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java index 31f3ed5fc95..f1d209b2ade 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeResources; +import com.yahoo.config.provision.host.FlavorOverrides; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.provisioning.HostResourcesCalculator; @@ -142,6 +143,8 @@ public class Autoscaler { Optional bestFlavor = Optional.empty(); for (Flavor flavor : nodeRepository.getAvailableFlavors().getFlavors()) { if ( ! flavor.resources().satisfies(resources.nodeResources())) continue; + if (flavor.resources().storageType() == NodeResources.StorageType.remote) + flavor = flavor.with(FlavorOverrides.ofDisk(resources.nodeResources().diskGb())); if (bestFlavor.isEmpty() || bestCost > costOf(flavor.resources())) { bestFlavor = Optional.of(flavor); bestCost = costOf(flavor); 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 fd0517a6e50..939a9fcdf31 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 @@ -114,9 +114,9 @@ public class AutoscalingTest { public void testAutoscalingAws() { List flavors = new ArrayList<>(); flavors.add(new Flavor("aws-xlarge", new NodeResources(3, 200, 100, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote))); - flavors.add(new Flavor("aws-large", new NodeResources(3, 150, 100, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote))); + flavors.add(new Flavor("aws-large", new NodeResources(3, 150, 100, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote))); flavors.add(new Flavor("aws-medium", new NodeResources(3, 100, 100, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote))); - flavors.add(new Flavor("aws-small", new NodeResources(3, 80, 100, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote))); + flavors.add(new Flavor("aws-small", new NodeResources(3, 80, 100, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote))); AutoscalingTester tester = new AutoscalingTester(new Zone(CloudName.from("aws"), SystemName.main, Environment.prod, RegionName.from("us-east")), flavors); @@ -128,10 +128,8 @@ public class AutoscalingTest { tester.deploy(application1, cluster1, 5, 1, new NodeResources(3, 100, 100, 1)); tester.addMeasurements(Resource.memory, 0.9f, 0.6f, 120, application1); - ClusterResources scaledResources = tester.assertResources("Scaling up since resource usage is too high." + - "Scaling flavor not count since the latter is more expensive due to " + - "memory charged but taken by aws, see MockHostResourcesCalculator", - 5, 1, 3, 150, 100, + ClusterResources scaledResources = tester.assertResources("Scaling up since resource usage is too high.", + 8, 1, 3, 80, 34.3, tester.autoscale(application1, cluster1)); tester.deploy(application1, cluster1, scaledResources); @@ -140,7 +138,7 @@ public class AutoscalingTest { tester.addMeasurements(Resource.memory, 0.3f, 0.6f, 1000, application1); System.out.println("Low memory usage"); tester.assertResources("Scaling down since resource usage has gone down", - 4, 1, 3, 100, 100, + 5, 1, 3, 80, 36, tester.autoscale(application1, cluster1)); } 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 66a883aec2e..1b0ccc3611c 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 @@ -220,7 +220,7 @@ class AutoscalingTester { @Override public List provisionHosts(List provisionIndexes, NodeResources resources, ApplicationId applicationId) { - Flavor hostFlavor = hostFlavors.stream().filter(f -> f.resources().justNumbers().equals(resources.justNumbers())).findAny() + Flavor hostFlavor = hostFlavors.stream().filter(f -> matches(f, resources)).findAny() .orElseThrow(() -> new RuntimeException("No flavor matching " + resources + ". Flavors: " + hostFlavors)); List hosts = new ArrayList<>(); @@ -244,6 +244,15 @@ class AutoscalingTester { throw new RuntimeException("Not implemented"); } + private boolean matches(Flavor flavor, NodeResources resources) { + NodeResources flavorResources = flavor.resources(); + if (flavorResources.storageType() == NodeResources.StorageType.remote + && resources.diskGb() <= flavorResources.diskGb()) + flavorResources = flavorResources.withDiskGb(resources.diskGb()); + + return flavorResources.justNumbers().equals(resources.justNumbers()); + } + } } -- cgit v1.2.3