aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@yahooinc.com>2023-09-08 09:39:36 +0200
committerValerij Fredriksen <valerijf@yahooinc.com>2023-09-08 09:42:20 +0200
commit0059489bf482b4241226bc9011297073365f8b5a (patch)
tree2c64ed3ae6343a21c7f9e7a8cd9cae88b2812838
parentb52c958fcf3c7c13dae9463424db08c575320821 (diff)
Add feature flag to control min advertised memory for exclusive nodes
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java9
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java20
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) {