summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-08-20 00:50:43 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2022-08-20 00:50:43 +0200
commit06d9dff6eb2d27e02083a599ffd91bb12fc26ec0 (patch)
tree090d3940cd06eb1e747463cb3d4844da7aca1a1c
parent47b7b4eab90ec796bbb346e1b91960d2fa6241d0 (diff)
Add featureflag control over query dispatch policy.
-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.java6
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/DispatchTuning.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java26
-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
7 files changed, 37 insertions, 11 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 4536257f8a3..e45ab5de253 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
@@ -76,6 +76,7 @@ public interface ModelContext {
@ModelFeatureFlag(owners = {"vekterli"}) default boolean useThreePhaseUpdates() { throw new UnsupportedOperationException("TODO specify default value"); }
@ModelFeatureFlag(owners = {"baldersheim"}, comment = "Select sequencer type use while feeding") default String feedSequencerType() { return "THROUGHPUT"; }
@ModelFeatureFlag(owners = {"baldersheim"}) default String responseSequencerType() { throw new UnsupportedOperationException("TODO specify default value"); }
+ @ModelFeatureFlag(owners = {"baldersheim"}) default String queryDispatchPolicy() { return "adaptive"; }
@ModelFeatureFlag(owners = {"baldersheim"}) default int defaultNumResponseThreads() { return 2; }
@ModelFeatureFlag(owners = {"baldersheim"}, removeAfter="7.last") default boolean skipCommunicationManagerThread() { return true; }
@ModelFeatureFlag(owners = {"baldersheim"}, removeAfter="7.last") default boolean skipMbusRequestThread() { return true; }
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 400aea86834..8e2f3feb010 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
@@ -41,6 +41,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
private boolean useThreePhaseUpdates = false;
private double defaultTermwiseLimit = 1.0;
private String jvmGCOptions = null;
+ private String queryDispatchPolicy = "adaptive";
private String sequencerType = "THROUGHPUT";
private boolean firstTimeDeployment = false;
private String responseSequencerType = "ADAPTIVE";
@@ -147,6 +148,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
@Override public int mbusCppEventsBeforeWakeup() { return mbus_cpp_events_before_wakeup; }
@Override public int rpcNumTargets() { return rpc_num_targets; }
@Override public int rpcEventsBeforeWakeup() { return rpc_events_before_wakeup; }
+ @Override public String queryDispatchPolicy() { return queryDispatchPolicy; }
public TestProperties sharedStringRepoNoReclaim(boolean sharedStringRepoNoReclaim) {
@@ -192,6 +194,10 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
jvmGCOptions = gcOptions;
return this;
}
+ public TestProperties setQueryDispatchPolicy(String policy) {
+ queryDispatchPolicy = policy;
+ return this;
+ }
public TestProperties setFeedSequencerType(String type) {
sequencerType = type;
return this;
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java
index ff39aa0903c..6dad3c5f06f 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java
@@ -158,7 +158,7 @@ public class ContentSearchCluster extends AbstractConfigProducer<SearchCluster>
String clusterName, ContentSearchCluster search) {
List<ModelElement> indexedDefs = getIndexedSchemas(clusterElem);
if (!indexedDefs.isEmpty()) {
- IndexedSearchCluster isc = new IndexedSearchCluster(search, clusterName, 0);
+ IndexedSearchCluster isc = new IndexedSearchCluster(search, clusterName, 0, deployState.featureFlags());
isc.setRoutingSelector(clusterElem.childAsString("documents.selection"));
Double visibilityDelay = clusterElem.childAsDouble("engine.proton.visibility-delay");
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/DispatchTuning.java b/config-model/src/main/java/com/yahoo/vespa/model/content/DispatchTuning.java
index ab93e42a1ff..1d1e1a8e3dc 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/DispatchTuning.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/DispatchTuning.java
@@ -70,7 +70,7 @@ public class DispatchTuning {
return this;
}
- private DispatchPolicy toDispatchPolicy(String policy) {
+ public static DispatchPolicy toDispatchPolicy(String policy) {
switch (policy.toLowerCase()) {
case "adaptive": case "random": return DispatchPolicy.ADAPTIVE; // TODO: Deprecate 'random' on Vespa 9
case "round-robin": return DispatchPolicy.ROUNDROBIN;
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
index 2c83e87df97..56fb915797b 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.model.search;
import com.yahoo.config.ConfigInstance;
+import com.yahoo.config.model.api.ModelContext;
import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.config.model.producer.AbstractConfigProducer;
import com.yahoo.prelude.fastsearch.DocumentdbInfoConfig;
@@ -18,6 +19,7 @@ import com.yahoo.vespa.config.search.core.ProtonConfig;
import com.yahoo.vespa.configdefinition.IlscriptsConfig;
import com.yahoo.vespa.model.container.docproc.DocprocChain;
import com.yahoo.vespa.model.content.DispatchSpec;
+import com.yahoo.vespa.model.content.DispatchTuning;
import com.yahoo.vespa.model.content.SearchCoverage;
import java.util.ArrayList;
@@ -56,6 +58,7 @@ public class IndexedSearchCluster extends SearchCluster
private final DispatchGroup rootDispatch;
private DispatchSpec dispatchSpec;
private final List<SearchNode> searchNodes = new ArrayList<>();
+ private final DispatchTuning.DispatchPolicy defaultDispatchPolicy;
/**
* Returns the document selector that is able to resolve what documents are to be routed to this search cluster.
@@ -67,10 +70,11 @@ public class IndexedSearchCluster extends SearchCluster
return routingSelector;
}
- public IndexedSearchCluster(AbstractConfigProducer<SearchCluster> parent, String clusterName, int index) {
+ public IndexedSearchCluster(AbstractConfigProducer<SearchCluster> parent, String clusterName, int index, ModelContext.FeatureFlags featureFlags) {
super(parent, clusterName, index);
documentDbsConfigProducer = new MultipleDocumentDatabasesConfigProducer(this, documentDbs);
rootDispatch = new DispatchGroup(this);
+ defaultDispatchPolicy = DispatchTuning.Builder.toDispatchPolicy(featureFlags.queryDispatchPolicy());
}
@Override
@@ -273,6 +277,15 @@ public class IndexedSearchCluster extends SearchCluster
return dispatchSpec;
}
+ private static DistributionPolicy.Enum toDistributionPolicy(DispatchTuning.DispatchPolicy tuning) {
+ return switch (tuning) {
+ case ADAPTIVE: yield DistributionPolicy.ADAPTIVE;
+ case ROUNDROBIN: yield DistributionPolicy.ROUNDROBIN;
+ case BEST_OF_RANDOM_2: yield DistributionPolicy.BEST_OF_RANDOM_2;
+ case LATENCY_AMORTIZED_OVER_REQUESTS: yield DistributionPolicy.LATENCY_AMORTIZED_OVER_REQUESTS;
+ case LATENCY_AMORTIZED_OVER_TIME: yield DistributionPolicy.LATENCY_AMORTIZED_OVER_TIME;
+ };
+ }
@Override
public void getConfig(DispatchConfig.Builder builder) {
for (SearchNode node : getSearchNodes()) {
@@ -289,14 +302,9 @@ public class IndexedSearchCluster extends SearchCluster
if (tuning.dispatch.getMinActiveDocsCoverage() != null)
builder.minActivedocsPercentage(tuning.dispatch.getMinActiveDocsCoverage());
if (tuning.dispatch.getDispatchPolicy() != null) {
- switch (tuning.dispatch.getDispatchPolicy()) {
- case ADAPTIVE:
- builder.distributionPolicy(DistributionPolicy.ADAPTIVE);
- break;
- case ROUNDROBIN:
- builder.distributionPolicy(DistributionPolicy.ROUNDROBIN);
- break;
- }
+ builder.distributionPolicy(toDistributionPolicy(tuning.dispatch.getDispatchPolicy()));
+ } else {
+ builder.distributionPolicy(toDistributionPolicy(defaultDispatchPolicy));
}
if (tuning.dispatch.getMaxHitsPerPartition() != null)
builder.maxHitsPerNode(tuning.dispatch.getMaxHitsPerPartition());
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 068323f7784..7c7a12bbf36 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
@@ -166,6 +166,7 @@ public class ModelContextImpl implements ModelContext {
public static class FeatureFlags implements ModelContext.FeatureFlags {
+ private final String queryDispatchPolicy;
private final double defaultTermwiseLimit;
private final boolean useThreePhaseUpdates;
private final String feedSequencer;
@@ -276,8 +277,10 @@ public class ModelContextImpl implements ModelContext {
this.mbus_cpp_events_before_wakeup = flagValue(source, appId, version, Flags.MBUS_CPP_EVENTS_BEFORE_WAKEUP);
this.rpc_num_targets = flagValue(source, appId, version, Flags.RPC_NUM_TARGETS);
this.rpc_events_before_wakeup = flagValue(source, appId, version, Flags.RPC_EVENTS_BEFORE_WAKEUP);
+ this.queryDispatchPolicy = flagValue(source, appId, version, Flags.QUERY_DISPATCH_POLICY);
}
+ @Override public String queryDispatchPolicy() { return queryDispatchPolicy;}
@Override public double defaultTermwiseLimit() { return defaultTermwiseLimit; }
@Override public boolean useThreePhaseUpdates() { return useThreePhaseUpdates; }
@Override public String feedSequencerType() { return feedSequencer; }
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 9552e1a961d..1acc879342e 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -62,6 +62,14 @@ public class Flags {
"Takes effect at redeployment",
ZONE_ID, APPLICATION_ID);
+ public static final UnboundStringFlag QUERY_DISPATCH_POLICY = defineStringFlag(
+ "query-dispatch-policy", "adaptive",
+ List.of("baldersheim"), "2022-08-20", "2023-01-01",
+ "Select query dispatch policy, valid values are adaptive, round-robin, best-of-random-2," +
+ " latency-amortized-over-requests, latency-amortized-over-time",
+ "Takes effect at redeployment (requires restart)",
+ ZONE_ID, APPLICATION_ID);
+
public static final UnboundStringFlag FEED_SEQUENCER_TYPE = defineStringFlag(
"feed-sequencer-type", "THROUGHPUT",
List.of("baldersheim"), "2020-12-02", "2023-01-01",