diff options
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java index 1aa6c2603ad..35fc02d7e5d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java @@ -55,20 +55,23 @@ public class GroupPreparer { List<Node> surplusActiveNodes, NodeIndices indices, int wantedGroups) { // Try preparing in memory without global unallocated lock. Most of the time there should be no changes and we // can return nodes previously allocated. - { - NodesAndHosts<LockedNodeList> allNodesAndHosts = NodesAndHosts.create(nodeRepository.nodes().list(PROBE_LOCK)); - NodeAllocation probeAllocation = prepareAllocation(application, cluster, requestedNodes, surplusActiveNodes, - indices::probeNext, wantedGroups, allNodesAndHosts); - if (probeAllocation.fulfilledAndNoChanges()) { - List<Node> acceptedNodes = probeAllocation.finalNodes(); - surplusActiveNodes.removeAll(acceptedNodes); - indices.commitProbe(); - return acceptedNodes; - } + NodesAndHosts<LockedNodeList> allNodesAndHosts = NodesAndHosts.create(nodeRepository.nodes().list(PROBE_LOCK)); + NodeAllocation probeAllocation = prepareAllocation(application, cluster, requestedNodes, surplusActiveNodes, + indices::probeNext, wantedGroups, allNodesAndHosts); + if (probeAllocation.fulfilledAndNoChanges()) { + List<Node> acceptedNodes = probeAllocation.finalNodes(); + surplusActiveNodes.removeAll(acceptedNodes); + indices.commitProbe(); + return acceptedNodes; + } else { + // There were some changes, so re-do the allocation with locks indices.resetProbe(); + return prepareWithLocks(application, cluster, requestedNodes, surplusActiveNodes, indices, wantedGroups); } + } - // There were some changes, so re-do the allocation with locks + private List<Node> prepareWithLocks(ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes, + List<Node> surplusActiveNodes, NodeIndices indices, int wantedGroups) { try (Mutex lock = nodeRepository.nodes().lock(application); Mutex allocationLock = nodeRepository.nodes().lockUnallocated()) { NodesAndHosts<LockedNodeList> allNodesAndHosts = NodesAndHosts.create(nodeRepository.nodes().list(allocationLock)); |