diff options
Diffstat (limited to 'node-repository')
3 files changed, 25 insertions, 26 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 389be5b6652..3d76c8e3f94 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 @@ -164,10 +164,10 @@ public class AllocatableClusterResources { if (! exclusive) { // We decide resources: Add overhead to what we'll request (advertised) to make sure real becomes (at least) cappedNodeResources var advertisedResources = nodeRepository.resourcesCalculator().realToRequest(wantedResources.nodeResources(), exclusive); - advertisedResources = systemLimits.enlargeToLegal(advertisedResources, clusterSpec.type(), exclusive); // Ask for something legal + advertisedResources = systemLimits.enlargeToLegal(advertisedResources, clusterSpec, exclusive); // Ask for something legal advertisedResources = applicationLimits.cap(advertisedResources); // Overrides other conditions, even if it will then fail var realResources = nodeRepository.resourcesCalculator().requestToReal(advertisedResources, exclusive); // What we'll really get - if ( ! systemLimits.isWithinRealLimits(realResources, clusterSpec.type())) + if ( ! systemLimits.isWithinRealLimits(realResources, clusterSpec)) return Optional.empty(); if (anySatisfies(realResources, availableRealHostResources)) return Optional.of(new AllocatableClusterResources(wantedResources.with(realResources), @@ -187,7 +187,7 @@ public class AllocatableClusterResources { // Adjust where we don't need exact match to the flavor if (flavor.resources().storageType() == NodeResources.StorageType.remote) { - double diskGb = systemLimits.enlargeToLegal(cappedWantedResources, clusterSpec.type(), exclusive).diskGb(); + double diskGb = systemLimits.enlargeToLegal(cappedWantedResources, clusterSpec, exclusive).diskGb(); advertisedResources = advertisedResources.withDiskGb(diskGb); realResources = realResources.withDiskGb(diskGb); } @@ -197,7 +197,7 @@ public class AllocatableClusterResources { } if ( ! between(applicationLimits.min().nodeResources(), applicationLimits.max().nodeResources(), advertisedResources)) continue; - if ( ! systemLimits.isWithinRealLimits(realResources, clusterSpec.type())) continue; + if ( ! systemLimits.isWithinRealLimits(realResources, clusterSpec)) continue; var candidate = new AllocatableClusterResources(wantedResources.with(realResources), advertisedResources, wantedResources, 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 7160c9ba045..0ecc319c2ea 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 @@ -260,8 +260,7 @@ public class NodeRepositoryProvisioner implements Provisioner { private IllegalArgumentException newNoAllocationPossible(ClusterSpec spec, Limits limits) { StringBuilder message = new StringBuilder("No allocation possible within ").append(limits); - boolean exclusiveHosts = spec.isExclusive() || ! nodeRepository.zone().cloud().allowHostSharing(); - if (exclusiveHosts) + if (nodeRepository.exclusiveAllocation(spec)) message.append(". Nearest allowed node resources: ").append(findNearestNodeResources(limits)); return new IllegalArgumentException(message.toString()); 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 81dd852e2a1..66895867623 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 @@ -28,10 +28,10 @@ public class NodeResourceLimits { public void ensureWithinAdvertisedLimits(String type, NodeResources requested, ClusterSpec cluster) { if (requested.isUnspecified()) return; - if (requested.vcpu() < minAdvertisedVcpu(cluster.type())) - illegal(type, "vcpu", "", cluster, requested.vcpu(), minAdvertisedVcpu(cluster.type())); - if (requested.memoryGb() < minAdvertisedMemoryGb(cluster.type())) - illegal(type, "memoryGb", "Gb", cluster, requested.memoryGb(), minAdvertisedMemoryGb(cluster.type())); + if (requested.vcpu() < minAdvertisedVcpu(cluster)) + illegal(type, "vcpu", "", cluster, requested.vcpu(), minAdvertisedVcpu(cluster)); + if (requested.memoryGb() < minAdvertisedMemoryGb(cluster)) + illegal(type, "memoryGb", "Gb", cluster, requested.memoryGb(), minAdvertisedMemoryGb(cluster)); if (requested.diskGb() < minAdvertisedDiskGb(requested, cluster.isExclusive())) illegal(type, "diskGb", "Gb", cluster, requested.diskGb(), minAdvertisedDiskGb(requested, cluster.isExclusive())); } @@ -40,36 +40,36 @@ public class NodeResourceLimits { public boolean isWithinRealLimits(NodeCandidate candidateNode, ClusterSpec cluster) { if (candidateNode.type() != NodeType.tenant) return true; // Resource limits only apply to tenant nodes return isWithinRealLimits(nodeRepository.resourcesCalculator().realResourcesOf(candidateNode, nodeRepository), - cluster.type()); + cluster); } /** 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) { + public boolean isWithinRealLimits(NodeResources realResources, ClusterSpec cluster) { if (realResources.isUnspecified()) return true; - if (realResources.vcpu() < minRealVcpu(clusterType)) return false; - if (realResources.memoryGb() < minRealMemoryGb(clusterType)) return false; + if (realResources.vcpu() < minRealVcpu(cluster)) return false; + if (realResources.memoryGb() < minRealMemoryGb(cluster)) return false; if (realResources.diskGb() < minRealDiskGb()) return false; return true; } - public NodeResources enlargeToLegal(NodeResources requested, ClusterSpec.Type clusterType, boolean exclusive) { + public NodeResources enlargeToLegal(NodeResources requested, ClusterSpec cluster, boolean exclusive) { if (requested.isUnspecified()) return requested; - return requested.withVcpu(Math.max(minAdvertisedVcpu(clusterType), requested.vcpu())) - .withMemoryGb(Math.max(minAdvertisedMemoryGb(clusterType), requested.memoryGb())) + return requested.withVcpu(Math.max(minAdvertisedVcpu(cluster), requested.vcpu())) + .withMemoryGb(Math.max(minAdvertisedMemoryGb(cluster), requested.memoryGb())) .withDiskGb(Math.max(minAdvertisedDiskGb(requested, exclusive), requested.diskGb())); } - private double minAdvertisedVcpu(ClusterSpec.Type clusterType) { - if (zone().environment() == Environment.dev && zone().cloud().allowHostSharing()) return 0.1; - if (clusterType.isContent() && zone().environment().isProduction()) return 1.0; - if (clusterType == ClusterSpec.Type.admin) return 0.1; + private double minAdvertisedVcpu(ClusterSpec cluster) { + if (zone().environment() == Environment.dev && ! nodeRepository.exclusiveAllocation(cluster)) return 0.1; + if (cluster.type().isContent() && zone().environment().isProduction()) return 1.0; + if (cluster.type() == ClusterSpec.Type.admin) return 0.1; return 0.5; } - private double minAdvertisedMemoryGb(ClusterSpec.Type clusterType) { - if (clusterType == ClusterSpec.Type.admin) return 1; + private double minAdvertisedMemoryGb(ClusterSpec cluster) { + if (cluster.type() == ClusterSpec.Type.admin) return 1; return 4; } @@ -85,10 +85,10 @@ public class NodeResourceLimits { return 4; } - private double minRealVcpu(ClusterSpec.Type clusterType) { return minAdvertisedVcpu(clusterType); } + private double minRealVcpu(ClusterSpec cluster) { return minAdvertisedVcpu(cluster); } - private double minRealMemoryGb(ClusterSpec.Type clusterType) { - return minAdvertisedMemoryGb(clusterType) - 1.7; + private double minRealMemoryGb(ClusterSpec cluster) { + return minAdvertisedMemoryGb(cluster) - 1.7; } private double minRealDiskGb() { return 6; } |