diff options
25 files changed, 306 insertions, 224 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java index 922c6488659..0bdc3fbef9a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java @@ -46,8 +46,7 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat RankProfilesConfig.Producer, RankingConstantsConfig.Producer, ServletPathsConfig.Producer, - ContainerMbusConfig.Producer -{ + ContainerMbusConfig.Producer { private final Set<FileReference> applicationBundles = new LinkedHashSet<>(); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java index e4f5791b6b3..f5eb128e7f3 100755 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java @@ -99,9 +99,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> DocprocConfig.Producer, ClusterInfoConfig.Producer, RoutingProviderConfig.Producer, - ConfigserverConfig.Producer - -{ + ConfigserverConfig.Producer { /** * URI prefix used for internal, usually programmatic, APIs. URIs using this @@ -268,6 +266,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> * * @return the removed component, or null if it was not present */ + @SuppressWarnings("unused") // Used from other repositories public Component removeComponent(ComponentId componentId) { return componentGroup.removeComponent(componentId); } @@ -298,7 +297,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> public void addContainer(CONTAINER container) { container.setClusterName(name); container.setProp("clustername", name) - .setProp("index", this.containers.size()); + .setProp("index", this.containers.size()); containers.add(container); } @@ -330,7 +329,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> public SearchChains getSearchChains() { if (containerSearch == null) throw new IllegalStateException("Search components not found in container cluster '" + getSubId() + - "': Add <search/> to the cluster in services.xml"); + "': Add <search/> to the cluster in services.xml"); return containerSearch.getChains(); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java index f02878fe545..67870dc049d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java @@ -48,9 +48,8 @@ public class ContainerModel extends ConfigModel { List<AbstractSearchCluster> searchClusters = Content.getSearchClusters(configModelRepo); Map<String, AbstractSearchCluster> searchClustersByName = new TreeMap<>(); - for (AbstractSearchCluster c : searchClusters) { + for (AbstractSearchCluster c : searchClusters) searchClustersByName.put(c.getClusterName(), c); - } getCluster().initialize(searchClustersByName); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/ConfigProducerGroup.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/ConfigProducerGroup.java index 66294d3fcef..c671749cff0 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/ConfigProducerGroup.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/ConfigProducerGroup.java @@ -55,9 +55,7 @@ public class ConfigProducerGroup<CHILD extends AbstractConfigProducer<?>> extend return Collections.unmodifiableCollection(result); } - /** - * @return A map of all components in this group, with (local) component ID as key. - */ + /** Returns a map of all components in this group, with (local) component ID as key. */ public Map<ComponentId, CHILD> getComponentMap() { return Collections.unmodifiableMap(producerById); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java index 62aae85b55a..e07c3216850 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java @@ -11,17 +11,13 @@ import java.util.Collections; import java.util.List; /** - * <p> * Models a jdisc RequestHandler (including ClientProvider). * RequestHandlers always have at least one server binding, * while ClientProviders have at least one client binding. - * </p> * <p> * Note that this is also used to model vespa handlers (which do not have any bindings) - * </p> * * @author gjoranv - * @since 5.1.6 */ public class Handler<CHILD extends AbstractConfigProducer<?>> extends Component<CHILD, ComponentModel> { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/SimpleComponent.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/SimpleComponent.java index c4e988e6749..46ee0d0bd37 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/SimpleComponent.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/SimpleComponent.java @@ -9,7 +9,6 @@ import com.yahoo.config.model.producer.AbstractConfigProducer; * A component that only needs a simple ComponentModel. * * @author gjoranv - * @since 5.1.9 */ public class SimpleComponent extends Component<AbstractConfigProducer<?>, ComponentModel> { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/chain/Chain.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/chain/Chain.java index 6b4f8c8f8b5..97a09aa48d8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/chain/Chain.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/chain/Chain.java @@ -26,7 +26,6 @@ public class Chain<T extends ChainedComponent<?>> extends AbstractConfigProducer private final ComponentGroup<T> innerComponentsGroup; private static final Type.Enum TYPE = Type.SEARCH; - public Chain(ChainSpecification specWithoutInnerComponents) { super(specWithoutInnerComponents.componentId.stringValue()); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java index 5266fc46f6e..e19d81e7fb2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java @@ -15,6 +15,7 @@ import com.yahoo.vespa.model.search.AbstractSearchCluster; import com.yahoo.vespa.model.search.IndexedSearchCluster; import com.yahoo.vespa.model.search.StreamingSearchCluster; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,7 +34,8 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains> SemanticRulesConfig.Producer, PageTemplatesConfig.Producer { - private final List<AbstractSearchCluster> systems = new LinkedList<>(); + private ApplicationContainerCluster owningCluster; + private final List<AbstractSearchCluster> searchClusters = new LinkedList<>(); private final Options options; private QueryProfiles queryProfiles; @@ -42,26 +44,36 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains> public ContainerSearch(ApplicationContainerCluster cluster, SearchChains chains, Options options) { super(chains); + this.owningCluster = cluster; this.options = options; } public void connectSearchClusters(Map<String, AbstractSearchCluster> searchClusters) { - systems.addAll(searchClusters.values()); + this.searchClusters.addAll(searchClusters.values()); + initializeDispatchers(searchClusters.values()); initializeSearchChains(searchClusters); } + /** Adds a Dispatcher component to the owning container cluster for each search cluster */ + private void initializeDispatchers(Collection<AbstractSearchCluster> searchClusters) { + for (AbstractSearchCluster searchCluster : searchClusters) { + if ( ! ( searchCluster instanceof IndexedSearchCluster)) continue; + owningCluster.addComponent(new DispatcherComponent((IndexedSearchCluster)searchCluster)); + } + } + // public for testing public void initializeSearchChains(Map<String, ? extends AbstractSearchCluster> searchClusters) { getChains().initialize(searchClusters); QrsCache defaultCacheOptions = getOptions().cacheSettings.get(""); if (defaultCacheOptions != null) { - for (LocalProvider localProvider: getChains().localProviders()) { + for (LocalProvider localProvider : getChains().localProviders()) { localProvider.setCacheSize(defaultCacheOptions.size); } } - for (LocalProvider localProvider: getChains().localProviders()) { + for (LocalProvider localProvider : getChains().localProviders()) { QrsCache cacheOptions = getOptions().cacheSettings.get(localProvider.getClusterName()); if (cacheOptions != null) { localProvider.setCacheSize(cacheOptions.size); @@ -83,39 +95,39 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains> @Override public void getConfig(QueryProfilesConfig.Builder builder) { - if (queryProfiles!=null) { + if (queryProfiles != null) { queryProfiles.getConfig(builder); } } @Override public void getConfig(SemanticRulesConfig.Builder builder) { - if (semanticRules!=null) semanticRules.getConfig(builder); + if (semanticRules != null) semanticRules.getConfig(builder); } @Override public void getConfig(PageTemplatesConfig.Builder builder) { - if (pageTemplates!=null) pageTemplates.getConfig(builder); + if (pageTemplates != null) pageTemplates.getConfig(builder); } @Override public void getConfig(IndexInfoConfig.Builder builder) { - for (AbstractSearchCluster sc : systems) { + for (AbstractSearchCluster sc : searchClusters) { sc.getConfig(builder); } } @Override public void getConfig(IlscriptsConfig.Builder builder) { - for (AbstractSearchCluster sc : systems) { + for (AbstractSearchCluster sc : searchClusters) { sc.getConfig(builder); } } @Override public void getConfig(QrSearchersConfig.Builder builder) { - for (int i = 0; i < systems.size(); i++) { - AbstractSearchCluster sys = findClusterWithId(systems, i); + for (int i = 0; i < searchClusters.size(); i++) { + AbstractSearchCluster sys = findClusterWithId(searchClusters, i); QrSearchersConfig.Searchcluster.Builder scB = new QrSearchersConfig.Searchcluster.Builder(). name(sys.getClusterName()); for (AbstractSearchCluster.SearchDefinitionSpec spec : sys.getLocalSDS()) { @@ -133,9 +145,8 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains> private static AbstractSearchCluster findClusterWithId(List<AbstractSearchCluster> clusters, int index) { for (AbstractSearchCluster sys : clusters) { - if (sys.getClusterIndex() == index) { + if (sys.getClusterIndex() == index) return sys; - } } throw new IllegalArgumentException("No search cluster with index " + index + " exists"); } @@ -144,10 +155,11 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains> return options; } - /** - * Struct that encapsulates qrserver options. - */ + /** Encapsulates qrserver options. */ public static class Options { + Map<String, QrsCache> cacheSettings = new LinkedHashMap<>(); + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/DispatcherComponent.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/DispatcherComponent.java new file mode 100644 index 00000000000..7f51efcd092 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/DispatcherComponent.java @@ -0,0 +1,37 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.container.search; + +import com.yahoo.osgi.provider.model.ComponentModel; +import com.yahoo.vespa.config.search.DispatchConfig; +import com.yahoo.vespa.model.container.component.Component; +import com.yahoo.vespa.model.container.xml.BundleMapper; +import com.yahoo.vespa.model.search.IndexedSearchCluster; + +/** + * Represents a dispatcher component - an instance of a dispatcher in a search container cluster + * knows how to communicate with one indexed search cluster and owns the connections to it. + */ +public class DispatcherComponent extends Component<DispatcherComponent, ComponentModel> + implements DispatchConfig.Producer { + + private final IndexedSearchCluster indexedSearchCluster; + + public DispatcherComponent(IndexedSearchCluster indexedSearchCluster) { + super(toComponentModel(indexedSearchCluster)); + this.indexedSearchCluster = indexedSearchCluster; + } + + private static ComponentModel toComponentModel(IndexedSearchCluster indexedSearchCluster) { + String dispatcherComponentId = "dispatcher." + indexedSearchCluster.getClusterName(); // used by ClusterSearcher + return new ComponentModel(dispatcherComponentId, + "com.yahoo.search.dispatch.Dispatcher", + BundleMapper.searchAndDocprocBundle, + null); + } + + @Override + public void getConfig(DispatchConfig.Builder builder) { + indexedSearchCluster.getConfig(builder); + } + +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/GenericTarget.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/GenericTarget.java index 875de1465c6..660ee2628b8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/GenericTarget.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/GenericTarget.java @@ -6,6 +6,7 @@ import com.yahoo.search.searchchain.model.federation.FederationOptions; /** * A search chain that is intended to be used for federation (i.e. providers, sources) + * * @author Tony Vaagenes */ abstract public class GenericTarget extends SearchChain { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/LocalProvider.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/LocalProvider.java index 25a4197dcac..e05b2d27e09 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/LocalProvider.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/LocalProvider.java @@ -7,14 +7,12 @@ import com.yahoo.component.chain.model.ChainSpecification; import com.yahoo.component.chain.model.ChainedComponentModel; import com.yahoo.prelude.fastsearch.DocumentdbInfoConfig; import com.yahoo.prelude.cluster.QrMonitorConfig; -import com.yahoo.vespa.config.search.DispatchConfig; import com.yahoo.vespa.config.search.RankProfilesConfig; import com.yahoo.vespa.config.search.AttributesConfig; import com.yahoo.search.config.ClusterConfig; import com.yahoo.search.searchchain.model.federation.FederationOptions; import com.yahoo.search.searchchain.model.federation.LocalProviderSpec; import com.yahoo.vespa.model.search.AbstractSearchCluster; -import com.yahoo.vespa.model.search.IndexedSearchCluster; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -31,8 +29,7 @@ public class LocalProvider extends Provider implements ClusterConfig.Producer, AttributesConfig.Producer, QrMonitorConfig.Producer, - RankProfilesConfig.Producer, - DispatchConfig.Producer { + RankProfilesConfig.Producer { private final LocalProviderSpec providerSpec; private volatile AbstractSearchCluster searchCluster; @@ -106,7 +103,6 @@ public class LocalProvider extends Provider implements } void setSearchCluster(AbstractSearchCluster searchCluster) { - assert (this.searchCluster == null); this.searchCluster = searchCluster; } @@ -160,13 +156,4 @@ public class LocalProvider extends Provider implements return (visibilityDelay < 1.0d) ? 0.0d : visibilityDelay; } - @Override - public void getConfig(DispatchConfig.Builder builder) { - if (!(searchCluster instanceof IndexedSearchCluster)) { - log.warning("Could not build DispatchConfig: Only supported for IndexedSearchCluster, got " - + searchCluster.getClass().getCanonicalName()); - return; - } - ((IndexedSearchCluster) searchCluster).getConfig(builder); - } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChains.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChains.java index 24ff885f131..1520dffb695 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChains.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChains.java @@ -29,7 +29,7 @@ public class SearchChains extends Chains<SearchChain> { LocalClustersCreator.addDefaultLocalProviders(this, searchClustersByName.keySet()); VespaSearchChainsCreator.addVespaSearchChains(this); - validateSourceGroups(); //must be done before initializing searchers since they are used by FederationSearchers. + validateSourceGroups(); //must be done before initializing searchers since they are used by FederationSearchers initializeComponents(searchClustersByName); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/BundleMapper.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/BundleMapper.java index d8e678a5cd3..aa7cb5eb539 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/BundleMapper.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/BundleMapper.java @@ -28,7 +28,6 @@ public class BundleMapper { public static final Path LIBRARY_PATH = Paths.get(Defaults.getDefaults().underVespaHome("lib/jars")); - public static final String searchAndDocprocBundle = "container-search-and-docproc"; private static final Map<String, String> bundleFromClass; @@ -111,7 +110,6 @@ public class BundleMapper { bundleFromClass.put("com.yahoo.search.pagetemplates.engine.resolvers.DeterministicResolver", searchAndDocprocBundle); bundleFromClass.put("com.yahoo.search.pagetemplates.engine.resolvers.RandomResolver", searchAndDocprocBundle); bundleFromClass.put("com.yahoo.search.pagetemplates.model.Renderer", searchAndDocprocBundle); - bundleFromClass.put("com.yahoo.search.pagetemplates.model.Renderer", searchAndDocprocBundle); bundleFromClass.put("com.yahoo.search.query.rewrite.QueryRewriteSearcher", searchAndDocprocBundle); bundleFromClass.put("com.yahoo.search.query.rewrite.SearchChainDispatcherSearcher", searchAndDocprocBundle); bundleFromClass.put("com.yahoo.search.query.rewrite.rewriters.GenericExpansionRewriter", searchAndDocprocBundle); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java index fbbf029d5f1..85663a59556 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java @@ -29,51 +29,7 @@ public abstract class AbstractSearchCluster extends AbstractConfigProducer protected int index; private Double visibilityDelay = 0.0; private List<String> documentNames = new ArrayList<>(); - - protected List<SearchDefinitionSpec> localSDS = new LinkedList<>(); - - public void prepareToDistributeFiles(List<SearchNode> backends) { - for (SearchDefinitionSpec sds : localSDS) - sds.getSearchDefinition().getSearch().rankingConstants().sendTo(backends); - } - - public static final class IndexingMode { - - public static final IndexingMode REALTIME = new IndexingMode("REALTIME"); - public static final IndexingMode STREAMING = new IndexingMode("STREAMING"); - - private final String name; - - private IndexingMode(String name) { - this.name = name; - } - - public String getName() { return name; } - - public String toString() { - return "indexingmode: " + name; - } - } - - public static final class SearchDefinitionSpec { - - private final SearchDefinition searchDefinition; - private final UserConfigRepo userConfigRepo; - - public SearchDefinitionSpec(SearchDefinition searchDefinition, - UserConfigRepo userConfigRepo) { - this.searchDefinition = searchDefinition; - this.userConfigRepo = userConfigRepo; - } - - public SearchDefinition getSearchDefinition() { - return searchDefinition; - } - - public UserConfigRepo getUserConfigs() { - return userConfigRepo; - } - } + private List<SearchDefinitionSpec> localSDS = new LinkedList<>(); public AbstractSearchCluster(AbstractConfigProducer parent, String clusterName, int index) { super(parent, "cluster." + clusterName); @@ -81,6 +37,11 @@ public abstract class AbstractSearchCluster extends AbstractConfigProducer this.index = index; } + public void prepareToDistributeFiles(List<SearchNode> backends) { + for (SearchDefinitionSpec sds : localSDS) + sds.getSearchDefinition().getSearch().rankingConstants().sendTo(backends); + } + public void addDocumentNames(SearchDefinition searchDefinition) { String dName = searchDefinition.getSearch().getDocument().getDocumentName().getName(); documentNames.add(dName); @@ -97,14 +58,17 @@ public abstract class AbstractSearchCluster extends AbstractConfigProducer public final String getIndexingModeName() { return getIndexingMode().getName(); } public final boolean isRealtime() { return getIndexingMode() == IndexingMode.REALTIME; } public final boolean isStreaming() { return getIndexingMode() == IndexingMode.STREAMING; } + public final AbstractSearchCluster setQueryTimeout(Double to) { this.queryTimeout=to; return this; } + public final AbstractSearchCluster setVisibilityDelay(double delay) { this.visibilityDelay=delay; return this; } + protected abstract IndexingMode getIndexingMode(); public final Double getVisibilityDelay() { return visibilityDelay; } public final Double getQueryTimeout() { return queryTimeout; } @@ -122,4 +86,42 @@ public abstract class AbstractSearchCluster extends AbstractConfigProducer public abstract void getConfig(RankProfilesConfig.Builder builder); public abstract void getConfig(AttributesConfig.Builder builder); + public static final class IndexingMode { + + public static final IndexingMode REALTIME = new IndexingMode("REALTIME"); + public static final IndexingMode STREAMING = new IndexingMode("STREAMING"); + + private final String name; + + private IndexingMode(String name) { + this.name = name; + } + + public String getName() { return name; } + + public String toString() { + return "indexingmode: " + name; + } + } + + public static final class SearchDefinitionSpec { + + private final SearchDefinition searchDefinition; + private final UserConfigRepo userConfigRepo; + + public SearchDefinitionSpec(SearchDefinition searchDefinition, + UserConfigRepo userConfigRepo) { + this.searchDefinition = searchDefinition; + this.userConfigRepo = userConfigRepo; + } + + public SearchDefinition getSearchDefinition() { + return searchDefinition; + } + + public UserConfigRepo getUserConfigs() { + return userConfigRepo; + } + } + } 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 7d03a7acee7..64ac00020f7 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 @@ -30,53 +30,9 @@ import java.util.List; public class IndexedSearchCluster extends SearchCluster implements DocumentdbInfoConfig.Producer, - // TODO consider removing, these only produced by UnionConfiguration and DocumentDatabase? IndexInfoConfig.Producer, IlscriptsConfig.Producer, - DispatchConfig.Producer -{ - - /** - * Class used to retrieve combined configuration from multiple document databases. - * It is not a {@link com.yahoo.config.ConfigInstance.Producer} of those configs, - * that is handled (by delegating to this) by the {@link IndexedSearchCluster} - * which is the parent to this. This avoids building the config multiple times. - */ - public static class UnionConfiguration - extends AbstractConfigProducer - implements AttributesConfig.Producer { - private final List<DocumentDatabase> docDbs; - - public void getConfig(IndexInfoConfig.Builder builder) { - for (DocumentDatabase docDb : docDbs) { - docDb.getConfig(builder); - } - } - - public void getConfig(IlscriptsConfig.Builder builder) { - for (DocumentDatabase docDb : docDbs) { - docDb.getConfig(builder); - } - } - - @Override - public void getConfig(AttributesConfig.Builder builder) { - for (DocumentDatabase docDb : docDbs) { - docDb.getConfig(builder); - } - } - - public void getConfig(RankProfilesConfig.Builder builder) { - for (DocumentDatabase docDb : docDbs) { - docDb.getConfig(builder); - } - } - - private UnionConfiguration(AbstractConfigProducer parent, List<DocumentDatabase> docDbs) { - super(parent, "union"); - this.docDbs = docDbs; - } - } + DispatchConfig.Producer { private String indexingClusterName = null; // The name of the docproc cluster to run indexing, by config. private String indexingChainName = null; @@ -387,4 +343,46 @@ public class IndexedSearchCluster extends SearchCluster @Override public int getRowBits() { return 8; } + /** + * Class used to retrieve combined configuration from multiple document databases. + * It is not a {@link com.yahoo.config.ConfigInstance.Producer} of those configs, + * that is handled (by delegating to this) by the {@link IndexedSearchCluster} + * which is the parent to this. This avoids building the config multiple times. + */ + public static class UnionConfiguration + extends AbstractConfigProducer + implements AttributesConfig.Producer { + private final List<DocumentDatabase> docDbs; + + public void getConfig(IndexInfoConfig.Builder builder) { + for (DocumentDatabase docDb : docDbs) { + docDb.getConfig(builder); + } + } + + public void getConfig(IlscriptsConfig.Builder builder) { + for (DocumentDatabase docDb : docDbs) { + docDb.getConfig(builder); + } + } + + @Override + public void getConfig(AttributesConfig.Builder builder) { + for (DocumentDatabase docDb : docDbs) { + docDb.getConfig(builder); + } + } + + public void getConfig(RankProfilesConfig.Builder builder) { + for (DocumentDatabase docDb : docDbs) { + docDb.getConfig(builder); + } + } + + private UnionConfiguration(AbstractConfigProducer parent, List<DocumentDatabase> docDbs) { + super(parent, "union"); + this.docDbs = docDbs; + } + } + } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java index 62cdcf5a0c6..ecf8f100288 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java @@ -166,8 +166,7 @@ public class IndexedTest extends ContentBaseTest { } @Test - public void requireProtonStreamingOnly() - { + public void requireProtonStreamingOnly() { VespaModel model = getStreamingVespaModel(); // TODO // HostResource h = model.getHostSystem().getHosts().get(0); @@ -185,8 +184,7 @@ public class IndexedTest extends ContentBaseTest { } @Test - public void requireCorrectClusterList() - { + public void requireCorrectClusterList() { VespaModel model = getStreamingVespaModel(); ContentCluster s = model.getContentClusters().get("test"); assertNotNull(s); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java index 8e4bfbe0dac..319c871f996 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java @@ -24,7 +24,8 @@ import static org.junit.Assert.assertTrue; */ public class ClusterTest { - static final double DELTA = 1E-12; + private static final double DELTA = 1E-12; + @Test public void requireThatContentSearchIsApplied() { ContentCluster cluster = newContentCluster(joinLines("<search>", diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchClusterTest.java index 007dc5d7266..1c4e005cb67 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchClusterTest.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.search.test; +import com.yahoo.component.ComponentId; import com.yahoo.container.QrSearchersConfig; import com.yahoo.document.DataType; import com.yahoo.search.config.ClusterConfig; @@ -9,20 +10,22 @@ import com.yahoo.searchdefinition.SearchBuilder; import com.yahoo.searchdefinition.document.Attribute; import com.yahoo.searchdefinition.document.SDDocumentType; import com.yahoo.searchdefinition.document.SDField; +import com.yahoo.vespa.config.search.DispatchConfig; import com.yahoo.vespa.indexinglanguage.expressions.AttributeExpression; import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; import com.yahoo.vespa.indexinglanguage.expressions.StatementExpression; import com.yahoo.vespa.model.VespaModel; import com.yahoo.vespa.model.container.ContainerCluster; +import com.yahoo.vespa.model.container.component.Component; +import com.yahoo.vespa.model.search.AbstractSearchCluster; +import com.yahoo.vespa.model.search.SearchCluster; import com.yahoo.vespa.model.test.utils.ApplicationPackageUtils; import com.yahoo.vespa.model.test.utils.VespaModelCreatorWithMockPkg; import org.junit.Test; -import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; /** - * * Unit tests for SearchCluster. Please use this instead of SearchModelTestCase if possible and * write _unit_ tests. Thanks. * @@ -30,32 +33,19 @@ import static org.junit.Assert.*; */ public class SearchClusterTest { - private String vespaHosts = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + - "<hosts> " + - "<host name=\"foo\">" + - "<alias>node0</alias>" + - "</host>" + - "<host name=\"bar\">" + - "<alias>node1</alias>" + - "</host>" + - "<host name=\"baz\">" + - "<alias>node2</alias>" + - "</host>" + - "</hosts>"; - @Test public void testSdConfigLogical() { // sd1 - SDDocumentType sdt1=new SDDocumentType("s1"); + SDDocumentType sdt1 = new SDDocumentType("s1"); Search search1 = new Search("s1", null); - SDField f1=new SDField("f1", DataType.STRING); + SDField f1 = new SDField("f1", DataType.STRING); f1.addAttribute(new Attribute("f1", DataType.STRING)); f1.setIndexingScript(new ScriptExpression(new StatementExpression(new AttributeExpression("f1")))); sdt1.addField(f1); search1.addDocument(sdt1); // sd2 - SDDocumentType sdt2=new SDDocumentType("s2"); + SDDocumentType sdt2 = new SDDocumentType("s2"); Search search2 = new Search("s2", null); SDField f2=new SDField("f2", DataType.STRING); f2.addAttribute(new Attribute("f2", DataType.STRING)); @@ -71,7 +61,21 @@ public class SearchClusterTest { @Test public void search_model_is_connected_to_container_clusters_two_content_clusters() { - String services = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + + String vespaHosts = "<?xml version='1.0' encoding='utf-8' ?>" + + "<hosts>" + + " <host name='node0host'>" + + " <alias>node0</alias>" + + " </host>" + + " <host name='node1host'>" + + " <alias>node1</alias>" + + " </host>" + + " <host name='node2host'>" + + " <alias>node2</alias>" + + " </host>" + + "</hosts>"; + + String services = + "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + "<services version=\"1.0\">" + " <admin version='2.0'>" + " <adminserver hostalias='node0' />" + @@ -105,50 +109,74 @@ public class SearchClusterTest { " <documents>" + " <document mode='index' type=\"music\" />" + " </documents>" + - " <nodes>" + - " <node hostalias=\"node0\" distribution-key=\"0\" />" + - " </nodes>" + + " <nodes>" + + " <node hostalias=\"node0\" distribution-key=\"0\" />" + + " </nodes>" + " </content>" + " <content id=\"normal\" version='1.0'>" + " <redundancy>2</redundancy>" + " <documents>" + " <document mode='index' type=\"music\" />" + " </documents>" + - " <nodes>" + - " <node hostalias=\"node2\" distribution-key=\"0\" />" + - " </nodes>" + + " <nodes>" + + " <node hostalias=\"node2\" distribution-key=\"0\" />" + + " </nodes>" + " </content>" + "</services>"; VespaModel model = new VespaModelCreatorWithMockPkg(vespaHosts, services, ApplicationPackageUtils.generateSearchDefinitions("music")).create(); - ContainerCluster cluster1 = (ContainerCluster)model.getConfigProducer("j1").get(); - assertFalse(cluster1.getSearch().getChains().localProviders().isEmpty()); + ContainerCluster containerCluster1 = (ContainerCluster)model.getConfigProducer("j1").get(); + assertFalse(containerCluster1.getSearch().getChains().localProviders().isEmpty()); - ContainerCluster cluster2 = (ContainerCluster)model.getConfigProducer("j2").get(); - assertFalse(cluster2.getSearch().getChains().localProviders().isEmpty()); + ContainerCluster containerCluster2 = (ContainerCluster)model.getConfigProducer("j2").get(); + assertFalse(containerCluster2.getSearch().getChains().localProviders().isEmpty()); QrSearchersConfig.Builder builder = new QrSearchersConfig.Builder(); - cluster1.getConfig(builder); + containerCluster1.getConfig(builder); QrSearchersConfig config = new QrSearchersConfig(builder); - assertThat(config.searchcluster().size(), is(2)); - int normalId = 0; - int bulkId = 1; - assertThat(config.searchcluster().get(normalId).name(), is("normal")); - assertThat(config.searchcluster().get(bulkId).name(), is("xbulk")); + assertEquals(2, config.searchcluster().size()); + int normalIndex = 0; + int xbulkIndex = 1; + assertEquals("normal", config.searchcluster().get(normalIndex).name()); + assertEquals("xbulk", config.searchcluster().get(xbulkIndex).name()); ClusterConfig.Builder clusterConfigBuilder = new ClusterConfig.Builder(); model.getConfig(clusterConfigBuilder, "j1/searchchains/chain/normal/component/com.yahoo.prelude.cluster.ClusterSearcher"); ClusterConfig clusterConfig = new ClusterConfig(clusterConfigBuilder); - assertThat(clusterConfig.clusterId(), is(normalId)); - assertThat(clusterConfig.clusterName(), is("normal")); + assertEquals(normalIndex, clusterConfig.clusterId()); + assertEquals("normal", clusterConfig.clusterName()); ClusterConfig.Builder clusterConfigBuilder2 = new ClusterConfig.Builder(); model.getConfig(clusterConfigBuilder2, "j2/searchchains/chain/xbulk/component/com.yahoo.prelude.cluster.ClusterSearcher"); ClusterConfig clusterConfig2 = new ClusterConfig(clusterConfigBuilder2); - assertThat(clusterConfig2.clusterId(), is(bulkId)); - assertThat(clusterConfig2.clusterName(), is("xbulk")); + assertEquals(xbulkIndex, clusterConfig2.clusterId()); + assertEquals("xbulk", clusterConfig2.clusterName()); + + AbstractSearchCluster searchCluster1 = model.getSearchClusters().get(normalIndex); + assertEquals("normal", searchCluster1.getClusterName()); + assertEquals("normal/search/cluster.normal", searchCluster1.getConfigId()); + AbstractSearchCluster searchCluster2 = model.getSearchClusters().get(xbulkIndex); + assertEquals("xbulk", searchCluster2.getClusterName()); + + Component<?,?> normalDispatcher = (Component<?, ?>)containerCluster1.getComponentsMap().get(new ComponentId("dispatcher.normal")); + assertNotNull(normalDispatcher); + assertEquals("dispatcher.normal", normalDispatcher.getComponentId().stringValue()); + assertEquals("com.yahoo.search.dispatch.Dispatcher", normalDispatcher.getClassId().stringValue()); + assertEquals("j1/component/dispatcher.normal", normalDispatcher.getConfigId()); + DispatchConfig.Builder normalDispatchConfigBuilder = new DispatchConfig.Builder(); + model.getConfig(normalDispatchConfigBuilder, "j1/component/dispatcher.normal"); + assertEquals("node2host", normalDispatchConfigBuilder.build().node(0).host()); + + Component<?,?> xbulkDispatcher = (Component<?, ?>)containerCluster1.getComponentsMap().get(new ComponentId("dispatcher.xbulk")); + assertNotNull(xbulkDispatcher); + assertEquals("dispatcher.xbulk", xbulkDispatcher.getComponentId().stringValue()); + assertEquals("com.yahoo.search.dispatch.Dispatcher", xbulkDispatcher.getClassId().stringValue()); + assertEquals("j1/component/dispatcher.xbulk", xbulkDispatcher.getConfigId()); + DispatchConfig.Builder xbulkDispatchConfigBuilder = new DispatchConfig.Builder(); + model.getConfig(xbulkDispatchConfigBuilder, "j1/component/dispatcher.xbulk"); + assertEquals("node0host", xbulkDispatchConfigBuilder.build().node(0).host()); } } diff --git a/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java b/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java index 0c8e564578b..57d093fb1c1 100644 --- a/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java @@ -1,12 +1,11 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.prelude.cluster; -import com.yahoo.cloud.config.ClusterInfoConfig; import com.yahoo.component.ComponentId; import com.yahoo.component.chain.dependencies.After; +import com.yahoo.component.provider.ComponentRegistry; import com.yahoo.container.QrSearchersConfig; import com.yahoo.container.handler.VipStatus; -import com.yahoo.jdisc.Metric; import com.yahoo.prelude.IndexFacts; import com.yahoo.prelude.fastsearch.ClusterParams; import com.yahoo.prelude.fastsearch.DocumentdbInfoConfig; @@ -22,7 +21,6 @@ import com.yahoo.search.dispatch.Dispatcher; import com.yahoo.search.query.ParameterParser; import com.yahoo.search.result.ErrorMessage; import com.yahoo.search.searchchain.Execution; -import com.yahoo.vespa.config.search.DispatchConfig; import com.yahoo.vespa.streamingvisitors.VdsStreamingSearcher; import org.apache.commons.lang.StringUtils; @@ -48,7 +46,7 @@ import static com.yahoo.container.QrSearchersConfig.Searchcluster.Indexingmode.S @After("*") public class ClusterSearcher extends Searcher { - private final String clusterModelName; + private final String searchClusterName; // The set of document types contained in this search cluster private final Set<String> documentTypes; @@ -68,16 +66,14 @@ public class ClusterSearcher extends Searcher { QrSearchersConfig qrsConfig, ClusterConfig clusterConfig, DocumentdbInfoConfig documentDbConfig, - DispatchConfig dispatchConfig, - ClusterInfoConfig clusterInfoConfig, - Metric metric, + ComponentRegistry<Dispatcher> dispatchers, FS4ResourcePool fs4ResourcePool, VipStatus vipStatus) { super(id); int searchClusterIndex = clusterConfig.clusterId(); - clusterModelName = clusterConfig.clusterName(); - QrSearchersConfig.Searchcluster searchClusterConfig = getSearchClusterConfigFromClusterName(qrsConfig, clusterModelName); + searchClusterName = clusterConfig.clusterName(); + QrSearchersConfig.Searchcluster searchClusterConfig = getSearchClusterConfigFromClusterName(qrsConfig, searchClusterName); documentTypes = new LinkedHashSet<>(); maxQueryTimeout = ParameterParser.asMilliSeconds(clusterConfig.maxQueryTimeout(), DEFAULT_MAX_QUERY_TIMEOUT); @@ -102,8 +98,8 @@ public class ClusterSearcher extends Searcher { addBackendSearcher(searcher); vipStatus.addToRotation(searcher.getName()); } else { - Dispatcher dispatcher = Dispatcher.create(id.stringValue(), dispatchConfig, clusterInfoConfig.nodeCount(), vipStatus, metric); - FastSearcher searcher = searchDispatch(searchClusterIndex, fs4ResourcePool.getServerId(), docSumParams, documentDbConfig, dispatcher); + FastSearcher searcher = searchDispatch(searchClusterIndex, searchClusterName, fs4ResourcePool.getServerId(), + docSumParams, documentDbConfig, dispatchers); addBackendSearcher(searcher); } @@ -126,11 +122,17 @@ public class ClusterSearcher extends Searcher { } private static FastSearcher searchDispatch(int searchclusterIndex, + String searchClusterName, String serverId, SummaryParameters docSumParams, DocumentdbInfoConfig documentdbInfoConfig, - Dispatcher dispatcher) { + ComponentRegistry<Dispatcher> dispatchers) { ClusterParams clusterParams = makeClusterParams(searchclusterIndex); + ComponentId dispatcherComponentId = new ComponentId("dispatcher." + searchClusterName); + Dispatcher dispatcher = dispatchers.getComponent(dispatcherComponentId); + if (dispatcher == null) + throw new IllegalArgumentException("Configuration error: No dispatcher " + dispatcherComponentId + + " is configured"); return new FastSearcher(serverId, dispatcher, docSumParams, clusterParams, documentdbInfoConfig); } @@ -154,7 +156,7 @@ public class ClusterSearcher extends Searcher { /** Do not use, for internal testing purposes only. **/ ClusterSearcher(Set<String> documentTypes) { this.documentTypes = documentTypes; - clusterModelName = "testScenario"; + searchClusterName = "testScenario"; maxQueryTimeout = DEFAULT_MAX_QUERY_TIMEOUT; maxQueryCacheTimeout = DEFAULT_MAX_QUERY_CACHE_TIMEOUT; } 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 ddd319b7bcb..73e5af50788 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 @@ -1,7 +1,10 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.dispatch; +import com.google.inject.Inject; +import com.yahoo.cloud.config.ClusterInfoConfig; import com.yahoo.component.AbstractComponent; +import com.yahoo.component.ComponentId; import com.yahoo.container.handler.VipStatus; import com.yahoo.jdisc.Metric; import com.yahoo.prelude.fastsearch.VespaBackEndSearcher; @@ -78,22 +81,38 @@ public class Dispatcher extends AbstractComponent { public static QueryProfileType getArgumentType() { return argumentType; } - public static Dispatcher create(String clusterId, - DispatchConfig dispatchConfig, - int containerClusterSize, - VipStatus vipStatus, - Metric metric) { - var searchCluster = new SearchCluster(clusterId, dispatchConfig, containerClusterSize, vipStatus); - var rpcFactory = new RpcInvokerFactory(new RpcResourcePool(dispatchConfig), searchCluster); - - return new Dispatcher(searchCluster, dispatchConfig, rpcFactory, rpcFactory, metric); + @Inject + public Dispatcher(ComponentId clusterId, + DispatchConfig dispatchConfig, + ClusterInfoConfig clusterInfoConfig, + VipStatus vipStatus, + Metric metric) { + this(new SearchCluster(clusterId.stringValue(), dispatchConfig, clusterInfoConfig.nodeCount(), vipStatus), + dispatchConfig, + metric); } - public Dispatcher(SearchCluster searchCluster, + private Dispatcher(SearchCluster searchCluster, DispatchConfig dispatchConfig, - InvokerFactory invokerFactory, - PingFactory pingFactory, Metric metric) { + this(searchCluster, + dispatchConfig, + new RpcInvokerFactory(new RpcResourcePool(dispatchConfig), searchCluster), + metric); + } + + protected Dispatcher(SearchCluster searchCluster, + DispatchConfig dispatchConfig, + RpcInvokerFactory rcpInvokerFactory, + Metric metric) { + this(searchCluster, dispatchConfig, rcpInvokerFactory, rcpInvokerFactory, metric); + } + + protected Dispatcher(SearchCluster searchCluster, + DispatchConfig dispatchConfig, + InvokerFactory invokerFactory, + PingFactory pingFactory, + Metric metric) { this.searchCluster = searchCluster; this.loadBalancer = new LoadBalancer(searchCluster, dispatchConfig.distributionPolicy() == DispatchConfig.DistributionPolicy.ROUNDROBIN); diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java index 242ba5eb818..6160d3dfa08 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java @@ -23,6 +23,7 @@ import java.util.concurrent.Callable; * @author ollivir */ public class RpcInvokerFactory extends InvokerFactory implements PingFactory { + /** Unless turned off this will fill summaries by dispatching directly to search nodes over RPC when possible */ private final static CompoundName dispatchSummaries = new CompoundName("dispatch.summaries"); diff --git a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java index 047cdf3991a..7b9eb8fcff1 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java +++ b/container-search/src/main/java/com/yahoo/search/federation/sourceref/SourcesTarget.java @@ -16,8 +16,9 @@ import java.util.TreeSet; public class SourcesTarget extends Target { - private ComponentRegistry<ComponentAdaptor<SearchChainInvocationSpec>> providerSources = - new ComponentRegistry<ComponentAdaptor<SearchChainInvocationSpec>>() {}; + + private ComponentRegistry<ComponentAdaptor<SearchChainInvocationSpec>> providerSources = new ComponentRegistry<>() {}; + private SearchChainInvocationSpec defaultProviderSource; public SourcesTarget(ComponentId sourceId) { diff --git a/container-search/src/test/java/com/yahoo/prelude/cluster/ClusterSearcherTestCase.java b/container-search/src/test/java/com/yahoo/prelude/cluster/ClusterSearcherTestCase.java index f35d77de01a..6970093fc9d 100644 --- a/container-search/src/test/java/com/yahoo/prelude/cluster/ClusterSearcherTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/cluster/ClusterSearcherTestCase.java @@ -3,6 +3,7 @@ package com.yahoo.prelude.cluster; import com.yahoo.cloud.config.ClusterInfoConfig; import com.yahoo.component.ComponentId; +import com.yahoo.component.provider.ComponentRegistry; import com.yahoo.container.QrConfig; import com.yahoo.container.QrSearchersConfig; import com.yahoo.container.handler.ClustersStatus; @@ -19,6 +20,7 @@ import com.yahoo.prelude.fastsearch.test.MockMetric; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.config.ClusterConfig; +import com.yahoo.search.dispatch.Dispatcher; import com.yahoo.search.result.Hit; import com.yahoo.search.searchchain.Execution; import com.yahoo.vespa.config.search.DispatchConfig; @@ -492,8 +494,7 @@ public class ClusterSearcherTestCase { } private static ClusterSearcher createSearcher(String clusterName, Double maxQueryTimeout, Double maxQueryCacheTimeout, - boolean streamingMode, VipStatus vipStatus) - { + boolean streamingMode, VipStatus vipStatus) { QrSearchersConfig.Builder qrSearchersConfig = new QrSearchersConfig.Builder(); QrSearchersConfig.Searchcluster.Builder searchClusterConfig = new QrSearchersConfig.Searchcluster.Builder(); searchClusterConfig.name(clusterName); @@ -512,13 +513,19 @@ public class ClusterSearcherTestCase { DocumentdbInfoConfig.Builder documentDbConfig = new DocumentdbInfoConfig.Builder(); documentDbConfig.documentdb(new DocumentdbInfoConfig.Documentdb.Builder().name("type1")); + Dispatcher dispatcher = new Dispatcher(new ComponentId("test-id"), + new DispatchConfig.Builder().build(), + createClusterInfoConfig(), + vipStatus, + new MockMetric()); + ComponentRegistry<Dispatcher> dispatchers = new ComponentRegistry<>(); + dispatchers.register(new ComponentId("dispatcher." + clusterName), dispatcher); + return new ClusterSearcher(new ComponentId("test-id"), qrSearchersConfig.build(), clusterConfig.build(), documentDbConfig.build(), - new DispatchConfig.Builder().build(), - createClusterInfoConfig(), - new MockMetric(), + dispatchers, new FS4ResourcePool(new QrConfig.Builder().build()), vipStatus); } diff --git a/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/MockDispatcher.java b/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/MockDispatcher.java index 4fbbd9dd936..d1e04b26c15 100644 --- a/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/MockDispatcher.java +++ b/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/MockDispatcher.java @@ -12,6 +12,7 @@ import com.yahoo.vespa.config.search.DispatchConfig; import java.util.List; class MockDispatcher extends Dispatcher { + public static MockDispatcher create(List<Node> nodes) { var rpcResourcePool = new RpcResourcePool(toDispatchConfig(nodes)); @@ -30,7 +31,7 @@ class MockDispatcher extends Dispatcher { } private MockDispatcher(SearchCluster searchCluster, DispatchConfig dispatchConfig, RpcInvokerFactory invokerFactory) { - super(searchCluster, dispatchConfig, invokerFactory, invokerFactory, new MockMetric()); + super(searchCluster, dispatchConfig, invokerFactory, new MockMetric()); } private static DispatchConfig toDispatchConfig(List<Node> nodes) { @@ -46,4 +47,5 @@ class MockDispatcher extends Dispatcher { } return new DispatchConfig(dispatchConfigBuilder); } + } diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/DispatcherTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/DispatcherTest.java index 3d544f5c114..30f6c5a495d 100644 --- a/container-search/src/test/java/com/yahoo/search/dispatch/DispatcherTest.java +++ b/container-search/src/test/java/com/yahoo/search/dispatch/DispatcherTest.java @@ -38,14 +38,12 @@ public class DispatcherTest { @Test public void requireDispatcherToIgnoreMultilevelConfigurations() { - SearchCluster cl = new MockSearchCluster("1", 2, 2); - DispatchConfig.Builder builder = new DispatchConfig.Builder(); - builder.useMultilevelDispatch(true); - DispatchConfig dc = new DispatchConfig(builder); + SearchCluster searchCluster = new MockSearchCluster("1", 2, 2); + DispatchConfig dispatchConfig = new DispatchConfig.Builder().useMultilevelDispatch(true).build(); - var invokerFactory = new MockInvokerFactory(cl); + var invokerFactory = new MockInvokerFactory(searchCluster); - Dispatcher disp = new Dispatcher(cl, dc, invokerFactory, invokerFactory, new MockMetric()); + Dispatcher disp = new Dispatcher(searchCluster, dispatchConfig, invokerFactory, invokerFactory, new MockMetric()); assertThat(disp.getSearchInvoker(query(), null).isPresent(), is(false)); } @@ -113,6 +111,7 @@ public class DispatcherTest { } private static class MockInvokerFactory extends InvokerFactory implements PingFactory { + private final FactoryStep[] events; private int step = 0; |