diff options
author | Geir Storli <geirst@verizonmedia.com> | 2021-07-16 15:16:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-16 15:16:21 +0200 |
commit | c026937694b26a94719c531d29f6bd0be05c0251 (patch) | |
tree | f254cac7d99f5fd0921e2b948d830a0872bf0b95 | |
parent | d82075621c0474e2dc1e0d3c03bdc605cd685348 (diff) | |
parent | 6b3f45e1972fc0a02922c1a6cfb5c1b9433a413f (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.
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, |