diff options
author | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-11-03 16:30:33 +0100 |
---|---|---|
committer | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-11-03 16:30:33 +0100 |
commit | 4c38bd7e0ce585b5f5b5c18f65bb9ef5bcfd0eef (patch) | |
tree | bc5784ffef3461a2f96c4863a87391bebade1dcd /node-repository/src/main/java | |
parent | 7aeafb73e4470d45ba148c59114d002b2ff4642f (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.java | 21 |
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; } |