summaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@yahooinc.com>2022-11-03 16:30:33 +0100
committerValerij Fredriksen <valerijf@yahooinc.com>2022-11-03 16:30:33 +0100
commit4c38bd7e0ce585b5f5b5c18f65bb9ef5bcfd0eef (patch)
treebc5784ffef3461a2f96c4863a87391bebade1dcd /node-repository/src/main/java
parent7aeafb73e4470d45ba148c59114d002b2ff4642f (diff)
Do not take application lock(s) after unallocated lock
Diffstat (limited to 'node-repository/src/main/java')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java21
1 files changed, 11 insertions, 10 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 da9329747b4..230d646699d 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
@@ -659,18 +659,19 @@ public class Nodes {
boolean wantToRetire = op.needsRetirement();
List<Node> result = new ArrayList<>();
try (NodeMutex lock = nodeMutex.get(); Mutex allocationLock = lockUnallocated()) {
- // This takes allocationLock to prevent any further allocation of nodes on this host
- host = lock.node();
- if (wantToRetire) { // Apply recursively if we're retiring
- List<Node> updatedNodes = performOn(list(allocationLock).childrenOf(host), (node, nodeLock) -> {
- Node newNode = node.withWantToRetire(wantToRetire, wantToDeprovision, wantToRebuild, agent, instant);
- return write(newNode, nodeLock);
- });
- result.addAll(updatedNodes);
- }
- Node newHost = host.withWantToRetire(wantToRetire, wantToDeprovision, wantToRebuild, agent, instant);
+ // Modify parent with wantToRetire while holding the allocationLock to prevent
+ // any further allocation of nodes on this host
+ Node newHost = lock.node().withWantToRetire(wantToRetire, wantToDeprovision, wantToRebuild, agent, instant);
result.add(write(newHost, lock));
}
+
+ if (wantToRetire) { // Apply recursively if we're retiring
+ List<Node> updatedNodes = performOn(list().childrenOf(host), (node, nodeLock) -> {
+ Node newNode = node.withWantToRetire(wantToRetire, wantToDeprovision, wantToRebuild, agent, instant);
+ return write(newNode, nodeLock);
+ });
+ result.addAll(updatedNodes);
+ }
return result;
}