diff options
author | HÃ¥kon Hallingstad <hakon@verizonmedia.com> | 2020-02-18 23:54:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-18 23:54:41 +0100 |
commit | d6402b3f61e2d3be6b1493810c2d88c332276cee (patch) | |
tree | 1fa0390a3b53428a46cd40c0a9bac603dbe9beea | |
parent | 07466b9a8a8d4b6d61b193893a1ef13bed1f47c0 (diff) | |
parent | d3300578d21fb4481d946fd8964470a828505484 (diff) |
Merge pull request #12253 from vespa-engine/freva/allocate-fully
Allow dynamic provisioning when preprovisioned capacity is not enough
2 files changed, 9 insertions, 7 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 3cb6f848f7b..5753bbb3c5a 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 @@ -62,7 +62,8 @@ public class GroupPreparer { List<Node> surplusActiveNodes, MutableInteger highestIndex, int spareCount, int wantedGroups) { boolean dynamicProvisioningEnabled = hostProvisioner.isPresent() && dynamicProvisioningEnabledFlag .with(FetchVector.Dimension.APPLICATION_ID, application.serializedForm()) - .value() && preprovisionCapacityFlag.value().isEmpty(); + .value(); + boolean allocateFully = dynamicProvisioningEnabled && preprovisionCapacityFlag.value().isEmpty(); try (Mutex lock = nodeRepository.lock(application)) { @@ -73,7 +74,7 @@ public class GroupPreparer { LockedNodeList nodeList = nodeRepository.list(allocationLock); NodePrioritizer prioritizer = new NodePrioritizer(nodeList, application, cluster, requestedNodes, spareCount, wantedGroups, nodeRepository.nameResolver(), - hostResourcesCalculator, dynamicProvisioningEnabled); + hostResourcesCalculator, allocateFully); prioritizer.addApplicationNodes(); prioritizer.addSurplusNodes(surplusActiveNodes); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java index a0e9141f753..1ef23209369 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java @@ -46,13 +46,14 @@ public class NodePrioritizer { private final boolean isDocker; private final boolean isAllocatingForReplacement; private final boolean isTopologyChange; - private final boolean dynamicProvisioningEnabled; + /** If set, a host can only have nodes by single tenant and does not allow in-place resizing. */ + private final boolean allocateFully; private final int currentClusterSize; private final Set<Node> spareHosts; NodePrioritizer(LockedNodeList allNodes, ApplicationId application, ClusterSpec clusterSpec, NodeSpec nodeSpec, int spares, int wantedGroups, NameResolver nameResolver, HostResourcesCalculator hostResourcesCalculator, - boolean dynamicProvisioningEnabled) { + boolean allocateFully) { this.allNodes = allNodes; this.capacity = new DockerHostCapacity(allNodes, hostResourcesCalculator); this.requestedNodes = nodeSpec; @@ -60,7 +61,7 @@ public class NodePrioritizer { this.application = application; this.nameResolver = nameResolver; this.spareHosts = findSpareHosts(allNodes, capacity, spares); - this.dynamicProvisioningEnabled = dynamicProvisioningEnabled; + this.allocateFully = allocateFully; NodeList nodesInCluster = allNodes.owner(application).type(clusterSpec.type()).cluster(clusterSpec.id()); NodeList nonRetiredNodesInCluster = nodesInCluster.not().retired(); @@ -125,7 +126,7 @@ public class NodePrioritizer { .filter(node -> node.type() != NodeType.host || ALLOCATABLE_HOST_STATES.contains(node.state())) .filter(node -> node.reservedTo().isEmpty() || node.reservedTo().get().equals(application.tenant())); - if (dynamicProvisioningEnabled) { + if (allocateFully) { Set<String> candidateHostnames = candidates.asList().stream() .filter(node -> node.type() == NodeType.tenant) .filter(node -> node.allocation() @@ -213,7 +214,7 @@ public class NodePrioritizer { builder.parent(parent).freeParentCapacity(parentCapacity); if (!isNewNode) - builder.resizable(!dynamicProvisioningEnabled && requestedNodes.canResize( + builder.resizable(!allocateFully && requestedNodes.canResize( node.flavor().resources(), parentCapacity, isTopologyChange, currentClusterSize)); if (spareHosts.contains(parent)) |