summaryrefslogtreecommitdiffstats
path: root/node-repository/src
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-03-18 10:33:48 +0100
committerJon Bratseth <bratseth@gmail.com>2021-03-18 10:33:48 +0100
commitdbf0540edf8bdb98f6646a697959287c598b9908 (patch)
tree113e11fc64ef1528eb443a26b86ec9d68c48e91d /node-repository/src
parent99f2cdcefeecf6a1254c021a72c475905216fc37 (diff)
Add ClusterModel
Diffstat (limited to 'node-repository/src')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java17
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java56
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java2
3 files changed, 59 insertions, 16 deletions
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 ac3430fecf9..eba5e968534 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
@@ -59,7 +59,8 @@ public class Autoscaler {
}
private Advice autoscale(Application application, Cluster cluster, NodeList clusterNodes, Limits limits) {
- if ( ! stable(clusterNodes, nodeRepository))
+ ClusterModel clusterModel = new ClusterModel(application, cluster, clusterNodes, metricsDb, nodeRepository);
+ if ( ! clusterModel.isStable())
return Advice.none("Cluster change in progress");
Duration scalingWindow = cluster.scalingDuration(clusterNodes.clusterSpec());
@@ -143,20 +144,6 @@ public class Autoscaler {
return (int)minimumMeasurements;
}
- public static boolean stable(NodeList nodes, NodeRepository nodeRepository) {
- // The cluster is processing recent changes
- if (nodes.stream().anyMatch(node -> node.status().wantToRetire() ||
- node.allocation().get().membership().retired() ||
- node.allocation().get().isRemovable()))
- return false;
-
- // A deployment is ongoing
- if (nodeRepository.nodes().list(Node.State.reserved).owner(nodes.first().get().allocation().get().owner()).size() > 0)
- return false;
-
- return true;
- }
-
public static class Advice {
private final boolean present;
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
new file mode 100644
index 00000000000..ead0c403ff3
--- /dev/null
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java
@@ -0,0 +1,56 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.provision.autoscale;
+
+import com.yahoo.vespa.hosted.provision.Node;
+import com.yahoo.vespa.hosted.provision.NodeList;
+import com.yahoo.vespa.hosted.provision.NodeRepository;
+import com.yahoo.vespa.hosted.provision.applications.Application;
+import com.yahoo.vespa.hosted.provision.applications.Cluster;
+
+/**
+ * A cluster with its associated metrics which allows prediction about its future behavior.
+ * For single-threaded, short-term usage.
+ *
+ * @author bratseth
+ */
+public class ClusterModel {
+
+ private final Application application;
+ private final Cluster cluster;
+ private final NodeList nodes;
+ private final MetricsDb metricsDb;
+ private final NodeRepository nodeRepository;
+
+ public ClusterModel(Application application,
+ Cluster cluster,
+ NodeList clusterNodes,
+ MetricsDb metricsDb,
+ NodeRepository nodeRepository) {
+ this.application = application;
+ this.cluster = cluster;
+ this.nodes = clusterNodes;
+ this.metricsDb = metricsDb;
+ this.nodeRepository = nodeRepository;
+ }
+
+ public boolean isStable() {
+ return isStable(nodes, nodeRepository);
+ }
+
+ public static boolean isStable(NodeList clusterNodes, NodeRepository nodeRepository) {
+ // The cluster is processing recent changes
+ if (clusterNodes.stream().anyMatch(node -> node.status().wantToRetire() ||
+ node.allocation().get().membership().retired() ||
+ node.allocation().get().isRemovable()))
+ return false;
+
+ // A deployment is ongoing
+ if (nodeRepository.nodes().list(Node.State.reserved).owner(clusterNodes.first().get().allocation().get().owner()).size() > 0)
+ return false;
+
+ return true;
+ }
+
+
+
+}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java
index c8de94eeab8..b6208cedc5e 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java
@@ -103,7 +103,7 @@ public class MetricsResponse {
private boolean clusterIsStable(Node node, NodeList applicationNodes, NodeRepository nodeRepository) {
ClusterSpec cluster = node.allocation().get().membership().cluster();
- return Autoscaler.stable(applicationNodes.cluster(cluster.id()), nodeRepository);
+ return ClusterModel.isStable(applicationNodes.cluster(cluster.id()), nodeRepository);
}
public static MetricsResponse empty() { return new MetricsResponse(List.of()); }