summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2021-11-16 13:21:57 +0100
committerTor Brede Vekterli <vekterli@yahooinc.com>2021-11-17 11:08:08 +0100
commit35adcc568a0265e20ffdcb8add3db8558ea9c350 (patch)
treed75734ba370b0e7394a34c13d6f58594e724d103
parentda9a7ce37b73405dd8ae936b3b8a52d2b2b816f1 (diff)
Add feature flag for unordered merge chaining
-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/DistributorCluster.java10
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java17
-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.java7
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",