diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2023-06-27 17:53:41 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-27 17:53:41 +0200 |
commit | 7edae58d1bb02d21a86604a45012634aa1588855 (patch) | |
tree | d93e84b0fdf34f6666b9113fd7f88bcf6a45cc23 | |
parent | ba76ac718571412b22662a8429fa8b31510d48a2 (diff) | |
parent | 4bda3a54b117c3db67139d21a7ab69a8b2ad020f (diff) |
Merge pull request #27561 from vespa-engine/jonmv/misc-3
Greatly reduce lock acquisitions MERGEOK
3 files changed, 13 insertions, 14 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java index cb0a8005e87..4f2201adba0 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java @@ -76,7 +76,7 @@ public class FailedExpirer extends NodeRepositoryMaintainer { isExpired, (node, lock) -> recycle(node, List.of(), allNodes).get()); - nodeRepository.nodes().performOnRecursively(allNodes.nodeType(NodeType.host), + nodeRepository.nodes().performOnRecursively(allNodes.nodeType(NodeType.host).matching(isExpired), nodes -> isExpired.test(nodes.parent().node()), nodes -> recycle(nodes.parent().node(), nodes.children().stream().map(NodeMutex::node).toList(), 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 d3ea1a3def7..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. * @@ -745,7 +734,7 @@ public class Nodes { public List<Node> performOn(NodeList nodes, Predicate<Node> filter, BiFunction<Node, Mutex, Node> action) { List<Node> resultingNodes = new ArrayList<>(); - nodes.stream().collect(groupingBy(Nodes::applicationIdForLock)) + nodes.matching(filter).stream().collect(groupingBy(Nodes::applicationIdForLock)) .forEach((applicationId, nodeList) -> { // Grouped only to reduce number of lock acquire/release cycles. try (NodeMutexes locked = lockAndGetAll(nodeList, Optional.empty())) { for (NodeMutex node : locked.nodes()) |