diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-03-18 10:33:48 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-03-18 10:33:48 +0100 |
commit | dbf0540edf8bdb98f6646a697959287c598b9908 (patch) | |
tree | 113e11fc64ef1528eb443a26b86ec9d68c48e91d /node-repository | |
parent | 99f2cdcefeecf6a1254c021a72c475905216fc37 (diff) |
Add ClusterModel
Diffstat (limited to 'node-repository')
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()); } |