From 98a5dfaeddf986a7edf6fa380ec9334ff45079fb Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Tue, 10 Sep 2024 10:44:47 +0300 Subject: [PATCH] Consider application dimension in HostRenamer --- .../provision/maintenance/HostRenamer.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostRenamer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostRenamer.java index cf0d585de081..50f38bac90fa 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostRenamer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostRenamer.java @@ -14,8 +14,10 @@ import java.time.Duration; import java.util.Collections; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import java.util.logging.Logger; +import java.util.stream.Collectors; /** * @author mpolden @@ -35,13 +37,12 @@ public HostRenamer(NodeRepository nodeRepository, Duration interval, Metric metr protected double maintain() { if (!nodeRepository().nodes().isWorking()) return 0.0; NodeList allNodes = nodeRepository().nodes().list(); - String hostnameScheme = hostnameSchemeFlag.value(); NodeList activeHosts = allNodes.nodeType(NodeType.host).state(Node.State.active); Set retiringApplications = applicationsOnRetiringHosts(activeHosts, allNodes); for (var host : activeHosts) { - if (!changeHostname(host, hostnameScheme)) continue; - Set applicationsOnHost = applicationsOn(host, allNodes); + if (!changeHostname(host, applicationsOnHost)) continue; + if (Collections.disjoint(retiringApplications, applicationsOnHost)) { LOG.info("Deprovisioning " + host + " to change its hostname"); nodeRepository().nodes().deprovision(host.hostname(), Agent.system, nodeRepository().clock().instant()); @@ -67,8 +68,19 @@ private Set applicationsOnRetiringHosts(NodeList activeHosts, Nod return applications; } - private static boolean changeHostname(Node node, String wantedScheme) { - return !node.hostname().endsWith(".vespa-cloud.net") && "standard".equals(wantedScheme); + private boolean changeHostname(Node node, Set instances) { + if (node.hostname().endsWith(".vespa-cloud.net")) { + return false; + } + Set wantedSchemes; + if (instances.isEmpty()) { + wantedSchemes = Set.of(hostnameSchemeFlag.value()); + } else { + wantedSchemes = instances.stream() + .map(instance -> hostnameSchemeFlag.withApplicationId(Optional.of(instance)).value()) + .collect(Collectors.toSet()); + } + return wantedSchemes.size() == 1 && wantedSchemes.iterator().next().equals("standard"); } }