From 0059489bf482b4241226bc9011297073365f8b5a Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Fri, 8 Sep 2023 09:39:36 +0200 Subject: Add feature flag to control min advertised memory for exclusive nodes --- flags/src/main/java/com/yahoo/vespa/flags/Flags.java | 9 +++++++++ .../provision/provisioning/NodeResourceLimits.java | 20 +++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index f1d639432cc..7bbbd8e06f7 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -15,6 +15,8 @@ import java.util.function.Predicate; import static com.yahoo.vespa.flags.FetchVector.Dimension.APPLICATION_ID; import static com.yahoo.vespa.flags.FetchVector.Dimension.CLOUD_ACCOUNT; +import static com.yahoo.vespa.flags.FetchVector.Dimension.CLUSTER_ID; +import static com.yahoo.vespa.flags.FetchVector.Dimension.CLUSTER_TYPE; import static com.yahoo.vespa.flags.FetchVector.Dimension.CONSOLE_USER_EMAIL; import static com.yahoo.vespa.flags.FetchVector.Dimension.HOSTNAME; import static com.yahoo.vespa.flags.FetchVector.Dimension.NODE_TYPE; @@ -375,6 +377,13 @@ public class Flags { "Whether to write application data (active session id, last deployed session id etc. ) as json", "Takes effect immediately"); + public static final UnboundIntFlag MIN_EXCLUSIVE_ADVERTISED_MEMORY_GB = defineIntFlag( + "min-exclusive-advertised-memory-gb", 4, + List.of("freva"), "2023-09-08", "2023-11-01", + "Minimum amount of advertised memory for exclusive nodes", + "Takes effect immediately", + APPLICATION_ID, CLUSTER_ID, CLUSTER_TYPE); + public static final UnboundBooleanFlag ASSIGN_RANDOMIZED_ID = defineFeatureFlag( "assign-randomized-id", false, List.of("mortent"), "2023-08-31", "2024-02-01", 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 ff3359210cc..06ab9eb1a10 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 @@ -7,6 +7,9 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; +import com.yahoo.vespa.flags.FetchVector; +import com.yahoo.vespa.flags.Flags; +import com.yahoo.vespa.flags.IntFlag; import com.yahoo.vespa.hosted.provision.NodeRepository; import java.util.Locale; @@ -20,9 +23,11 @@ import java.util.Locale; public class NodeResourceLimits { private final NodeRepository nodeRepository; + private final IntFlag minExclusiveAdvertisedMemoryGbFlag; public NodeResourceLimits(NodeRepository nodeRepository) { this.nodeRepository = nodeRepository; + this.minExclusiveAdvertisedMemoryGbFlag = Flags.MIN_EXCLUSIVE_ADVERTISED_MEMORY_GB.bindTo(nodeRepository.flagSource()); } /** Validates the resources applications ask for (which are in "advertised" resource space) */ @@ -30,8 +35,8 @@ public class NodeResourceLimits { boolean exclusive = nodeRepository.exclusiveAllocation(cluster); if (! requested.vcpuIsUnspecified() && requested.vcpu() < minAdvertisedVcpu(applicationId, cluster, exclusive)) illegal(type, "vcpu", "", cluster, requested.vcpu(), minAdvertisedVcpu(applicationId, cluster, exclusive)); - if (! requested.memoryGbIsUnspecified() && requested.memoryGb() < minAdvertisedMemoryGb(cluster)) - illegal(type, "memoryGb", "Gb", cluster, requested.memoryGb(), minAdvertisedMemoryGb(cluster)); + if (! requested.memoryGbIsUnspecified() && requested.memoryGb() < minAdvertisedMemoryGb(applicationId, cluster, exclusive)) + illegal(type, "memoryGb", "Gb", cluster, requested.memoryGb(), minAdvertisedMemoryGb(applicationId, cluster, exclusive)); if (! requested.diskGbIsUnspecified() && requested.diskGb() < minAdvertisedDiskGb(requested, exclusive)) illegal(type, "diskGb", "Gb", cluster, requested.diskGb(), minAdvertisedDiskGb(requested, exclusive)); } @@ -66,7 +71,7 @@ public class NodeResourceLimits { requested = requested.withDiskGb(Math.max(minAdvertisedDiskGb(requested, cluster), requested.diskGb())); return requested.withVcpu(Math.max(minAdvertisedVcpu(applicationId, cluster, exclusive), requested.vcpu())) - .withMemoryGb(Math.max(minAdvertisedMemoryGb(cluster), requested.memoryGb())) + .withMemoryGb(Math.max(minAdvertisedMemoryGb(applicationId, cluster, exclusive), requested.memoryGb())) .withDiskGb(Math.max(minAdvertisedDiskGb(requested, exclusive), requested.diskGb())); } @@ -79,9 +84,14 @@ public class NodeResourceLimits { return 0.5; } - private double minAdvertisedMemoryGb(ClusterSpec cluster) { + private double minAdvertisedMemoryGb(ApplicationId applicationId, ClusterSpec cluster, boolean exclusive) { if (cluster.type() == ClusterSpec.Type.admin) return 1; - return 4; + if (!exclusive) return 4; + return minExclusiveAdvertisedMemoryGbFlag + .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()) + .with(FetchVector.Dimension.CLUSTER_ID, cluster.id().value()) + .with(FetchVector.Dimension.CLUSTER_TYPE, cluster.type().name()) + .value(); } private double minAdvertisedDiskGb(NodeResources requested, boolean exclusive) { -- cgit v1.2.3