diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-06-02 09:43:25 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-06-02 09:43:25 +0200 |
commit | 5bd2c674cb1065d1629953331fc9ecf2bb56ccc2 (patch) | |
tree | 0249e828a6bca446126fa384c00825d7292d6943 /node-repository | |
parent | 939c9837cdec21fbe78d9740219138981ba025c2 (diff) |
Don't read lazily to catch QuestDb errors early
Diffstat (limited to 'node-repository')
3 files changed, 26 insertions, 15 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 0fb537d8462..19cc9f5714f 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 @@ -38,12 +38,12 @@ public class ClusterModel { private final MetricsDb metricsDb; private final Clock clock; private final Duration scalingDuration; + private final ClusterTimeseries clusterTimeseries; + private final ClusterNodesTimeseries nodeTimeseries; // Lazily initialized members private Double queryFractionOfMax = null; private Double maxQueryGrowthRate = null; - private ClusterNodesTimeseries nodeTimeseries = null; - private ClusterTimeseries clusterTimeseries = null; public ClusterModel(Application application, Cluster cluster, @@ -57,6 +57,8 @@ public class ClusterModel { this.metricsDb = metricsDb; this.clock = clock; this.scalingDuration = computeScalingDuration(cluster, clusterSpec); + this.clusterTimeseries = metricsDb.getClusterTimeseries(application.id(), cluster.id()); + this.nodeTimeseries = new ClusterNodesTimeseries(scalingDuration(), cluster, nodes, metricsDb); } /** For testing */ @@ -64,7 +66,8 @@ public class ClusterModel { Cluster cluster, Clock clock, Duration scalingDuration, - ClusterTimeseries clusterTimeseries) { + ClusterTimeseries clusterTimeseries, + ClusterNodesTimeseries nodeTimeseries) { this.application = application; this.cluster = cluster; this.nodes = null; @@ -73,20 +76,15 @@ public class ClusterModel { this.scalingDuration = scalingDuration; this.clusterTimeseries = clusterTimeseries; + this.nodeTimeseries = nodeTimeseries; } /** Returns the predicted duration of a rescaling of this cluster */ public Duration scalingDuration() { return scalingDuration; } - public ClusterNodesTimeseries nodeTimeseries() { - if (nodeTimeseries != null) return nodeTimeseries; - return nodeTimeseries = new ClusterNodesTimeseries(scalingDuration(), cluster, nodes, metricsDb); - } + public ClusterNodesTimeseries nodeTimeseries() { return nodeTimeseries; } - public ClusterTimeseries clusterTimeseries() { - if (clusterTimeseries != null) return clusterTimeseries; - return clusterTimeseries = metricsDb.getClusterTimeseries(application.id(), cluster.id()); - } + public ClusterTimeseries clusterTimeseries() { return clusterTimeseries; } /** * Returns the predicted max query growth rate per minute as a fraction of the average traffic diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java index 5f974abd84f..9b77d8b48c8 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java @@ -34,6 +34,11 @@ public class ClusterNodesTimeseries { this.timeseries = timeseries; } + private ClusterNodesTimeseries(NodeList clusterNodes, List<NodeTimeseries> timeseries) { + this.clusterNodes = clusterNodes; + this.timeseries = timeseries; + } + /** Returns the average number of measurements per node */ public int measurementsPerNode() { int measurementCount = timeseries.stream().mapToInt(m -> m.size()).sum(); @@ -61,4 +66,8 @@ public class ClusterNodesTimeseries { return timeseries.stream().map(nodeTimeseries -> nodeTimeseries.filter(filter)).collect(Collectors.toList()); } + public static ClusterNodesTimeseries empty() { + return new ClusterNodesTimeseries(NodeList.of(), List.of()); + } + } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java index 550ecceee23..c6575931c6d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java @@ -36,13 +36,15 @@ public class ClusterModelTest { // No current traffic share: Ideal load is low but capped var model1 = new ClusterModel(application.with(new Status(0.0, 1.0)), cluster, clock, Duration.ofMinutes(10), - timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock)); + timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock), + ClusterNodesTimeseries.empty()); assertEquals(0.131, model1.idealLoad().cpu(), delta); // Almost no current traffic share: Ideal load is low but capped var model2 = new ClusterModel(application.with(new Status(0.0001, 1.0)), cluster, clock, Duration.ofMinutes(10), - timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock)); + timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock), + ClusterNodesTimeseries.empty()); assertEquals(0.131, model2.idealLoad().cpu(), delta); } @@ -57,13 +59,15 @@ public class ClusterModelTest { // No current traffic: Ideal load is low but capped var model1 = new ClusterModel(application, cluster, clock, Duration.ofMinutes(10), - timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock)); + timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock), + ClusterNodesTimeseries.empty()); assertEquals(0.275, model1.idealLoad().cpu(), delta); // Almost no current traffic: Ideal load is low but capped var model2 = new ClusterModel(application.with(new Status(0.0001, 1.0)), cluster, clock, Duration.ofMinutes(10), - timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0001, t -> 0.0, clock)); + timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0001, t -> 0.0, clock), + ClusterNodesTimeseries.empty()); assertEquals(0.040, model2.idealLoad().cpu(), delta); } |