diff options
10 files changed, 42 insertions, 14 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 5021a2b3a5f..0213e753217 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 @@ -32,10 +32,10 @@ public interface ModelContext { FileRegistry getFileRegistry(); Properties properties(); default Optional<File> appDir() { return Optional.empty();} - + /** The Vespa version this model is built for */ Version modelVespaVersion(); - + /** The Vespa version we want nodes to become */ Version wantedNodeVespaVersion(); @@ -53,6 +53,7 @@ public interface ModelContext { boolean isBootstrap(); boolean isFirstTimeDeployment(); boolean useDedicatedNodeForLogserver(); + boolean useFdispatchByDefault(); } } 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 83e595e1513..a6f2a205f94 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 @@ -35,6 +35,7 @@ public class TestProperties implements ModelContext.Properties { private boolean isBootstrap = false; private boolean isFirstTimeDeployment = false; private boolean useDedicatedNodeForLogserver = false; + private boolean useFdispatchByDefault = true; @Override public boolean multitenant() { return multitenant; } @Override public ApplicationId applicationId() { return applicationId; } @@ -48,6 +49,7 @@ public class TestProperties implements ModelContext.Properties { @Override public boolean isBootstrap() { return isBootstrap; } @Override public boolean isFirstTimeDeployment() { return isFirstTimeDeployment; } @Override public boolean useDedicatedNodeForLogserver() { return useDedicatedNodeForLogserver; } + @Override public boolean useFdispatchByDefault() { return useFdispatchByDefault; } public TestProperties setApplicationId(ApplicationId applicationId) { this.applicationId = applicationId; 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 f4754b4f958..6016bb4b710 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 @@ -137,7 +137,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot String clusterName, ContentSearchCluster search) { List<ModelElement> indexedDefs = getIndexedSearchDefinitions(clusterElem); if (!indexedDefs.isEmpty()) { - IndexedSearchCluster isc = new IndexedSearchCluster(search, clusterName, 0); + IndexedSearchCluster isc = new IndexedSearchCluster(search, clusterName, 0, deployState); 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/search/IndexedSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java index 80bba10276d..2662aed442b 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 @@ -106,6 +106,7 @@ public class IndexedSearchCluster extends SearchCluster private final SimpleConfigProducer dispatchParent; private final DispatchGroup rootDispatch; private DispatchSpec dispatchSpec; + private final boolean useFdispatchByDefault; private List<SearchNode> searchNodes = new ArrayList<>(); /** @@ -118,11 +119,12 @@ public class IndexedSearchCluster extends SearchCluster return routingSelector; } - public IndexedSearchCluster(AbstractConfigProducer parent, String clusterName, int index) { + public IndexedSearchCluster(AbstractConfigProducer parent, String clusterName, int index, DeployState deployState) { super(parent, clusterName, index); unionCfg = new UnionConfiguration(this, documentDbs); dispatchParent = new SimpleConfigProducer(this, "dispatchers"); rootDispatch = new DispatchGroup(this); + useFdispatchByDefault = deployState.getProperties().useFdispatchByDefault(); } @Override @@ -422,6 +424,7 @@ public class IndexedSearchCluster extends SearchCluster } builder.maxNodesDownPerGroup(rootDispatch.getMaxNodesDownPerFixedRow()); builder.useMultilevelDispatch(useMultilevelDispatchSetup()); + builder.useFdispatchByDefault(useFdispatchByDefault); builder.useLocalNode(tuning.dispatch.useLocalNode); builder.searchableCopies(rootDispatch.getSearchableCopies()); if (searchCoverage != null) { diff --git a/config-model/src/test/java/com/yahoo/config/model/MockModelContext.java b/config-model/src/test/java/com/yahoo/config/model/MockModelContext.java index 948c62c2343..86b671789c8 100644 --- a/config-model/src/test/java/com/yahoo/config/model/MockModelContext.java +++ b/config-model/src/test/java/com/yahoo/config/model/MockModelContext.java @@ -75,7 +75,7 @@ public class MockModelContext implements ModelContext { public FileRegistry getFileRegistry() { return new MockFileRegistry(); } - + @Override public Version modelVespaVersion() { return new Version(6); } @@ -136,6 +136,9 @@ public class MockModelContext implements ModelContext { @Override public boolean useDedicatedNodeForLogserver() { return false; } - }; + + @Override + public boolean useFdispatchByDefault() { return true; } +}; } } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java index e4198115b2a..cc7e2d72b5f 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java @@ -219,6 +219,9 @@ public class VespaModelFactoryTest { @Override public boolean useDedicatedNodeForLogserver() { return false; } + + @Override + public boolean useFdispatchByDefault() { return true; } }; } }; diff --git a/configdefinitions/src/vespa/dispatch.def b/configdefinitions/src/vespa/dispatch.def index 1108e40b3f1..f0a4b0d8419 100644 --- a/configdefinitions/src/vespa/dispatch.def +++ b/configdefinitions/src/vespa/dispatch.def @@ -16,6 +16,9 @@ maxNodesDownPerGroup int default=0 # Distribution policy for group selection distributionPolicy enum { ROUNDROBIN, ADAPTIVE } default=ROUNDROBIN +# Should fdispatch be used as the default dispatcher +useFdispatchByDefault bool default=true + # Is multi-level dispatch configured for this cluster useMultilevelDispatch bool default=false 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 0a64eca63be..68765a25581 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 @@ -40,7 +40,7 @@ public class ModelContextImpl implements ModelContext { private final Optional<HostProvisioner> hostProvisioner; private final ModelContext.Properties properties; private final Optional<File> appDir; - + /** The version of Vespa we are building a model for */ private final Version modelVespaVersion; @@ -86,9 +86,9 @@ public class ModelContextImpl implements ModelContext { @Override public Optional<ApplicationPackage> permanentApplicationPackage() { return permanentApplicationPackage; } - /** - * Returns the host provisioner to use, or empty to use the default provisioner, - * creating hosts from the application package defined hosts + /** + * Returns the host provisioner to use, or empty to use the default provisioner, + * creating hosts from the application package defined hosts */ // TODO: Don't allow empty here but create the right provisioner when this is set up instead @Override @@ -129,6 +129,7 @@ public class ModelContextImpl implements ModelContext { private final boolean isBootstrap; private final boolean isFirstTimeDeployment; private final boolean useDedicatedNodeForLogserver; + private final boolean useFdispatchByDefault; public Properties(ApplicationId applicationId, boolean multitenantFromConfig, @@ -155,6 +156,8 @@ public class ModelContextImpl implements ModelContext { this.isFirstTimeDeployment = isFirstTimeDeployment; this.useDedicatedNodeForLogserver = Flags.USE_DEDICATED_NODE_FOR_LOGSERVER.bindTo(flagSource) .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value(); + this.useFdispatchByDefault = Flags.USE_FDISPATCH_BY_DEFAULT.bindTo(flagSource) + .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value(); } @Override @@ -196,6 +199,9 @@ public class ModelContextImpl implements ModelContext { @Override public boolean useDedicatedNodeForLogserver() { return useDedicatedNodeForLogserver; } - } + + @Override + public boolean useFdispatchByDefault() { return useFdispatchByDefault; } +} } diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java index b613952b99e..1d39cffa9d2 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java @@ -36,7 +36,6 @@ import java.util.Set; * @author ollvir */ public class Dispatcher extends AbstractComponent { - private static final boolean INTERNAL_BY_DEFAULT = false; private static final int MAX_GROUP_SELECTION_ATTEMPTS = 3; /** If enabled, this internal dispatcher will be preferred over fdispatch whenever possible */ @@ -48,6 +47,7 @@ public class Dispatcher extends AbstractComponent { private final LoadBalancer loadBalancer; private final RpcResourcePool rpcResourcePool; private final boolean multilevelDispatch; + private final boolean internalDispatchByDefault; public Dispatcher(String clusterId, DispatchConfig dispatchConfig, FS4ResourcePool fs4ResourcePool, int containerClusterSize, VipStatus vipStatus) { this(new SearchCluster(clusterId, dispatchConfig, fs4ResourcePool, containerClusterSize, vipStatus), dispatchConfig); @@ -59,6 +59,7 @@ public class Dispatcher extends AbstractComponent { dispatchConfig.distributionPolicy() == DispatchConfig.DistributionPolicy.ROUNDROBIN); this.rpcResourcePool = new RpcResourcePool(dispatchConfig); this.multilevelDispatch = dispatchConfig.useMultilevelDispatch(); + this.internalDispatchByDefault = !dispatchConfig.useFdispatchByDefault(); } /** Returns the search cluster this dispatches to */ @@ -77,7 +78,7 @@ public class Dispatcher extends AbstractComponent { if (rpcInvoker.isPresent()) { return rpcInvoker; } - if (result.getQuery().properties().getBoolean(dispatchInternal, INTERNAL_BY_DEFAULT)) { + if (result.getQuery().properties().getBoolean(dispatchInternal, internalDispatchByDefault)) { Optional<FillInvoker> fs4Invoker = fs4InvokerFactory.getFillInvoker(result); if (fs4Invoker.isPresent()) { return fs4Invoker; @@ -87,7 +88,7 @@ public class Dispatcher extends AbstractComponent { } public Optional<SearchInvoker> getSearchInvoker(Query query, FS4InvokerFactory fs4InvokerFactory) { - if (multilevelDispatch || ! query.properties().getBoolean(dispatchInternal, INTERNAL_BY_DEFAULT)) { + if (multilevelDispatch || ! query.properties().getBoolean(dispatchInternal, internalDispatchByDefault)) { return Optional.empty(); } 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 87847670ef9..2268c8eae6e 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -83,6 +83,12 @@ public class Flags { "Takes effect on restart of Docker container", NODE_TYPE, APPLICATION_ID, HOSTNAME); + public static final UnboundBooleanFlag USE_FDISPATCH_BY_DEFAULT = defineFeatureFlag( + "default-to-fdispatch", true, + "Should fdispatch be used as the default instead of the java dispatcher", + "Takes effect at redeployment", + APPLICATION_ID); + /** WARNING: public for testing: All flags should be defined in {@link Flags}. */ public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, String description, String modificationEffect, FetchVector.Dimension... dimensions) { |