summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2021-07-16 15:16:21 +0200
committerGitHub <noreply@github.com>2021-07-16 15:16:21 +0200
commitc026937694b26a94719c531d29f6bd0be05c0251 (patch)
treef254cac7d99f5fd0921e2b948d830a0872bf0b95
parentd82075621c0474e2dc1e0d3c03bdc605cd685348 (diff)
parent6b3f45e1972fc0a02922c1a6cfb5c1b9433a413f (diff)
Merge pull request #18630 from vespa-engine/geirst/min-node-ratio-per-group-feature-flag
Add feature flag for min-node-ratio-per-group.
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java1
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java7
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java28
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java3
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java8
6 files changed, 40 insertions, 9 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
index 944a989d79f..6ff8934c476 100644
--- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
@@ -100,6 +100,7 @@ public interface ModelContext {
@ModelFeatureFlag(owners = {"hmusum"}) default boolean throwIfResourceLimitsSpecified() { return false; }
@ModelFeatureFlag(owners = {"hmusum"}) default double resourceLimitDisk() { return 0.8; }
@ModelFeatureFlag(owners = {"hmusum"}) default double resourceLimitMemory() { return 0.8; }
+ @ModelFeatureFlag(owners = {"geirst", "vekterli"}) default double minNodeRatioPerGroup() { return 0.0; }
}
/** Warning: As elsewhere in this package, do not make backwards incompatible changes that will break old config models! */
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
index 62c192e2c99..a891e16e165 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
@@ -66,6 +66,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
private List<X509Certificate> operatorCertificates = Collections.emptyList();
private double resourceLimitDisk = 0.8;
private double resourceLimitMemory = 0.8;
+ private double minNodeRatioPerGroup = 0.0;
@Override public ModelContext.FeatureFlags featureFlags() { return this; }
@Override public boolean multitenant() { return multitenant; }
@@ -111,6 +112,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
@Override public boolean dryRunOnnxOnSetup() { return dryRunOnnxOnSetup; }
@Override public double resourceLimitDisk() { return resourceLimitDisk; }
@Override public double resourceLimitMemory() { return resourceLimitMemory; }
+ @Override public double minNodeRatioPerGroup() { return minNodeRatioPerGroup; }
public TestProperties setDryRunOnnxOnSetup(boolean value) {
dryRunOnnxOnSetup = value;
@@ -274,6 +276,11 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
return this;
}
+ public TestProperties setMinNodeRatioPerGroup(double value) {
+ this.minNodeRatioPerGroup = value;
+ return this;
+ }
+
public static class Spec implements ConfigServerSpec {
private final String hostName;
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java
index 66ec0d81947..b3d03bbbfdb 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java
@@ -35,7 +35,7 @@ public class ClusterControllerConfig extends AbstractConfigProducer<ClusterContr
ModelElement clusterTuning = clusterElement.child("tuning");
Integer bucketSplittingMinimumBits = null;
- Double minNodeRatioPerGroup = null;
+ Double minNodeRatioPerGroup = deployState.getProperties().featureFlags().minNodeRatioPerGroup();
if (clusterTuning != null) {
tuning = clusterTuning.child("cluster-controller");
minNodeRatioPerGroup = clusterTuning.childAsDouble("min-node-ratio-per-group");
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java
index dedf344c546..d17f2d36b9c 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java
@@ -17,10 +17,10 @@ import static org.junit.Assert.assertEquals;
public class FleetControllerClusterTest {
- private ClusterControllerConfig parse(String xml, boolean enableFeedBlockInDistributor) {
+ private ClusterControllerConfig parse(String xml, TestProperties props) {
Document doc = XML.getDocument(xml);
- var deployState = new DeployState.Builder().properties(
- new TestProperties().enableFeedBlockInDistributor(enableFeedBlockInDistributor)).build();
+ var deployState = new DeployState.Builder().properties(props).build();
+ boolean enableFeedBlockInDistributor = deployState.getProperties().featureFlags().enableFeedBlockInDistributor();
MockRoot root = new MockRoot("", deployState);
var clusterElement = new ModelElement(doc.getDocumentElement());
ModelContext.FeatureFlags featureFlags = new TestProperties();
@@ -37,7 +37,7 @@ public class FleetControllerClusterTest {
}
private ClusterControllerConfig parse(String xml) {
- return parse(xml, true);
+ return parse(xml, new TestProperties().enableFeedBlockInDistributor(true));
}
@Test
@@ -153,20 +153,32 @@ public class FleetControllerClusterTest {
}
private void verifyThatFeatureFlagControlsEnableClusterFeedBlock(boolean flag) {
- var config = getConfigForBasicCluster(flag);
+ var config = getConfigForBasicCluster(new TestProperties().enableFeedBlockInDistributor(flag));
assertEquals(flag, config.enable_cluster_feed_block());
}
- private FleetcontrollerConfig getConfigForBasicCluster(boolean enableFeedBlockInDistributor) {
+ @Test
+ public void feature_flag_controls_min_node_ratio_per_group() {
+ verifyFeatureFlagControlsMinNodeRatioPerGroup(0.0, new TestProperties());
+ verifyFeatureFlagControlsMinNodeRatioPerGroup(0.3,
+ new TestProperties().setMinNodeRatioPerGroup(0.3));
+ }
+
+ private void verifyFeatureFlagControlsMinNodeRatioPerGroup(double expRatio, TestProperties props) {
+ var config = getConfigForBasicCluster(props);
+ assertEquals(expRatio, config.min_node_ratio_per_group(), DELTA);
+ }
+
+ private FleetcontrollerConfig getConfigForBasicCluster(TestProperties props) {
var builder = new FleetcontrollerConfig.Builder();
parse("<cluster id=\"storage\">\n" +
" <documents/>\n" +
- "</cluster>", enableFeedBlockInDistributor).
+ "</cluster>", props).
getConfig(builder);
return new FleetcontrollerConfig(builder);
}
private FleetcontrollerConfig getConfigForBasicCluster() {
- return getConfigForBasicCluster(true);
+ return getConfigForBasicCluster(new TestProperties().enableFeedBlockInDistributor(true));
}
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
index 551f9060418..975faad7ae5 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
@@ -184,6 +184,7 @@ public class ModelContextImpl implements ModelContext {
private final boolean dryRunOnnxOnSetup;
private final double resourceLimitDisk;
private final double resourceLimitMemory;
+ private final double minNodeRatioPerGroup;
public FeatureFlags(FlagSource source, ApplicationId appId) {
this.dedicatedClusterControllerFlavor = parseDedicatedClusterControllerFlavor(flagValue(source, appId, Flags.DEDICATED_CLUSTER_CONTROLLER_FLAVOR));
@@ -213,6 +214,7 @@ public class ModelContextImpl implements ModelContext {
this.dryRunOnnxOnSetup = flagValue(source, appId, Flags.DRY_RUN_ONNX_ON_SETUP);
this.resourceLimitDisk = flagValue(source, appId, PermanentFlags.RESOURCE_LIMIT_DISK);
this.resourceLimitMemory = flagValue(source, appId, PermanentFlags.RESOURCE_LIMIT_MEMORY);
+ this.minNodeRatioPerGroup = flagValue(source, appId, Flags.MIN_NODE_RATIO_PER_GROUP);
}
@Override public Optional<NodeResources> dedicatedClusterControllerFlavor() { return Optional.ofNullable(dedicatedClusterControllerFlavor); }
@@ -244,6 +246,7 @@ public class ModelContextImpl implements ModelContext {
@Override public boolean dryRunOnnxOnSetup() { return dryRunOnnxOnSetup; }
@Override public double resourceLimitDisk() { return resourceLimitDisk; }
@Override public double resourceLimitMemory() { return resourceLimitMemory; }
+ @Override public double minNodeRatioPerGroup() { return minNodeRatioPerGroup; }
private static <V> V flagValue(FlagSource source, ApplicationId appId, UnboundFlag<? extends V, ?, ?> flag) {
return flag.bindTo(source)
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 4a470b7e2d2..8d4c974a4bc 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -279,6 +279,14 @@ public class Flags {
"Whether to use Podman 3 on supported hosts",
"Takes effect on host-admin restart");
+ public static final UnboundDoubleFlag MIN_NODE_RATIO_PER_GROUP = defineDoubleFlag(
+ "min-node-ratio-per-group", 0.0,
+ List.of("geirst", "vekterli"), "2021-07-16", "2021-10-01",
+ "Minimum ratio of nodes that have to be available (i.e. not Down) in any hierarchic content cluster group for the group to be Up",
+ "Takes effect at redeployment",
+ ZONE_ID, APPLICATION_ID);
+
+
/** WARNING: public for testing: All flags should be defined in {@link Flags}. */
public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, List<String> owners,
String createdAt, String expiresAt, String description,