aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@yahooinc.com>2022-10-28 09:23:05 +0200
committerValerij Fredriksen <valerijf@yahooinc.com>2022-10-28 09:23:05 +0200
commit06d211efbaebe41dc81b578b877c7c98ffe7844d (patch)
tree56626bdab6e834be169df89df1dfc1b256d7b667 /node-repository
parent91c413344ac3238405a5d05d982645c684131f9a (diff)
Take correct lock in Nodes::performOn
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java32
1 files changed, 19 insertions, 13 deletions
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 50933951a5f..a271dfe571e 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
@@ -710,8 +710,9 @@ public class Nodes {
// Group matching nodes by the lock needed
for (Node node : nodes) {
- if (node.allocation().isPresent())
- allocatedNodes.put(node.allocation().get().owner(), node);
+ Optional<ApplicationId> applicationId = applicationIdForLock(node);
+ if (applicationId.isPresent())
+ allocatedNodes.put(applicationId.get(), node);
else
unallocatedNodes.add(node);
}
@@ -833,16 +834,7 @@ public class Nodes {
}
private Mutex lock(Node node, Optional<Duration> timeout) {
- Optional<ApplicationId> application = switch (node.type()) {
- case tenant -> node.allocation().map(Allocation::owner);
- case host -> Optional.of(InfrastructureApplication.TENANT_HOST.id());
- case config -> Optional.of(InfrastructureApplication.CONFIG_SERVER.id());
- case confighost -> Optional.of(InfrastructureApplication.CONFIG_SERVER_HOST.id());
- case controller -> Optional.of(InfrastructureApplication.CONTROLLER.id());
- case controllerhost -> Optional.of(InfrastructureApplication.CONTROLLER_HOST.id());
- case proxy -> Optional.of(InfrastructureApplication.PROXY.id());
- case proxyhost -> Optional.of(InfrastructureApplication.PROXY_HOST.id());
- };
+ Optional<ApplicationId> application = applicationIdForLock(node);
if (application.isPresent())
return timeout.map(t -> applications.lock(application.get(), t))
.orElseGet(() -> applications.lock(application.get()));
@@ -854,7 +846,21 @@ public class Nodes {
return node(hostname).orElseThrow(() -> new NoSuchNodeException("No node with hostname '" + hostname + "'"));
}
- private void illegal(String message) {
+ /** Returns the application ID that should be used for locking when modifying this node */
+ private static Optional<ApplicationId> applicationIdForLock(Node node) {
+ return switch (node.type()) {
+ case tenant -> node.allocation().map(Allocation::owner);
+ case host -> Optional.of(InfrastructureApplication.TENANT_HOST.id());
+ case config -> Optional.of(InfrastructureApplication.CONFIG_SERVER.id());
+ case confighost -> Optional.of(InfrastructureApplication.CONFIG_SERVER_HOST.id());
+ case controller -> Optional.of(InfrastructureApplication.CONTROLLER.id());
+ case controllerhost -> Optional.of(InfrastructureApplication.CONTROLLER_HOST.id());
+ case proxy -> Optional.of(InfrastructureApplication.PROXY.id());
+ case proxyhost -> Optional.of(InfrastructureApplication.PROXY_HOST.id());
+ };
+ }
+
+ private static void illegal(String message) {
throw new IllegalArgumentException(message);
}