summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-09-30 11:20:49 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-09-30 11:20:49 +0200
commit9d768c33c6a66f393978cd3119bef0a2e4db5f69 (patch)
treeca814c57fd18ea634fe5a9fd1abaa918b8ffeec6 /node-repository
parentb353bc0de2c09598cf16c3b28f05caa10619837d (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.java25
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));