From f6514eb131bf8c8f5db4318e2b00f037c27298c4 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 28 May 2020 22:44:30 +0200 Subject: Verify forecasted resources --- .../provision/autoscale/AllocatableClusterResources.java | 13 +++++++++---- .../hosted/provision/provisioning/NodeResourceLimits.java | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'node-repository') 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 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) { -- cgit v1.2.3