diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-02-16 12:46:53 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-02-16 13:30:50 +0100 |
commit | bcdedc66632ebb40a96047d33d656e9290e16a6d (patch) | |
tree | 70a037256061e8806526bf5f5f58a2f2e0e23f50 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java | |
parent | 4b627f0a674e2207fa2a710b5bc2326fc9b98145 (diff) |
Lock node when updating IP config
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java')
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java | 43 |
1 files changed, 19 insertions, 24 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 c606ede05d1..86c5a926900 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 @@ -9,17 +9,14 @@ import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.IP; import com.yahoo.vespa.hosted.provision.provisioning.FatalProvisioningException; +import com.yahoo.vespa.hosted.provision.provisioning.HostIpConfig; import com.yahoo.vespa.hosted.provision.provisioning.HostProvisioner; import com.yahoo.yolean.Exceptions; import javax.naming.NamingException; import java.time.Duration; -import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Collectors; /** * Resumes provisioning (requests additional IP addresses, updates DNS when IPs are ready) of hosts in state provisioned @@ -41,23 +38,13 @@ public class HostResumeProvisioner extends NodeRepositoryMaintainer { @Override protected double maintain() { NodeList allNodes = nodeRepository().nodes().list(); - Map<String, Set<Node>> nodesByProvisionedParentHostname = - allNodes.nodeType(NodeType.tenant, NodeType.config, NodeType.controller) - .asList() - .stream() - .filter(node -> node.parentHostname().isPresent()) - .collect(Collectors.groupingBy(node -> node.parentHostname().get(), Collectors.toSet())); - NodeList hosts = allNodes.state(Node.State.provisioned).nodeType(NodeType.host, NodeType.confighost, NodeType.controllerhost); int failures = 0; for (Node host : hosts) { - Set<Node> children = nodesByProvisionedParentHostname.getOrDefault(host.hostname(), Set.of()); - // This doesn't actually require unallocated lock, but that is much easier than simultaneously holding - // the application locks of the host and all it's children. - try (var lock = nodeRepository().nodes().lockUnallocated()) { - List<Node> updatedNodes = hostProvisioner.provision(host, children); - verifyDns(updatedNodes); - nodeRepository().nodes().write(updatedNodes, lock); + NodeList children = allNodes.childrenOf(host); + try { + HostIpConfig hostIpConfig = hostProvisioner.provision(host, children.asSet()); + setIpConfig(host, children, hostIpConfig); } catch (IllegalArgumentException | IllegalStateException e) { log.log(Level.INFO, "Could not provision " + host.hostname() + " with " + children.size() + " children, will retry in " + interval() + ": " + Exceptions.toMessageString(e)); @@ -79,13 +66,21 @@ public class HostResumeProvisioner extends NodeRepositoryMaintainer { return asSuccessFactor(hosts.size(), failures); } - /** Verify DNS configuration of given nodes */ - private void verifyDns(List<Node> nodes) { + private void setIpConfig(Node host, NodeList children, HostIpConfig hostIpConfig) { + if (hostIpConfig.isEmpty()) return; + NodeList nodes = NodeList.of(host).and(children); for (var node : nodes) { - boolean enclave = node.cloudAccount().isEnclave(nodeRepository().zone()); - for (var ipAddress : node.ipConfig().primary()) { - IP.verifyDns(node.hostname(), ipAddress, nodeRepository().nameResolver(), !enclave); - } + verifyDns(node, hostIpConfig.require(node.hostname())); + } + nodeRepository().nodes().setIpConfig(hostIpConfig); + } + + /** Verify DNS configuration of given node */ + private void verifyDns(Node node, IP.Config ipConfig) { + boolean enclave = node.cloudAccount().isEnclave(nodeRepository().zone()); + for (var ipAddress : ipConfig.primary()) { + IP.verifyDns(node.hostname(), ipAddress, nodeRepository().nameResolver(), !enclave); } } + } |