aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-06-02 09:43:25 +0200
committerJon Bratseth <bratseth@gmail.com>2021-06-02 09:43:25 +0200
commit5bd2c674cb1065d1629953331fc9ecf2bb56ccc2 (patch)
tree0249e828a6bca446126fa384c00825d7292d6943 /node-repository
parent939c9837cdec21fbe78d9740219138981ba025c2 (diff)
Don't read lazily to catch QuestDb errors early
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java20
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java9
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java12
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);
}