diff options
7 files changed, 53 insertions, 5 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 92e8c630c7b..7f620a7bd0b 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 @@ -92,6 +92,7 @@ public interface ModelContext { @ModelFeatureFlag(owners = {"hmusum"}) default String jvmOmitStackTraceInFastThrowOption(ClusterSpec.Type type) { return ""; } @ModelFeatureFlag(owners = {"bjorncs", "jonmv"}) default boolean enableJdiscHttp2() { return false; } @ModelFeatureFlag(owners = {"tokle", "bjorncs"}) default boolean enableCustomAclMapping() { return false; } + @ModelFeatureFlag(owners = {"geirst", "vekterli"}) default int numDistributorStripes() { return 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 1402f728c73..3722876a53f 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 @@ -61,6 +61,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private int maxActivationInhibitedOutOfSyncGroups = 0; private List<TenantSecretStore> tenantSecretStores = Collections.emptyList(); private String jvmOmitStackTraceInFastThrowOption; + private int numDistributorStripes = 0; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @Override public boolean multitenant() { return multitenant; } @@ -102,6 +103,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public int maxActivationInhibitedOutOfSyncGroups() { return maxActivationInhibitedOutOfSyncGroups; } @Override public List<TenantSecretStore> tenantSecretStores() { return tenantSecretStores; } @Override public String jvmOmitStackTraceInFastThrowOption(ClusterSpec.Type type) { return jvmOmitStackTraceInFastThrowOption; } + @Override public int numDistributorStripes() { return numDistributorStripes; } public TestProperties setFeedConcurrency(double feedConcurrency) { this.feedConcurrency = feedConcurrency; @@ -248,6 +250,11 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea return this; } + public TestProperties setNumDistributorStripes(int value) { + this.numDistributorStripes = 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/DistributorCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java index 0e3fee5a749..390c939c4b4 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java @@ -43,6 +43,7 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl private final boolean hasIndexedDocumentType; private final boolean useThreePhaseUpdates; private final int maxActivationInhibitedOutOfSyncGroups; + private final int numDistributorStripes; public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<DistributorCluster> { @@ -105,18 +106,20 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl final boolean hasIndexedDocumentType = clusterContainsIndexedDocumentType(documentsNode); boolean useThreePhaseUpdates = deployState.getProperties().featureFlags().useThreePhaseUpdates(); int maxInhibitedGroups = deployState.getProperties().featureFlags().maxActivationInhibitedOutOfSyncGroups(); + int numDistributorStripes = deployState.getProperties().featureFlags().numDistributorStripes(); return new DistributorCluster(parent, new BucketSplitting.Builder().build(new ModelElement(producerSpec)), gc, hasIndexedDocumentType, useThreePhaseUpdates, - maxInhibitedGroups); + maxInhibitedGroups, numDistributorStripes); } } private DistributorCluster(ContentCluster parent, BucketSplitting bucketSplitting, GcOptions gc, boolean hasIndexedDocumentType, boolean useThreePhaseUpdates, - int maxActivationInhibitedOutOfSyncGroups) + int maxActivationInhibitedOutOfSyncGroups, + int numDistributorStripes) { super(parent, "distributor"); this.parent = parent; @@ -125,6 +128,7 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl this.hasIndexedDocumentType = hasIndexedDocumentType; this.useThreePhaseUpdates = useThreePhaseUpdates; this.maxActivationInhibitedOutOfSyncGroups = maxActivationInhibitedOutOfSyncGroups; + this.numDistributorStripes = numDistributorStripes; } @Override @@ -138,6 +142,7 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl builder.disable_bucket_activation(hasIndexedDocumentType == false); builder.enable_metadata_only_fetch_phase_for_inconsistent_updates(useThreePhaseUpdates); builder.max_activation_inhibited_out_of_sync_groups(maxActivationInhibitedOutOfSyncGroups); + builder.num_distributor_stripes(numDistributorStripes); bucketSplitting.getConfig(builder); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java index 811e789752e..677eccfde78 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java @@ -1041,14 +1041,19 @@ public class ContentClusterTest extends ContentBaseTest { assertZookeeperServerImplementation("com.yahoo.vespa.zookeeper.VespaZooKeeperAdminImpl"); } - private int resolveMaxInhibitedGroupsConfigWithFeatureFlag(int maxGroups) { - VespaModel model = createEnd2EndOneNode(new TestProperties().maxActivationInhibitedOutOfSyncGroups(maxGroups)); + private StorDistributormanagerConfig resolveStorDistributormanagerConfig(TestProperties props) { + VespaModel model = createEnd2EndOneNode(props); ContentCluster cc = model.getContentClusters().get("storage"); var builder = new StorDistributormanagerConfig.Builder(); cc.getDistributorNodes().getConfig(builder); - return (new StorDistributormanagerConfig(builder)).max_activation_inhibited_out_of_sync_groups(); + return (new StorDistributormanagerConfig(builder)); + } + + private int resolveMaxInhibitedGroupsConfigWithFeatureFlag(int maxGroups) { + var cfg = resolveStorDistributormanagerConfig(new TestProperties().maxActivationInhibitedOutOfSyncGroups(maxGroups)); + return cfg.max_activation_inhibited_out_of_sync_groups(); } @Test @@ -1057,6 +1062,22 @@ public class ContentClusterTest extends ContentBaseTest { assertEquals(2, resolveMaxInhibitedGroupsConfigWithFeatureFlag(2)); } + private int resolveNumDistributorStripesConfigWithFeatureFlag(TestProperties props) { + var cfg = resolveStorDistributormanagerConfig(props); + return cfg.num_distributor_stripes(); + } + + private int resolveNumDistributorStripesConfigWithFeatureFlag(int numStripes) { + return resolveNumDistributorStripesConfigWithFeatureFlag(new TestProperties().setNumDistributorStripes(numStripes)); + } + + @Test + public void num_distributor_stripes_config_controlled_by_properties() { + assertEquals(0, resolveNumDistributorStripesConfigWithFeatureFlag(new TestProperties())); + assertEquals(0, resolveNumDistributorStripesConfigWithFeatureFlag(0)); + assertEquals(1, resolveNumDistributorStripesConfigWithFeatureFlag(1)); + } + @Test public void testDedicatedClusterControllers() { VespaModel noContentModel = createEnd2EndOneNode(new TestProperties().setHostedVespa(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 6569bde612a..34220b64808 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 @@ -180,6 +180,7 @@ public class ModelContextImpl implements ModelContext { private final ToIntFunction<ClusterSpec.Type> jvmOmitStackTraceInFastThrow; private final boolean enableJdiscHttp2; private final boolean enableCustomAclMapping; + private final int numDistributorStripes; public FeatureFlags(FlagSource source, ApplicationId appId) { this.dedicatedClusterControllerFlavor = parseDedicatedClusterControllerFlavor(flagValue(source, appId, Flags.DEDICATED_CLUSTER_CONTROLLER_FLAVOR)); @@ -206,6 +207,7 @@ public class ModelContextImpl implements ModelContext { this.jvmOmitStackTraceInFastThrow = type -> flagValueAsInt(source, appId, type, PermanentFlags.JVM_OMIT_STACK_TRACE_IN_FAST_THROW); this.enableJdiscHttp2 = flagValue(source, appId, Flags.ENABLE_JDISC_HTTP2); this.enableCustomAclMapping = flagValue(source, appId, Flags.ENABLE_CUSTOM_ACL_MAPPING); + this.numDistributorStripes = flagValue(source, appId, Flags.NUM_DISTRIBUTOR_STRIPES); } @Override public Optional<NodeResources> dedicatedClusterControllerFlavor() { return Optional.ofNullable(dedicatedClusterControllerFlavor); } @@ -234,6 +236,7 @@ public class ModelContextImpl implements ModelContext { } @Override public boolean enableJdiscHttp2() { return enableJdiscHttp2; } @Override public boolean enableCustomAclMapping() { return enableCustomAclMapping; } + @Override public int numDistributorStripes() { return numDistributorStripes; } 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 9ce2c6171a6..b3f7f42e308 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -287,6 +287,13 @@ public class Flags { "Takes effect on next host-admin tick", HOSTNAME); + public static final UnboundIntFlag NUM_DISTRIBUTOR_STRIPES = defineIntFlag( + "num-distributor-stripes", 0, + List.of("geirst", "vekterli"), "2021-04-20", "2021-07-01", + "Specifies the number of stripes used by the distributor. When 0, legacy single stripe behavior is used.", + "Takes effect after distributor restart", + 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, diff --git a/storage/src/vespa/storage/config/stor-distributormanager.def b/storage/src/vespa/storage/config/stor-distributormanager.def index d1c4f35e929..887761ab3b5 100644 --- a/storage/src/vespa/storage/config/stor-distributormanager.def +++ b/storage/src/vespa/storage/config/stor-distributormanager.def @@ -273,3 +273,7 @@ prioritize_global_bucket_merges bool default=true ## Note: this feature only kicks in if the number of groups in the cluster is greater ## than 1. max_activation_inhibited_out_of_sync_groups int default=0 + +## TODO STRIPE document +## If 0, legacy single stripe behavior is used. Currently supports 0 or 1. +num_distributor_stripes int default=0 restart |