diff options
author | jonmv <venstad@gmail.com> | 2023-06-27 17:11:18 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2023-06-27 17:11:18 +0200 |
commit | 4bda3a54b117c3db67139d21a7ab69a8b2ad020f (patch) | |
tree | d93e84b0fdf34f6666b9113fd7f88bcf6a45cc23 | |
parent | 06a0d7ea5218ad469d41ae287b6303b978de4342 (diff) |
Take all involved locks when updating IP config
2 files changed, 11 insertions, 12 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 fe89ba17469..039e40a3204 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 @@ -7,6 +7,7 @@ import com.yahoo.jdisc.Metric; import com.yahoo.transaction.Mutex; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; +import com.yahoo.vespa.hosted.provision.NodeMutex; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.IP; @@ -17,6 +18,8 @@ import com.yahoo.yolean.Exceptions; import javax.naming.NamingException; import java.time.Duration; +import java.util.ArrayList; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -77,7 +80,14 @@ public class HostResumeProvisioner extends NodeRepositoryMaintainer { if (hostIpConfig.isEmpty()) return; hostIpConfig.asMap().forEach((hostname, ipConfig) -> verifyDns(hostname, host.type(), host.cloudAccount(), ipConfig)); - nodeRepository().nodes().setIpConfig(hostIpConfig); + + nodeRepository().nodes().performOnRecursively(NodeList.of(host), __ -> true, nodes -> { + List<Node> updated = new ArrayList<>(); + for (NodeMutex node : nodes.nodes().nodes()) + updated.add(nodeRepository().nodes().write(node.node().with(hostIpConfig.require(node.node().hostname())), node)); + + return updated; + }); } /** Verify DNS configuration of given node */ 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 b5a8c506c7b..7ac027afbf8 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 @@ -377,17 +377,6 @@ 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()); - return write(node.with(ipConfig), lock); - }); - } - /** * Parks this node and returns it in its new state. * |