diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-02-01 13:56:33 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-02-01 14:01:39 +0100 |
commit | 9b7405f9abc8e8be12d092ae785b59fb91b249bf (patch) | |
tree | f5a3968f9bd6f25668d8a355926171a2a9d57b2e /node-repository/src/main | |
parent | bd05e78a364b6f1d0a4f5ba8088e1ec1ee02a463 (diff) |
Configure load balancer with nodes that will become active
Diffstat (limited to 'node-repository/src/main')
4 files changed, 25 insertions, 21 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerList.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerList.java index ad5bf1a2962..3e7da831bc4 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerList.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerList.java @@ -2,6 +2,8 @@ package com.yahoo.vespa.hosted.provision.lb; import com.yahoo.collections.AbstractFilteringList; +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.ClusterSpec; import java.util.Collection; @@ -21,6 +23,16 @@ public class LoadBalancerList extends AbstractFilteringList<LoadBalancer, LoadBa return matching(lb -> lb.state() == state); } + /** Returns the subset of load balancers in given cluster */ + public LoadBalancerList application(ApplicationId application) { + return matching(lb -> lb.id().application().equals(application)); + } + + /** Returns the subset of load balancers in given cluster */ + public LoadBalancerList cluster(ClusterSpec.Id cluster) { + return matching(lb -> lb.id().cluster().equals(cluster)); + } + public static LoadBalancerList copyOf(Collection<LoadBalancer> loadBalancers) { return new LoadBalancerList(loadBalancers, false); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancers.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancers.java index d2c1aab72e2..7cbb8ef2764 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancers.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancers.java @@ -2,20 +2,9 @@ package com.yahoo.vespa.hosted.provision.lb; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.NodeType; -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.node.NodeAcl; import com.yahoo.vespa.hosted.provision.persistence.CuratorDatabaseClient; -import java.util.Comparator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * The load balancers of this node repo. diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java index 8c358301b85..3da0506f2e1 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java @@ -45,8 +45,8 @@ class Activator { /** Activate required resources for application guarded by given lock */ public void activate(Collection<HostSpec> hosts, long generation, ApplicationTransaction transaction) { - activateNodes(hosts, generation, transaction); - activateLoadBalancers(hosts, transaction); + NodeList newActive = activateNodes(hosts, generation, transaction); + activateLoadBalancers(hosts, newActive, transaction); } /** @@ -62,8 +62,9 @@ class Activator { * @param generation the application config generation that is activated * @param transaction transaction with operations to commit together with any operations done within the repository, * while holding the node repository lock on this application + * @return the nodes that will be active when transaction is committed */ - private void activateNodes(Collection<HostSpec> hosts, long generation, ApplicationTransaction transaction) { + private NodeList activateNodes(Collection<HostSpec> hosts, long generation, ApplicationTransaction transaction) { Instant activationTime = nodeRepository.clock().instant(); // Use one timestamp for all activation changes ApplicationId application = transaction.application(); Set<String> hostnames = hosts.stream().map(HostSpec::hostname).collect(Collectors.toSet()); @@ -95,6 +96,7 @@ class Activator { oldActive.not().retired(), newActive.not().retired()); unreserveParentsOf(reserved); + return newActive; } private void deactivate(NodeList toDeactivate, ApplicationTransaction transaction) { @@ -149,8 +151,8 @@ class Activator { } /** Activate load balancers */ - private void activateLoadBalancers(Collection<HostSpec> hosts, ApplicationTransaction transaction) { - loadBalancerProvisioner.ifPresent(provisioner -> provisioner.activate(allClustersOf(hosts), transaction)); + private void activateLoadBalancers(Collection<HostSpec> hosts, NodeList newActive, ApplicationTransaction transaction) { + loadBalancerProvisioner.ifPresent(provisioner -> provisioner.activate(allClustersOf(hosts), newActive, transaction)); } private static Set<ClusterSpec> allClustersOf(Collection<HostSpec> hosts) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java index 5ff78c53f8a..04f084dd079 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java @@ -100,11 +100,11 @@ public class LoadBalancerProvisioner { * * Calling this when no load balancer has been prepared for given cluster is a no-op. */ - public void activate(Set<ClusterSpec> clusters, ApplicationTransaction transaction) { + public void activate(Set<ClusterSpec> clusters, NodeList newActive, ApplicationTransaction transaction) { Set<ClusterSpec.Id> activatingClusters = clusters.stream() .map(LoadBalancerProvisioner::effectiveId) .collect(Collectors.toSet()); - for (var cluster : loadBalancedClustersOf(transaction.application()).entrySet()) { + for (var cluster : loadBalancedClustersOf(newActive).entrySet()) { if (!activatingClusters.contains(cluster.getKey())) continue; Node clusterNode = cluster.getValue().first().get(); @@ -232,12 +232,13 @@ public class LoadBalancerProvisioner { /** Returns the nodes allocated to the given load balanced cluster */ private NodeList nodesOf(ClusterSpec.Id loadBalancedCluster, ApplicationId application) { - return loadBalancedClustersOf(application).getOrDefault(loadBalancedCluster, NodeList.copyOf(List.of())); + NodeList nodes = nodeRepository.nodes().list(Node.State.reserved, Node.State.active) + .owner(application); + return loadBalancedClustersOf(nodes).getOrDefault(loadBalancedCluster, NodeList.of()); } /** Returns the load balanced clusters of given application and their nodes */ - private Map<ClusterSpec.Id, NodeList> loadBalancedClustersOf(ApplicationId application) { - NodeList nodes = nodeRepository.nodes().list(Node.State.reserved, Node.State.active).owner(application); + private Map<ClusterSpec.Id, NodeList> loadBalancedClustersOf(NodeList nodes) { if (nodes.stream().anyMatch(node -> node.type() == NodeType.config)) { nodes = nodes.nodeType(NodeType.config).type(ClusterSpec.Type.admin); } else if (nodes.stream().anyMatch(node -> node.type() == NodeType.controller)) { |