summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-05-28 22:44:30 +0200
committerJon Bratseth <bratseth@gmail.com>2020-05-28 22:44:30 +0200
commitf6514eb131bf8c8f5db4318e2b00f037c27298c4 (patch)
tree6cf392b00507501326ff374d9b4876a938b2c889 /node-repository
parent392706b822d0517f933cf58fca0277b192272bc5 (diff)
Verify forecasted resources
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java13
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java13
2 files changed, 18 insertions, 8 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java
index 84f0b962d34..72ed455c698 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java
@@ -142,15 +142,19 @@ public class AllocatableClusterResources {
public static Optional<AllocatableClusterResources> from(ClusterResources resources,
boolean exclusive,
ClusterSpec.Type clusterType,
- Limits limits,
+ Limits applicationLimits,
NodeRepository nodeRepository) {
- NodeResources cappedNodeResources = limits.cap(resources.nodeResources());
- cappedNodeResources = new NodeResourceLimits(nodeRepository).enlargeToLegal(cappedNodeResources, clusterType);
+ var systemLimits = new NodeResourceLimits(nodeRepository);
+ NodeResources cappedNodeResources = applicationLimits.cap(resources.nodeResources());
+ cappedNodeResources = systemLimits.enlargeToLegal(cappedNodeResources, clusterType);
if ( !exclusive && nodeRepository.zone().getCloud().allowHostSharing()) { // Check if any flavor can fit these hosts
// We decide resources: Add overhead to what we'll request (advertised) to make sure real becomes (at least) cappedNodeResources
NodeResources realResources = cappedNodeResources;
NodeResources advertisedResources = nodeRepository.resourcesCalculator().realToRequest(realResources);
+
+ if ( ! systemLimits.isWithinRealLimits(realResources, clusterType)) return Optional.empty();
+
for (Flavor flavor : nodeRepository.flavors().getFlavors()) {
if (flavor.resources().satisfies(advertisedResources))
return Optional.of(new AllocatableClusterResources(resources.with(realResources),
@@ -177,7 +181,8 @@ public class AllocatableClusterResources {
realResources = realResources.withBandwidthGbps(cappedNodeResources.bandwidthGbps());
}
- if ( ! between(limits.min().nodeResources(), limits.max().nodeResources(), advertisedResources)) continue;
+ if ( ! between(applicationLimits.min().nodeResources(), applicationLimits.max().nodeResources(), advertisedResources)) continue;
+ if ( ! systemLimits.isWithinRealLimits(realResources, clusterType)) continue;
var candidate = new AllocatableClusterResources(resources.with(realResources),
advertisedResources,
resources.nodeResources(),
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java
index db54fd316f6..06085caa2ee 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java
@@ -35,12 +35,17 @@ public class NodeResourceLimits {
/** Returns whether the real resources we'll end up with on a given tenant node are within limits */
public boolean isWithinRealLimits(Node candidateTenantNode, ClusterSpec cluster) {
- NodeResources realResources = nodeRepository.resourcesCalculator().realResourcesOf(candidateTenantNode, nodeRepository);
+ return isWithinRealLimits(nodeRepository.resourcesCalculator().realResourcesOf(candidateTenantNode, nodeRepository),
+ cluster.type());
+ }
- if (realResources.memoryGb() < minRealMemoryGb(cluster.type())) return false;
- if (realResources.diskGb() < minRealDiskGb()) return false;
+ /** Returns whether the real resources we'll end up with on a given tenant node are within limits */
+ public boolean isWithinRealLimits(NodeResources realResources, ClusterSpec.Type clusterType) {
+ if (realResources.isUnspecified()) return true;
- return true;
+ if (realResources.memoryGb() < minRealMemoryGb(clusterType)) return false;
+ if (realResources.diskGb() < minRealDiskGb()) return false;
+ return true;
}
public NodeResources enlargeToLegal(NodeResources requested, ClusterSpec.Type clusterType) {