summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2023-06-27 17:53:41 +0200
committerGitHub <noreply@github.com>2023-06-27 17:53:41 +0200
commit7edae58d1bb02d21a86604a45012634aa1588855 (patch)
treed93e84b0fdf34f6666b9113fd7f88bcf6a45cc23
parentba76ac718571412b22662a8429fa8b31510d48a2 (diff)
parent4bda3a54b117c3db67139d21a7ab69a8b2ad020f (diff)
Merge pull request #27561 from vespa-engine/jonmv/misc-3
Greatly reduce lock acquisitions MERGEOK
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java2
-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.java13
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())