diff options
6 files changed, 43 insertions, 2 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 b027a3bd51e..2b2344c5fdb 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 @@ -106,6 +106,7 @@ public interface ModelContext { @ModelFeatureFlag(owners = {"arnej"}) default boolean forwardIssuesAsErrors() { return true; } @ModelFeatureFlag(owners = {"geirst", "vekterli"}) default boolean asyncApplyBucketDiff() { return false; } @ModelFeatureFlag(owners = {"arnej"}) default boolean ignoreThreadStackSizes() { return false; } + @ModelFeatureFlag(owners = {"vekterli", "geirst"}) default boolean unorderedMergeChaining() { return false; } } /** 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 49c968a1d91..9f2f3620c73 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 @@ -72,6 +72,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private double diskBloatFactor = 0.2; private boolean distributorEnhancedMaintenanceScheduling = false; private boolean asyncApplyBucketDiff = false; + private boolean unorderedMergeChaining = false; private List<String> zoneDnsSuffixes = List.of(); @Override public ModelContext.FeatureFlags featureFlags() { return this; } @@ -125,6 +126,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public boolean distributorEnhancedMaintenanceScheduling() { return distributorEnhancedMaintenanceScheduling; } @Override public int maxUnCommittedMemory() { return maxUnCommittedMemory; } @Override public boolean asyncApplyBucketDiff() { return asyncApplyBucketDiff; } + @Override public boolean unorderedMergeChaining() { return unorderedMergeChaining; } @Override public List<String> zoneDnsSuffixes() { return zoneDnsSuffixes; } public TestProperties maxUnCommittedMemory(int maxUnCommittedMemory) { @@ -322,6 +324,11 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea return this; } + public TestProperties setUnorderedMergeChaining(boolean unordered) { + unorderedMergeChaining = unordered; + return this; + } + public TestProperties setZoneDnsSuffixes(List<String> zoneDnsSuffixes) { this.zoneDnsSuffixes = List.copyOf(zoneDnsSuffixes); return this; 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 fa91dbc2e42..518c3f73a8f 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 @@ -45,6 +45,7 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl private final int maxActivationInhibitedOutOfSyncGroups; private final int mergeBusyWait; private final boolean enhancedMaintenanceScheduling; + private final boolean unorderedMergeChaining; public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<DistributorCluster> { @@ -109,12 +110,14 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl int maxInhibitedGroups = deployState.getProperties().featureFlags().maxActivationInhibitedOutOfSyncGroups(); int mergeBusyWait = deployState.getProperties().featureFlags().distributorMergeBusyWait(); boolean useEnhancedMaintenanceScheduling = deployState.getProperties().featureFlags().distributorEnhancedMaintenanceScheduling(); + boolean unorderedMergeChaining = deployState.getProperties().featureFlags().unorderedMergeChaining(); return new DistributorCluster(parent, new BucketSplitting.Builder().build(new ModelElement(producerSpec)), gc, hasIndexedDocumentType, useThreePhaseUpdates, maxInhibitedGroups, mergeBusyWait, - useEnhancedMaintenanceScheduling); + useEnhancedMaintenanceScheduling, + unorderedMergeChaining); } } @@ -123,7 +126,8 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl boolean useThreePhaseUpdates, int maxActivationInhibitedOutOfSyncGroups, int mergeBusyWait, - boolean enhancedMaintenanceScheduling) + boolean enhancedMaintenanceScheduling, + boolean unorderedMergeChaining) { super(parent, "distributor"); this.parent = parent; @@ -134,6 +138,7 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl this.maxActivationInhibitedOutOfSyncGroups = maxActivationInhibitedOutOfSyncGroups; this.mergeBusyWait = mergeBusyWait; this.enhancedMaintenanceScheduling = enhancedMaintenanceScheduling; + this.unorderedMergeChaining = unorderedMergeChaining; } @Override @@ -149,6 +154,7 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl builder.max_activation_inhibited_out_of_sync_groups(maxActivationInhibitedOutOfSyncGroups); builder.inhibit_merge_sending_on_busy_node_duration_sec(mergeBusyWait); builder.implicitly_clear_bucket_priority_on_schedule(enhancedMaintenanceScheduling); + builder.use_unordered_merge_chaining(unorderedMergeChaining); 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 0fb7e82c095..729348a0e3a 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 @@ -1119,6 +1119,23 @@ public class ContentClusterTest extends ContentBaseTest { } @Test + public void unordered_merge_chaining_config_controlled_by_properties() throws Exception { + assertFalse(resolveUnorderedMergeChainingConfig(false)); + assertTrue(resolveUnorderedMergeChainingConfig(true)); + } + + private boolean resolveUnorderedMergeChainingConfig(boolean unorderedMergeChaining) throws Exception { + var props = new TestProperties(); + if (unorderedMergeChaining) { + props.setUnorderedMergeChaining(true); + } + var cluster = createOneNodeCluster(props); + var builder = new StorDistributormanagerConfig.Builder(); + cluster.getDistributorNodes().getConfig(builder); + return (new StorDistributormanagerConfig(builder)).use_unordered_merge_chaining(); + } + + @Test public void testDedicatedClusterControllers() { VespaModel noContentModel = createEnd2EndOneNode(new TestProperties().setHostedVespa(true) .setMultitenant(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 83d139ce461..3630215913e 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 @@ -198,6 +198,7 @@ public class ModelContextImpl implements ModelContext { private final boolean forwardIssuesAsErrors; private final boolean asyncApplyBucketDiff; private final boolean ignoreThreadStackSizes; + private final boolean unorderedMergeChaining; public FeatureFlags(FlagSource source, ApplicationId appId) { this.defaultTermwiseLimit = flagValue(source, appId, Flags.DEFAULT_TERM_WISE_LIMIT); @@ -234,6 +235,7 @@ public class ModelContextImpl implements ModelContext { this.forwardIssuesAsErrors = flagValue(source, appId, PermanentFlags.FORWARD_ISSUES_AS_ERRORS); this.asyncApplyBucketDiff = flagValue(source, appId, Flags.ASYNC_APPLY_BUCKET_DIFF); this.ignoreThreadStackSizes = flagValue(source, appId, Flags.IGNORE_THREAD_STACK_SIZES); + this.unorderedMergeChaining = flagValue(source, appId, Flags.UNORDERED_MERGE_CHAINING); } @Override public double defaultTermwiseLimit() { return defaultTermwiseLimit; } @@ -272,6 +274,7 @@ public class ModelContextImpl implements ModelContext { @Override public boolean forwardIssuesAsErrors() { return forwardIssuesAsErrors; } @Override public boolean asyncApplyBucketDiff() { return asyncApplyBucketDiff; } @Override public boolean ignoreThreadStackSizes() { return ignoreThreadStackSizes; } + @Override public boolean unorderedMergeChaining() { return unorderedMergeChaining; } 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 8e667ca1957..b7b0c9aea30 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -346,6 +346,13 @@ public class Flags { "Takes effect at redeploy", ZONE_ID, APPLICATION_ID); + public static final UnboundBooleanFlag UNORDERED_MERGE_CHAINING = defineFeatureFlag( + "unordered-merge-chaining", false, + List.of("vekterli", "geirst"), "2021-11-15", "2022-03-01", + "Enables the use of unordered merge chains for data merge operations", + "Takes effect at redeploy", + ZONE_ID, APPLICATION_ID); + public static final UnboundStringFlag JDK_VERSION = defineStringFlag( "jdk-version", "11", List.of("hmusum"), "2021-10-25", "2021-11-25", |