diff options
3 files changed, 47 insertions, 47 deletions
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 b135d913fde..68dafa6f034 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 @@ -478,48 +478,46 @@ public class AutoscalingTest { @Test public void test_autoscaling_considers_growth_rate() { - NodeResources minResources = new NodeResources( 1, 100, 100, 1); - NodeResources midResources = new NodeResources( 5, 100, 100, 1); - NodeResources maxResources = new NodeResources(10, 100, 100, 1); - ClusterResources min = new ClusterResources(5, 1, minResources); - ClusterResources max = new ClusterResources(5, 1, maxResources); - var capacity = Capacity.from(min, max); - AutoscalingTester tester = new AutoscalingTester(maxResources.withVcpu(maxResources.vcpu() * 2)); + var min = new ClusterResources(5, 1, new NodeResources( 1, 100, 100, 1)); + var now = new ClusterResources(5, 1, new NodeResources( 5, 100, 100, 1)); + var max = new ClusterResources(5, 1, new NodeResources(10, 100, 100, 1)); + var fixture = AutoscalingTester.fixture() + .initialResources(Optional.of(now)) + .capacity(Capacity.from(min, max)) + .build(); - ApplicationId application1 = AutoscalingTester.applicationId("application1"); - ClusterSpec cluster1 = AutoscalingTester.clusterSpec(ClusterSpec.Type.container, "cluster1"); - tester.deploy(application1, cluster1, 5, 1, midResources); - Duration timeAdded = tester.addQueryRateMeasurements(application1, cluster1.id(), 100, t -> t == 0 ? 20.0 : 10.0); - tester.clock().advance(timeAdded.negated()); - tester.addCpuMeasurements(0.25f, 1f, 200, application1); + fixture.tester().clock().advance(Duration.ofDays(2)); + Duration timeAdded = fixture.addLoadMeasurements(100, t -> t == 0 ? 20.0 : 10.0, t -> 0.0); + fixture.tester.clock().advance(timeAdded.negated()); + fixture.addCpuMeasurements(0.25, 200); // (no query rate data) - tester.assertResources("Scale up since we assume we need 2x cpu for growth when no data scaling time data", - 5, 1, 6.3, 100, 100, - tester.autoscale(application1, cluster1, capacity)); + fixture.tester().assertResources("Scale up since we assume we need 2x cpu for growth when no data scaling time data", + 5, 1, 6.4, 100, 100, + fixture.autoscale()); - tester.setScalingDuration(application1, cluster1.id(), Duration.ofMinutes(5)); - timeAdded = tester.addQueryRateMeasurements(application1, cluster1.id(), - 100, - t -> 10.0 + (t < 50 ? t : 100 - t)); - tester.clock().advance(timeAdded.negated()); - tester.addCpuMeasurements(0.25f, 1f, 200, application1); - tester.assertResources("Scale down since observed growth is slower than scaling time", - 5, 1, 3.4, 100, 100, - tester.autoscale(application1, cluster1, capacity)); + fixture.setScalingDuration(Duration.ofMinutes(5)); + + fixture.tester().clock().advance(Duration.ofDays(2)); + timeAdded = fixture.addLoadMeasurements(100, t -> 10.0 + (t < 50 ? t : 100 - t), t -> 0.0); + fixture.tester.clock().advance(timeAdded.negated()); + fixture.addCpuMeasurements(0.25, 200); + fixture.tester().assertResources("Scale down since observed growth is slower than scaling time", + 5, 1, 5.6, 100, 100, + fixture.autoscale()); - tester.clearQueryRateMeasurements(application1, cluster1.id()); + fixture.setScalingDuration(Duration.ofMinutes(60)); - tester.setScalingDuration(application1, cluster1.id(), Duration.ofMinutes(60)); - timeAdded = tester.addQueryRateMeasurements(application1, cluster1.id(), - 100, - t -> 10.0 + (t < 50 ? t * t * t : 125000 - (t - 49) * (t - 49) * (t - 49))); - tester.clock().advance(timeAdded.negated()); - tester.addCpuMeasurements(0.25f, 1f, 200, application1); - tester.assertResources("Scale up since observed growth is faster than scaling time", - 5, 1, 10.0, 100, 100, - tester.autoscale(application1, cluster1, capacity)); + fixture.tester().clock().advance(Duration.ofDays(2)); + timeAdded = fixture.addLoadMeasurements(100, + t -> 10.0 + (t < 50 ? t * t * t : 125000 - (t - 49) * (t - 49) * (t - 49)), + t -> 0.0); + fixture.tester.clock().advance(timeAdded.negated()); + fixture.addCpuMeasurements(0.25, 200); + fixture.tester().assertResources("Scale up since observed growth is faster than scaling time", + 5, 1, 6.6, 100, 100, + fixture.autoscale()); } @Test 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 2a052c308b6..371d5dbee59 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 @@ -299,11 +299,12 @@ class AutoscalingTester { } /** Creates the given number of measurements, spaced 5 minutes between, using the given function */ - public void addLoadMeasurements(ApplicationId application, + public Duration addLoadMeasurements(ApplicationId application, ClusterSpec.Id cluster, int measurements, IntFunction<Double> queryRate, IntFunction<Double> writeRate) { + Instant initialTime = clock().instant(); for (int i = 0; i < measurements; i++) { nodeMetricsDb().addClusterMetrics(application, Map.of(cluster, new ClusterMetricSnapshot(clock().instant(), @@ -311,6 +312,7 @@ class AutoscalingTester { writeRate.apply(i)))); clock().advance(Duration.ofMinutes(5)); } + return Duration.between(initialTime, clock().instant()); } /** Creates the given number of measurements, spaced 5 minutes between, using the given function */ @@ -337,10 +339,6 @@ class AutoscalingTester { return Duration.between(initialTime, clock().instant()); } - public void clearQueryRateMeasurements(ApplicationId application, ClusterSpec.Id cluster) { - ((MemoryMetricsDb)nodeMetricsDb()).clearClusterMetrics(application, cluster); - } - public Autoscaler.Advice autoscale(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity) { capacity = capacityPolicies.applyOn(capacity, applicationId, capacityPolicies.decideExclusivity(capacity, cluster.isExclusive())); Application application = nodeRepository().applications().get(applicationId).orElse(Application.empty(applicationId)) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java index fe291eb6c6b..602b6189898 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java @@ -46,7 +46,7 @@ public class Fixture { /** Autoscale within the given capacity. */ public Autoscaler.Advice autoscale(Capacity capacity) { - return tester.autoscale(application, cluster, capacity); + return tester().autoscale(application, cluster, capacity); } /** Redeploy with the deployed capacity of this. */ @@ -56,24 +56,28 @@ public class Fixture { /** Redeploy with the given capacity. */ public void deploy(Capacity capacity) { - tester.deploy(application, cluster, capacity); + tester().deploy(application, cluster, capacity); } /** Returns the nodes allocated to the fixture application cluster */ public NodeList nodes() { - return tester.nodeRepository().nodes().list().owner(application).cluster(cluster.id()); + return tester().nodeRepository().nodes().list().owner(application).cluster(cluster.id()); } public void deactivateRetired(Capacity capacity) { - tester.deactivateRetired(application, cluster, capacity); + tester().deactivateRetired(application, cluster, capacity); + } + + public void setScalingDuration(Duration duration) { + tester().setScalingDuration(application, cluster.id(), duration); } public Duration addCpuMeasurements(double cpuLoad, int measurements) { return tester().addCpuMeasurements((float)cpuLoad, 1.0f, measurements, application); } - public void addLoadMeasurements(int measurements, IntFunction<Double> queryRate, IntFunction<Double> writeRate) { - tester().addLoadMeasurements(application, cluster.id(), measurements, queryRate, writeRate); + public Duration addLoadMeasurements(int measurements, IntFunction<Double> queryRate, IntFunction<Double> writeRate) { + return tester().addLoadMeasurements(application, cluster.id(), measurements, queryRate, writeRate); } public void applyCpuLoad(double cpuLoad, int measurements) { @@ -105,7 +109,7 @@ public class Fixture { } public void storeReadShare(double currentReadShare, double maxReadShare) { - tester.storeReadShare(currentReadShare, maxReadShare, application); + tester().storeReadShare(currentReadShare, maxReadShare, application); } public static class Builder { |