diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-30 11:20:49 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-30 11:20:49 +0200 |
commit | 9d768c33c6a66f393978cd3119bef0a2e4db5f69 (patch) | |
tree | ca814c57fd18ea634fe5a9fd1abaa918b8ffeec6 /node-repository | |
parent | b353bc0de2c09598cf16c3b28f05caa10619837d (diff) |
Refactor to separate happy and hard path.
Diffstat (limited to 'node-repository')
-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)); |