aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-02-16 12:46:53 +0100
committerMartin Polden <mpolden@mpolden.no>2023-02-16 13:30:50 +0100
commitbcdedc66632ebb40a96047d33d656e9290e16a6d (patch)
tree70a037256061e8806526bf5f5f58a2f2e0e23f50 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java
parent4b627f0a674e2207fa2a710b5bc2326fc9b98145 (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.java43
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);
}
}
+
}