aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2023-06-27 17:11:18 +0200
committerjonmv <venstad@gmail.com>2023-06-27 17:11:18 +0200
commit4bda3a54b117c3db67139d21a7ab69a8b2ad020f (patch)
treed93e84b0fdf34f6666b9113fd7f88bcf6a45cc23
parent06a0d7ea5218ad469d41ae287b6303b978de4342 (diff)
Take all involved locks when updating IP config
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostResumeProvisioner.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java11
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.
*