diff options
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java')
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java | 70 |
1 files changed, 35 insertions, 35 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java index 23065055228..e2f1b7358cf 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java @@ -85,42 +85,41 @@ public class NodeRepositoryProvisioner implements Provisioner { public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity requested, ProvisionLogger logger) { log.log(Level.FINE, "Received deploy prepare request for " + requested + " for application " + application + ", cluster " + cluster); - var params = AllocationParams.from(nodeRepository, application, cluster, cluster.vespaVersion()); - validate(params, requested, logger); - - params = params.with(cluster.withExclusivity(capacityPolicies.decideExclusivity(requested, cluster))); + validate(application, cluster, requested, logger); NodeResources resources; NodeSpec nodeSpec; if (requested.type() == NodeType.tenant) { + cluster = capacityPolicies.decideExclusivity(requested, cluster); Capacity actual = capacityPolicies.applyOn(requested, application, cluster.isExclusive()); - ClusterResources target = decideTargetResources(params, actual); + ClusterResources target = decideTargetResources(application, cluster, actual); validate(actual, target, cluster, application); logIfDownscaled(requested.minResources().nodes(), actual.minResources().nodes(), cluster, logger); - resources = getNodeResources(params, cluster, target.nodeResources(), application); + resources = getNodeResources(cluster, target.nodeResources(), application); nodeSpec = NodeSpec.from(target.nodes(), target.groups(), resources, cluster.isExclusive(), actual.canFail(), requested.cloudAccount().orElse(nodeRepository.zone().cloud().account()), requested.clusterInfo().hostTTL()); } else { - resources = getNodeResources(params, cluster, requested.minResources().nodeResources(), application); + cluster = cluster.withExclusivity(true); + resources = getNodeResources(cluster, requested.minResources().nodeResources(), application); nodeSpec = NodeSpec.from(requested.type(), nodeRepository.zone().cloud().account()); } - return asSortedHosts(preparer.prepare(params, application, cluster, nodeSpec), + return asSortedHosts(preparer.prepare(application, cluster, nodeSpec), requireCompatibleResources(resources, cluster)); } - private void validate(AllocationParams params, Capacity requested, ProvisionLogger logger) { - if (params.cluster().group().isPresent()) throw new IllegalArgumentException("Node requests cannot specify a group"); + private void validate(ApplicationId application, ClusterSpec cluster, Capacity requested, ProvisionLogger logger) { + if (cluster.group().isPresent()) throw new IllegalArgumentException("Node requests cannot specify a group"); - nodeRepository.nodeResourceLimits().ensureWithinAdvertisedLimits(params, "Min", requested.minResources().nodeResources()); - nodeRepository.nodeResourceLimits().ensureWithinAdvertisedLimits(params, "Max", requested.maxResources().nodeResources()); + nodeRepository.nodeResourceLimits().ensureWithinAdvertisedLimits("Min", requested.minResources().nodeResources(), application, cluster); + nodeRepository.nodeResourceLimits().ensureWithinAdvertisedLimits("Max", requested.maxResources().nodeResources(), application, cluster); if (!requested.minResources().nodeResources().gpuResources().equals(requested.maxResources().nodeResources().gpuResources())) throw new IllegalArgumentException(requested + " is invalid: GPU capacity cannot have ranges"); - logInsufficientDiskResources(params.cluster(), requested, logger); + logInsufficientDiskResources(cluster, requested, logger); } private void logInsufficientDiskResources(ClusterSpec cluster, Capacity requested, ProvisionLogger logger) { @@ -133,8 +132,8 @@ public class NodeRepositoryProvisioner implements Provisioner { } } - private NodeResources getNodeResources(AllocationParams params, ClusterSpec cluster, NodeResources nodeResources, ApplicationId applicationId) { - return capacityPolicies.specifyFully(params, nodeResources); + private NodeResources getNodeResources(ClusterSpec cluster, NodeResources nodeResources, ApplicationId applicationId) { + return capacityPolicies.specifyFully(nodeResources, cluster, applicationId); } @Override @@ -166,39 +165,41 @@ public class NodeRepositoryProvisioner implements Provisioner { * Returns the target cluster resources, a value between the min and max in the requested capacity, * and updates the application store with the received min and max. */ - private ClusterResources decideTargetResources(AllocationParams params, Capacity requested) { - try (Mutex lock = nodeRepository.applications().lock(params.application())) { - var application = nodeRepository.applications().get(params.application()).orElse(Application.empty(params.application())) - .withCluster(params.cluster().id(), params.cluster().isExclusive(), requested); + private ClusterResources decideTargetResources(ApplicationId applicationId, ClusterSpec clusterSpec, Capacity requested) { + try (Mutex lock = nodeRepository.applications().lock(applicationId)) { + var application = nodeRepository.applications().get(applicationId).orElse(Application.empty(applicationId)) + .withCluster(clusterSpec.id(), clusterSpec.isExclusive(), requested); nodeRepository.applications().put(application, lock); - var cluster = application.cluster(params.cluster().id()).get(); - return cluster.target().resources().orElseGet(() -> currentResources(params, application, cluster, requested)); + var cluster = application.cluster(clusterSpec.id()).get(); + return cluster.target().resources().orElseGet(() -> currentResources(application, clusterSpec, cluster, requested)); } } /** Returns the current resources of this cluster, or requested min if none */ - private ClusterResources currentResources(AllocationParams params, Application application, Cluster cluster, Capacity requested) { + private ClusterResources currentResources(Application application, + ClusterSpec clusterSpec, + Cluster cluster, + Capacity requested) { NodeList nodes = nodeRepository.nodes().list(Node.State.active).owner(application.id()) - .cluster(params.cluster().id()) + .cluster(clusterSpec.id()) .not().retired() .not().removable(); boolean firstDeployment = nodes.isEmpty(); var current = firstDeployment // start at min, preserve current resources otherwise - ? new AllocatableResources(params, initialResourcesFrom(params, requested)) + ? new AllocatableResources(initialResourcesFrom(requested, clusterSpec, application.id()), clusterSpec, nodeRepository) : new AllocatableResources(nodes, nodeRepository); - var model = new ClusterModel(params, application, cluster, nodes, current, nodeRepository.metricsDb(), nodeRepository.clock()); - return within(params, Limits.of(requested), model, firstDeployment); + var model = new ClusterModel(nodeRepository, application, clusterSpec, cluster, nodes, current, nodeRepository.metricsDb(), nodeRepository.clock()); + return within(Limits.of(requested), model, firstDeployment); } - private ClusterResources initialResourcesFrom(AllocationParams params, Capacity requested) { - return capacityPolicies.specifyFully(params, requested.minResources()); + private ClusterResources initialResourcesFrom(Capacity requested, ClusterSpec clusterSpec, ApplicationId applicationId) { + return capacityPolicies.specifyFully(requested.minResources(), clusterSpec, applicationId); } /** Make the minimal adjustments needed to the current resources to stay within the limits */ - private ClusterResources within(AllocationParams params, - Limits limits, + private ClusterResources within(Limits limits, ClusterModel model, boolean firstDeployment) { if (limits.min().equals(limits.max())) return limits.min(); @@ -208,11 +209,10 @@ public class NodeRepositoryProvisioner implements Provisioner { return model.current().advertisedResources(); // Otherwise, find an allocation that preserves the current resources as well as possible - return allocationOptimizer.findBestAllocation(params, - Load.one(), + return allocationOptimizer.findBestAllocation(Load.one(), model, limits) - .orElseThrow(() -> newNoAllocationPossible(params, model.current().clusterSpec(), limits)) + .orElseThrow(() -> newNoAllocationPossible(model.current().clusterSpec(), limits)) .advertisedResources(); } @@ -277,10 +277,10 @@ public class NodeRepositoryProvisioner implements Provisioner { return nodeResources; } - private IllegalArgumentException newNoAllocationPossible(AllocationParams params, ClusterSpec spec, Limits limits) { + private IllegalArgumentException newNoAllocationPossible(ClusterSpec spec, Limits limits) { StringBuilder message = new StringBuilder("No allocation possible within ").append(limits); - if (params.exclusiveAllocation() && findNearestNodeResources(limits).isPresent()) + if (nodeRepository.exclusiveAllocation(spec) && findNearestNodeResources(limits).isPresent()) message.append(". Nearest allowed node resources: ").append(findNearestNodeResources(limits).get()); return new IllegalArgumentException(message.toString()); |