diff options
Diffstat (limited to 'node-repository/src')
5 files changed, 22 insertions, 32 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java index e1624183607..fe89ba17469 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.maintenance; +import com.yahoo.config.provision.CloudAccount; import com.yahoo.config.provision.NodeType; import com.yahoo.jdisc.Metric; import com.yahoo.transaction.Mutex; @@ -49,18 +50,15 @@ public class HostResumeProvisioner extends NodeRepositoryMaintainer { NodeList hosts = allNodes.state(Node.State.provisioned).nodeType(NodeType.host, NodeType.confighost, NodeType.controllerhost); int failures = 0; for (Node host : hosts) { - NodeList children = allNodes.childrenOf(host); try { - log.log(Level.INFO, "Provisioning " + host.hostname() + " with " + children.size() + " children"); - HostIpConfig hostIpConfig = hostProvisioner.provision(host, children.asSet()); - setIpConfig(host, children, hostIpConfig); + HostIpConfig hostIpConfig = hostProvisioner.provision(host); + setIpConfig(host, hostIpConfig); } catch (IllegalArgumentException | IllegalStateException e) { - log.log(Level.INFO, "Could not provision " + host.hostname() + " with " + children.size() + " children, will retry in " + + log.log(Level.INFO, "Could not provision " + host.hostname() + ", will retry in " + interval() + ": " + Exceptions.toMessageString(e)); } catch (FatalProvisioningException e) { failures++; - log.log(Level.SEVERE, "Failed to provision " + host.hostname() + " with " + children.size() + - " children, failing out the host recursively", e); + log.log(Level.SEVERE, "Failed to provision " + host.hostname() + ", failing out the host recursively", e); nodeRepository().nodes().failOrMarkRecursively( host.hostname(), Agent.HostResumeProvisioner, "Failed by HostResumeProvisioner due to provisioning failure"); } catch (RuntimeException e) { @@ -75,19 +73,17 @@ public class HostResumeProvisioner extends NodeRepositoryMaintainer { return asSuccessFactorDeviation(hosts.size(), failures); } - private void setIpConfig(Node host, NodeList children, HostIpConfig hostIpConfig) { + private void setIpConfig(Node host, HostIpConfig hostIpConfig) { if (hostIpConfig.isEmpty()) return; - NodeList nodes = NodeList.of(host).and(children); - for (var node : nodes) { - verifyDns(node, hostIpConfig.require(node.hostname())); - } + hostIpConfig.asMap().forEach((hostname, ipConfig) -> + verifyDns(hostname, host.type(), host.cloudAccount(), ipConfig)); nodeRepository().nodes().setIpConfig(hostIpConfig); } /** Verify DNS configuration of given node */ - private void verifyDns(Node node, IP.Config ipConfig) { + private void verifyDns(String hostname, NodeType hostType, CloudAccount cloudAccount, IP.Config ipConfig) { for (String ipAddress : ipConfig.primary()) { - IP.verifyDns(node.hostname(), ipAddress, node.type(), nodeRepository().nameResolver(), node.cloudAccount(), nodeRepository().zone()); + IP.verifyDns(hostname, ipAddress, hostType, nodeRepository().nameResolver(), cloudAccount, nodeRepository().zone()); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java index b10a371e8bd..deaf3054362 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java @@ -373,6 +373,8 @@ public class Nodes { /** Update IP config for nodes in given config */ public void setIpConfig(HostIpConfig hostIpConfig) { + // Ideally this should hold the unallocated lock over the entire method, but unallocated lock must be taken + // after the application lock, making this impossible Predicate<Node> nodeInConfig = (node) -> hostIpConfig.contains(node.hostname()); performOn(nodeInConfig, (node, lock) -> { IP.Config ipConfig = hostIpConfig.require(node.hostname()); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java index 397eb4d7af9..dd838375a59 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java @@ -7,7 +7,6 @@ import com.yahoo.config.provision.NodeAllocationException; import com.yahoo.vespa.hosted.provision.Node; import java.util.List; -import java.util.Set; import java.util.function.Consumer; /** @@ -46,12 +45,11 @@ public interface HostProvisioner { * Continue provisioning of given list of Nodes. * * @param host the host to provision - * @param children list of all the nodes that run on the given host * @return IP config for the provisioned host and its children * @throws FatalProvisioningException if the provisioning has irrecoverably failed and the input nodes * should be deleted from node-repo. */ - HostIpConfig provision(Node host, Set<Node> children) throws FatalProvisioningException; + HostIpConfig provision(Node host) throws FatalProvisioningException; /** * Deprovisions a given host and resources associated with it and its children (such as DNS entries). diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockHostProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockHostProvisioner.java index 3d5987cd04d..bc10a97068e 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockHostProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockHostProvisioner.java @@ -97,15 +97,13 @@ public class MockHostProvisioner implements HostProvisioner { } @Override - public HostIpConfig provision(Node host, Set<Node> children) throws FatalProvisioningException { + public HostIpConfig provision(Node host) throws FatalProvisioningException { if (behaviour(Behaviour.failProvisioning)) throw new FatalProvisioningException("Failed to provision node(s)"); if (host.state() != Node.State.provisioned) throw new IllegalStateException("Host to provision must be in " + Node.State.provisioned); Map<String, IP.Config> result = new HashMap<>(); result.put(host.hostname(), createIpConfig(host)); - for (var child : children) { - if (child.state() != Node.State.reserved) throw new IllegalStateException("Child to provisioned must be in " + Node.State.reserved); - result.put(child.hostname(), createIpConfig(child)); - } + host.ipConfig().pool().hostnames().forEach(hostname -> + result.put(hostname.value(), IP.Config.ofEmptyPool(nameResolver.resolveAll(hostname.value())))); return new HostIpConfig(result); } @@ -199,8 +197,6 @@ public class MockHostProvisioner implements HostProvisioner { return this; } - public Optional<Flavor> getHostFlavor(ClusterSpec.Type type) { return Optional.ofNullable(hostFlavors.get(type)); } - public MockHostProvisioner addEvent(HostEvent event) { hostEvents.add(event); return this; @@ -230,18 +226,17 @@ public class MockHostProvisioner implements HostProvisioner { } public IP.Config createIpConfig(Node node) { - if (!node.type().isHost()) { - return node.ipConfig().withPrimary(nameResolver.resolveAll(node.hostname())); - } + if (!node.type().isHost()) throw new IllegalArgumentException("Node " + node + " is not a host"); int hostIndex = Integer.parseInt(node.hostname().replaceAll("^[a-z]+|-\\d+$", "")); Set<String> addresses = Set.of("::" + hostIndex + ":0"); Set<String> ipAddressPool = new HashSet<>(); if (!behaviour(Behaviour.failDnsUpdate)) { nameResolver.addRecord(node.hostname(), addresses.iterator().next()); - for (int i = 1; i <= 2; i++) { - String ip = "::" + hostIndex + ":" + i; + int i = 1; + for (HostName hostName : node.ipConfig().pool().hostnames()) { + String ip = "::" + hostIndex + ":" + i++; ipAddressPool.add(ip); - nameResolver.addRecord(node.hostname() + "-" + i, ip); + nameResolver.addRecord(hostName.value(), ip); } } IP.Pool pool = node.ipConfig().pool().withIpAddresses(ipAddressPool); @@ -250,7 +245,7 @@ public class MockHostProvisioner implements HostProvisioner { public enum Behaviour { - /** Fail call to {@link MockHostProvisioner#provision(com.yahoo.vespa.hosted.provision.Node, java.util.Set)} */ + /** Fail call to {@link MockHostProvisioner#provision(com.yahoo.vespa.hosted.provision.Node)} */ failProvisioning, /** Fail call to {@link MockHostProvisioner#provisionHosts(HostProvisionRequest, Consumer)} */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNameResolver.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNameResolver.java index 94cb05d20cc..722dc5ef96c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNameResolver.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNameResolver.java @@ -6,7 +6,6 @@ import com.yahoo.vespa.hosted.provision.persistence.NameResolver; import java.net.UnknownHostException; import java.util.Arrays; -import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; |