aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com/yahoo/vespa
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2024-02-29 10:31:39 +0100
committerMartin Polden <mpolden@mpolden.no>2024-02-29 10:34:34 +0100
commit8f05dd4627db3b49b8515aa68b7a4f0f872c3b3a (patch)
tree5255532576b844850a411a89775e0abbe5580a80 /node-repository/src/main/java/com/yahoo/vespa
parent83096e38fcfdf9fa8af28cd0de7dd8183ddf13e9 (diff)
Ensure that combined load balancer is not expired too early
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java10
3 files changed, 17 insertions, 11 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java
index f8de6e1db16..0135f89c47e 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java
@@ -1,6 +1,7 @@
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.lb;
+import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.vespa.applicationmodel.InfrastructureApplication;
import com.yahoo.vespa.hosted.provision.maintenance.LoadBalancerExpirer;
@@ -79,6 +80,11 @@ public class LoadBalancer {
return new LoadBalancer(id, idSeed, Optional.of(instance), state, changedAt);
}
+ /** Returns the effective container ID of given cluster. For combined clusters this returns the ID of the container cluster */
+ public static ClusterSpec.Id containerId(ClusterSpec cluster) {
+ return cluster.combinedId().orElse(cluster.id());
+ }
+
public enum State {
/** The load balancer has been provisioned and reserved for an application */
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
index 105928c503e..3eb26c83a44 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
@@ -160,10 +160,14 @@ public class LoadBalancerExpirer extends NodeRepositoryMaintainer {
private List<Node> allocatedNodes(LoadBalancerId loadBalancer) {
return nodeRepository().nodes()
- .list(Node.State.active, Node.State.inactive, Node.State.reserved)
- .owner(loadBalancer.application())
- .cluster(loadBalancer.cluster())
- .asList();
+ .list(Node.State.active, Node.State.inactive, Node.State.reserved)
+ .owner(loadBalancer.application())
+ // Always match the cluster by the effective container ID
+ // TODO(mpolden): Remove this and use NodeList::cluster once combined disappears in Vespa 9
+ .matching((node) -> node.allocation().isPresent() &&
+ LoadBalancer.containerId(node.allocation().get().membership().cluster())
+ .equals(loadBalancer.cluster()))
+ .asList();
}
}
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 239b962360b..022c00693c2 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
@@ -101,7 +101,7 @@ public class LoadBalancerProvisioner {
public void prepare(ApplicationId application, ClusterSpec cluster, NodeSpec requested) {
if (!shouldProvision(application, requested.type(), cluster.type())) return;
try (var lock = db.lock(application)) {
- ClusterSpec.Id clusterId = effectiveId(cluster);
+ ClusterSpec.Id clusterId = LoadBalancer.containerId(cluster);
LoadBalancerId loadBalancerId = requireNonClashing(new LoadBalancerId(application, clusterId));
prepare(loadBalancerId, cluster.zoneEndpoint(), requested);
}
@@ -121,7 +121,7 @@ public class LoadBalancerProvisioner {
Map<ClusterSpec.Id, ZoneEndpoint> activatingClusters = clusters.stream()
// .collect(Collectors.toMap(ClusterSpec::id, ClusterSpec::zoneEndpoint));
// TODO: this dies with combined clusters
- .collect(groupingBy(LoadBalancerProvisioner::effectiveId,
+ .collect(groupingBy(LoadBalancer::containerId,
reducing(ZoneEndpoint.defaultEndpoint,
ClusterSpec::zoneEndpoint,
(o, n) -> o.isDefault() ? n : o)));
@@ -391,7 +391,7 @@ public class LoadBalancerProvisioner {
} else {
nodes = nodes.nodeType(NodeType.tenant).container();
}
- return nodes.groupingBy(node -> effectiveId(node.allocation().get().membership().cluster()));
+ return nodes.groupingBy(node -> LoadBalancer.containerId(node.allocation().get().membership().cluster()));
}
/** Returns real servers for given nodes */
@@ -436,8 +436,4 @@ public class LoadBalancerProvisioner {
return reachable;
}
- private static ClusterSpec.Id effectiveId(ClusterSpec cluster) {
- return cluster.combinedId().orElse(cluster.id());
- }
-
}