diff options
19 files changed, 125 insertions, 150 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java b/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java index da79e34b3ad..7a5969585e9 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java +++ b/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java @@ -2,7 +2,6 @@ package com.yahoo.config.model; import com.yahoo.cloud.config.*; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Version; import com.yahoo.vespa.config.content.LoadTypeConfig; @@ -126,11 +125,11 @@ public class ApplicationConfigProducerRoot extends AbstractConfigProducer<Abstra } // TODO: Do this as another config model depending on the other models - public void setupRouting(DeployState deployState, VespaModel vespaModel, ConfigModelRepo configModels) { + public void setupRouting(VespaModel vespaModel, ConfigModelRepo configModels) { if (admin != null) { Routing routing = configModels.getRouting(); if (routing == null) { - routing = new Routing(ConfigModelContext.create(deployState, vespaModel, configModels, this, "routing")); + routing = new Routing(ConfigModelContext.create(vespaModel, configModels, this, "routing")); configModels.add(routing); } this.routing = routing; diff --git a/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java b/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java index b4a5a865b9e..385cd883da4 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java +++ b/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java @@ -1,8 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.model; -import com.yahoo.config.model.deploy.DeployState; - /** * A config model is an abstract representation of a subsystem, which is used * by the builder of that subsystem to derive a config producer tree for the subsystem, and by other @@ -54,7 +52,7 @@ public abstract class ConfigModel { * * @param configModelRepo The ConfigModelRepo of the system model */ - public void prepare(ConfigModelRepo configModelRepo, DeployState deployState) { return; } + public void prepare(ConfigModelRepo configModelRepo) { return; } /** * <p>Returns whether this model must be maintained in memory for serving config requests. diff --git a/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java b/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java index f14a1ea3c2c..60089f04572 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java +++ b/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java @@ -215,9 +215,9 @@ public class ConfigModelRepo implements ConfigModelRepoAdder, Serializable, Iter * Initialize part 2.: * Prepare all config models for starting. Must be called after plugins are loaded and frozen. */ - public void prepareConfigModels(DeployState deployState) { + public void prepareConfigModels() { for (ConfigModel model : configModels) { - model.prepare(this, deployState); + model.prepare(ConfigModelRepo.this); } } diff --git a/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java b/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java index 113262d0734..8fff69e11a6 100644 --- a/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java +++ b/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java @@ -9,7 +9,6 @@ import com.yahoo.config.model.ApplicationConfigProducerRoot; import com.yahoo.config.model.deploy.DeployProperties; import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.admin.Admin; import com.yahoo.vespa.model.builder.xml.dom.DomAdminV2Builder; @@ -45,12 +44,12 @@ public class AdminModel extends ConfigModel { private Collection<ContainerModel> getContainerModels() { return containerModels; } @Override - public void prepare(ConfigModelRepo configModelRepo, DeployState deployState) { + public void prepare(ConfigModelRepo configModelRepo) { verifyClusterControllersOnlyDefinedForContent(configModelRepo); if (admin == null) return; if (admin.getClusterControllers() != null) - admin.getClusterControllers().prepare(deployState); - admin.getLogServerContainerCluster().ifPresent((ContainerCluster cc) -> cc.prepare(deployState)); + admin.getClusterControllers().prepare(); + admin.getLogServerContainerCluster().ifPresent(ContainerCluster::prepare); } private void verifyClusterControllersOnlyDefinedForContent(ConfigModelRepo configModelRepo) { diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java index 0c5c7733dda..7c2d9a3b0ad 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java @@ -16,6 +16,7 @@ import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModels; import java.io.IOException; import java.io.Writer; +import java.util.List; /** * A set of all derived configuration of a search definition. Use this as a facade to individual configurations when @@ -50,7 +51,7 @@ public class DerivedConfiguration { RankProfileRegistry rankProfileRegistry, QueryProfileRegistry queryProfiles, ImportedModels importedModels) { - this(search, new BaseDeployLogger(), rankProfileRegistry, queryProfiles, importedModels); + this(search, null, new BaseDeployLogger(), rankProfileRegistry, queryProfiles, importedModels); } /** @@ -59,12 +60,15 @@ public class DerivedConfiguration { * @param search The search to derive a configuration from. Derived objects will be snapshots, but this * argument is live. Which means that this object will be inconsistent when the given * search definition is later modified. + * @param abstractSearchList Search definition this one inherits from, only superclass configuration should be + * generated. Null or empty list if there is none. * @param deployLogger a {@link DeployLogger} for logging when * doing operations on this * @param rankProfileRegistry a {@link com.yahoo.searchdefinition.RankProfileRegistry} * @param queryProfiles the query profiles of this application */ public DerivedConfiguration(Search search, + List<Search> abstractSearchList, DeployLogger deployLogger, RankProfileRegistry rankProfileRegistry, QueryProfileRegistry queryProfiles, diff --git a/config-model/src/main/java/com/yahoo/vespa/model/Host.java b/config-model/src/main/java/com/yahoo/vespa/model/Host.java index ac56875270d..624a9fd4da7 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/Host.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/Host.java @@ -37,10 +37,10 @@ public final class Host extends AbstractConfigProducer<AbstractConfigProducer<?> this.runsConfigServer = runsConfigServer; this.hostname = hostname; if (parent instanceof HostSystem) - checkName(hostname); + checkName((HostSystem) parent, hostname); } - private void checkName(String hostname) { + private void checkName(HostSystem parent, String hostname) { // Give a warning if the host does not exist try { Object address = java.net.InetAddress.getByName(hostname); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java index dc7efefe24b..67067b37c5d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java @@ -99,18 +99,18 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri private static final long serialVersionUID = 1L; public static final Logger log = Logger.getLogger(VespaModel.class.getPackage().toString()); - private final ConfigModelRepo configModelRepo = new ConfigModelRepo(); + private ConfigModelRepo configModelRepo = new ConfigModelRepo(); private final AllocatedHosts allocatedHosts; /** The config id for the root config producer */ public static final String ROOT_CONFIGID = ""; - private final ApplicationConfigProducerRoot root; + private ApplicationConfigProducerRoot root; private final ApplicationPackage applicationPackage; /** Generic service instances - service clusters which have no specific model */ - private final List<ServiceCluster> serviceClusters = new ArrayList<>(); + private List<ServiceCluster> serviceClusters = new ArrayList<>(); /** The global rank profiles of this model */ private final RankProfileList rankProfileList; @@ -119,7 +119,6 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri private final RankingConstants rankingConstants = new RankingConstants(); private DeployState deployState; - private DeployLogger deployLogger; /** The validation overrides of this. This is never null. */ private final ValidationOverrides validationOverrides; @@ -160,15 +159,16 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri private VespaModel(ConfigModelRegistry configModelRegistry, DeployState deployState, boolean complete, FileDistributor fileDistributor) throws IOException, SAXException { super("vespamodel"); + this.deployState = deployState; this.validationOverrides = deployState.validationOverrides(); configModelRegistry = new VespaConfigModelRegistry(configModelRegistry); VespaModelBuilder builder = new VespaDomBuilder(); this.applicationPackage = deployState.getApplicationPackage(); root = builder.getRoot(VespaModel.ROOT_CONFIGID, deployState, this); - HostSystem hostSystem = root.getHostSystem(); - createGlobalRankProfiles(deployState.getDeployLogger(), deployState.getImportedModels(), - deployState.rankProfileRegistry(), deployState.getQueryProfiles()); + createGlobalRankProfiles(deployState.getImportedModels(), + deployState.rankProfileRegistry(), + deployState.getQueryProfiles()); this.rankProfileList = new RankProfileList(null, // null search -> global rankingConstants, AttributeFields.empty, @@ -177,26 +177,22 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri deployState.getImportedModels()); if (complete) { // create a a completed, frozen model - this.deployLogger = deployState.getDeployLogger(); - this.deployState = deployState; configModelRepo.readConfigModels(deployState, this, builder, root, configModelRegistry); - this.deployState = null; addServiceClusters(deployState.getApplicationPackage(), builder); - this.allocatedHosts = AllocatedHosts.withHosts(hostSystem.getHostSpecs()); // must happen after the two lines above - setupRouting(deployState); + this.allocatedHosts = AllocatedHosts.withHosts(root.getHostSystem().getHostSpecs()); // must happen after the two lines above + + setupRouting(); this.fileDistributor = root.getFileDistributionConfigProducer().getFileDistributor(); - getAdmin().addPerHostServices(hostSystem.getHosts(), deployState); - this.deployLogger = null; + getAdmin().addPerHostServices(getHostSystem().getHosts(), deployState); freezeModelTopology(); root.prepare(configModelRepo); - configModelRepo.prepareConfigModels(deployState); + configModelRepo.prepareConfigModels(); validateWrapExceptions(); + this.deployState = null; } else { // create a model with no services instantiated and the given file distributor - this.allocatedHosts = AllocatedHosts.withHosts(hostSystem.getHostSpecs()); + this.allocatedHosts = AllocatedHosts.withHosts(root.getHostSystem().getHostSpecs()); this.fileDistributor = fileDistributor; - this.deployState = deployState; - this.deployLogger = deployState.getDeployLogger(); } } @@ -230,7 +226,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri * Creates a rank profile not attached to any search definition, for each imported model in the application package, * and adds it to the given rank profile registry. */ - private void createGlobalRankProfiles(DeployLogger deployLogger, ImportedModels importedModels, + private void createGlobalRankProfiles(ImportedModels importedModels, RankProfileRegistry rankProfileRegistry, QueryProfiles queryProfiles) { if ( ! importedModels.all().isEmpty()) { // models/ directory is available @@ -253,14 +249,16 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri convertedModel.expressions().values().forEach(f -> profile.addFunction(f, false)); } } - new Processing().processRankProfiles(deployLogger, rankProfileRegistry, queryProfiles, true, false); + new Processing().processRankProfiles(deployState.getDeployLogger(), + rankProfileRegistry, + queryProfiles, true, false); } /** Returns the global rank profiles as a rank profile list */ public RankProfileList rankProfileList() { return rankProfileList; } - private void setupRouting(DeployState deployState) { - root.setupRouting(deployState, this, configModelRepo); + private void setupRouting() { + root.setupRouting(this, configModelRepo); } /** Returns the one and only HostSystem of this VespaModel */ @@ -271,9 +269,9 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri /** Return a collection of all hostnames used in this application */ @Override public Set<HostInfo> getHosts() { - return getHostSystem().getHosts().stream() - .map(HostResource::getHostInfo) - .collect(Collectors.toCollection(LinkedHashSet::new)); + return root.getHostSystem().getHosts().stream() + .map(HostResource::getHostInfo) + .collect(Collectors.toCollection(LinkedHashSet::new)); } public FileDistributor getFileDistributor() { @@ -318,6 +316,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri } } + /** * Populates an instance of configClass with config produced by configProducer. */ @@ -617,7 +616,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri @Override public DeployLogger deployLogger() { - return deployLogger; + return getDeployState().getDeployLogger(); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java index 0e29c69c53e..1e41fc70104 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java @@ -1,25 +1,18 @@ // 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.builder.xml.dom; +import com.yahoo.config.model.*; import com.yahoo.config.application.api.ApplicationPackage; -import com.yahoo.config.model.ApplicationConfigProducerRoot; -import com.yahoo.config.model.ConfigModel; -import com.yahoo.config.model.ConfigModelRepo; import com.yahoo.config.model.api.HostProvisioner; import com.yahoo.config.model.deploy.DeployProperties; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.builder.xml.XmlHelper; import com.yahoo.config.model.producer.AbstractConfigProducer; -import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.model.producer.UserConfigRepo; import com.yahoo.log.LogLevel; import com.yahoo.text.XML; import com.yahoo.vespa.documentmodel.DocumentModel; -import com.yahoo.vespa.model.AbstractService; -import com.yahoo.vespa.model.Affinity; -import com.yahoo.vespa.model.Client; -import com.yahoo.vespa.model.HostSystem; -import com.yahoo.vespa.model.SimpleConfigProducer; +import com.yahoo.vespa.model.*; import com.yahoo.vespa.model.builder.UserConfigBuilder; import com.yahoo.vespa.model.builder.VespaModelBuilder; import com.yahoo.vespa.model.container.ContainerCluster; @@ -95,7 +88,7 @@ public class VespaDomBuilder extends VespaModelBuilder { public ApplicationConfigProducerRoot getRoot(String name, DeployState deployState, AbstractConfigProducer parent) { try { return new DomRootBuilder(name, deployState). - build(deployState, parent, XmlHelper.getDocument(deployState.getApplicationPackage().getServices()).getDocumentElement()); + build(parent, XmlHelper.getDocument(deployState.getApplicationPackage().getServices()).getDocumentElement()); } catch (Exception e) { throw new IllegalArgumentException(e); } @@ -120,16 +113,12 @@ public class VespaDomBuilder extends VespaModelBuilder { // TODO: find good way to provide access to app package public final T build(AbstractConfigProducer ancestor, Element producerSpec) { - return build(ancestor.getRoot().getDeployState(), ancestor, producerSpec); - } - - public final T build(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { T t = doBuild(ancestor, producerSpec); if (t instanceof AbstractService) { - initializeService((AbstractService)t, deployState, ancestor.getHostSystem(), producerSpec); + initializeService((AbstractService)t, ancestor, producerSpec); } else { - initializeProducer(t, deployState, producerSpec); + initializeProducer(t, ancestor, producerSpec); } return t; @@ -138,9 +127,9 @@ public class VespaDomBuilder extends VespaModelBuilder { protected abstract T doBuild(AbstractConfigProducer ancestor, Element producerSpec); private void initializeProducer(AbstractConfigProducer child, - DeployState deployState, + AbstractConfigProducer ancestor, Element producerSpec) { - UserConfigRepo userConfigs = UserConfigBuilder.build(producerSpec, deployState, deployState.getDeployLogger()); + UserConfigRepo userConfigs = UserConfigBuilder.build(producerSpec, ancestor.getRoot().getDeployState(), ancestor.getRoot().deployLogger()); // TODO: must be made to work: //userConfigs.applyWarnings(child); log.log(LogLevel.DEBUG, "Adding user configs " + userConfigs + " for " + producerSpec); @@ -148,10 +137,9 @@ public class VespaDomBuilder extends VespaModelBuilder { } private void initializeService(AbstractService t, - DeployState deployState, - HostSystem hostSystem, + AbstractConfigProducer ancestor, Element producerSpec) { - initializeProducer(t, deployState, producerSpec); + initializeProducer(t, ancestor, producerSpec); if (producerSpec != null) { if (producerSpec.hasAttribute(JVMARGS_ATTRIB_NAME)) { t.appendJvmArgs(producerSpec.getAttribute(JVMARGS_ATTRIB_NAME)); @@ -184,7 +172,7 @@ public class VespaDomBuilder extends VespaModelBuilder { if (port > 0) { t.setBasePort(port); } - allocateHost(t, hostSystem, producerSpec); + allocateHost(t, ancestor.getHostSystem(), producerSpec); } // This depends on which constructor in AbstractService is used, but the best way // is to let this method do initialize. @@ -221,7 +209,8 @@ public class VespaDomBuilder extends VespaModelBuilder { } @Override - protected SimpleConfigProducer doBuild(AbstractConfigProducer parent, Element producerSpec) { + protected SimpleConfigProducer doBuild(AbstractConfigProducer parent, + Element producerSpec) { return new SimpleConfigProducer(parent, configId); } } @@ -330,7 +319,8 @@ public class VespaDomBuilder extends VespaModelBuilder { } @Override - public List<ServiceCluster> getClusters(ApplicationPackage pkg, AbstractConfigProducer parent) { + public List<ServiceCluster> getClusters(ApplicationPackage pkg, + AbstractConfigProducer parent) { List<ServiceCluster> clusters = new ArrayList<>(); Document services = XmlHelper.getDocument(pkg.getServices()); for (Element clusterSpec : XML.getChildren(services.getDocumentElement(), "cluster")) { 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 18c5bfdcd60..f0724306e9c 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 @@ -200,20 +200,16 @@ public final class ContainerCluster public ContainerCluster(AbstractConfigProducer<?> parent, String subId, String name) { this(parent, subId, name, new AcceptAllVerifier()); } - public ContainerCluster(AbstractConfigProducer<?> parent, String subId, String name, DeployState deployState) { - this(parent, subId, name, new AcceptAllVerifier(), deployState); - } - - public ContainerCluster(AbstractConfigProducer<?> parent, String subId, String name, ContainerClusterVerifier verifier) { - this(parent, subId, name, verifier, deployStateFrom(parent)); - } /** Creates a container cluster */ - public ContainerCluster(AbstractConfigProducer<?> parent, String subId, String name, - ContainerClusterVerifier verifier, DeployState deployState) { + public ContainerCluster(AbstractConfigProducer<?> parent, + String subId, + String name, + ContainerClusterVerifier verifier) { super(parent, subId); this.clusterVerifier = verifier; this.name = name; + DeployState deployState = deployStateFrom(parent); this.isHostedVespa = stateIsHosted(deployState); this.zone = (deployState != null) ? deployState.zone() : Zone.defaultZone(); componentGroup = new ComponentGroup<>(this, "component"); @@ -342,18 +338,18 @@ public final class ContainerCluster addComponent(new SimpleComponent(className)); } - public void prepare(DeployState deployState) { - addAndSendApplicationBundles(deployState); + public void prepare() { + addAndSendApplicationBundles(); if (modelEvaluation != null) modelEvaluation.prepare(containers); sendUserConfiguredFiles(); - setApplicationMetaData(deployState); + setApplicationMetaData(); for (RestApi restApi : restApiGroup.getComponents()) restApi.prepare(); } - private void setApplicationMetaData(DeployState deployState) { - applicationMetaData = deployState.getApplicationPackage().getMetaData(); + private void setApplicationMetaData() { + applicationMetaData = getRoot().getDeployState().getApplicationPackage().getMetaData(); } public void addMbusServer(ComponentId chainId) { @@ -366,8 +362,8 @@ public final class ContainerCluster null)))); } - private void addAndSendApplicationBundles(DeployState deployState) { - for (ComponentInfo component : deployState.getApplicationPackage().getComponentsInfo(deployState.getProperties().vespaVersion())) { + private void addAndSendApplicationBundles() { + for (ComponentInfo component : getRoot().getDeployState().getApplicationPackage().getComponentsInfo(getRoot().getDeployState().getProperties().vespaVersion())) { FileReference reference = FileSender.sendFileToServices(component.getPathRelativeToAppDir(), containers); applicationBundles.add(reference); } 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 cefccca5ec8..83d749067b4 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 @@ -4,7 +4,6 @@ package com.yahoo.vespa.model.container; import com.yahoo.config.model.ConfigModel; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.ConfigModelRepo; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.model.content.Content; import com.yahoo.vespa.model.search.AbstractSearchCluster; @@ -36,9 +35,9 @@ public class ContainerModel extends ConfigModel { public ContainerCluster getCluster() { return containerCluster; } @Override - public void prepare(ConfigModelRepo plugins, DeployState deployState) { + public void prepare(ConfigModelRepo plugins) { assert (getCluster() != null) : "Null container cluster!"; - getCluster().prepare(deployState); + getCluster().prepare(); } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index 7802bd1eb65..2d3f3036ccc 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -12,7 +12,6 @@ import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.application.provider.IncludeDirs; import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.provision.AthenzService; import com.yahoo.config.provision.Capacity; @@ -24,6 +23,7 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Rotation; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.config.MetricDefaultsConfig; +import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.search.rendering.RendererRegistry; import com.yahoo.searchdefinition.derived.RankProfileList; import com.yahoo.text.XML; @@ -149,10 +149,9 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { return new VespaDomBuilder.DomConfigProducerBuilder<ContainerCluster>() { @Override protected ContainerCluster doBuild(AbstractConfigProducer ancestor, Element producerSpec) { - return new ContainerCluster(ancestor, modelContext.getProducerId(), - modelContext.getProducerId(), modelContext.getDeployState()); + return new ContainerCluster(ancestor, modelContext.getProducerId(), modelContext.getProducerId()); } - }.build(modelContext.getDeployState(), modelContext.getParentProducer(), spec); + }.build(modelContext.getParentProducer(), spec); } private void addClusterContent(ContainerCluster cluster, Element spec, ConfigModelContext context) { @@ -172,7 +171,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { addStatusHandlers(cluster, context); setDefaultMetricConsumerFactory(cluster); - addHttp(context.getDeployState(), spec, cluster); + addHttp(spec, cluster); addAccessLogs(cluster, spec); addRoutingAliases(cluster, spec, context.getDeployState().zone().environment()); @@ -330,15 +329,15 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { } - protected final void addHttp(DeployState deployState, Element spec, ContainerCluster cluster) { + protected void addHttp(Element spec, ContainerCluster cluster) { Element httpElement = XML.getChild(spec, "http"); if (httpElement != null) { - cluster.setHttp(buildHttp(deployState, cluster, httpElement)); + cluster.setHttp(buildHttp(cluster, httpElement)); } } - private Http buildHttp(DeployState deployState, ContainerCluster cluster, Element httpElement) { - Http http = new HttpBuilder().build(deployState, cluster, httpElement); + private Http buildHttp(ContainerCluster cluster, Element httpElement) { + Http http = new HttpBuilder().build(cluster, httpElement); if (networking == Networking.disable) http.removeAllServers(); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java index d268089e9c4..ec68243ec9d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java @@ -12,12 +12,10 @@ import com.yahoo.config.model.ConfigModelRepo; import com.yahoo.config.model.admin.AdminModel; import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.log.LogLevel; -import com.yahoo.vespa.model.AbstractService; -import com.yahoo.vespa.model.HostResource; -import com.yahoo.vespa.model.SimpleConfigProducer; +import com.yahoo.searchdefinition.derived.RankProfileList; +import com.yahoo.vespa.model.*; import com.yahoo.vespa.model.admin.Admin; import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.ContainerCluster; @@ -33,13 +31,7 @@ import com.yahoo.vespa.model.search.IndexingDocprocChain; import com.yahoo.vespa.model.search.SearchNode; import org.w3c.dom.Element; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.logging.Logger; /** @@ -166,7 +158,7 @@ public class Content extends ConfigModel { } @Override - public void prepare(ConfigModelRepo models, DeployState deployState) { + public void prepare(ConfigModelRepo models) { if (cluster.getRootGroup().useCpuSocketAffinity()) { setCpuSocketAffinity(); } @@ -200,7 +192,7 @@ public class Content extends ConfigModel { s.setVespaMallocDebugStackTrace(cluster.getRootGroup().getVespaMallocDebugStackTrace().get()); } } - cluster.prepare(deployState); + cluster.prepare(); } private void setCpuSocketAffinity() { 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 708c4930de1..c611cdc3dc1 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 @@ -67,10 +67,9 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot ModelElement clusterElem = new ModelElement(producerSpec); String clusterName = ContentCluster.getClusterName(clusterElem); Boolean flushOnShutdownElem = clusterElem.childAsBoolean("engine.proton.flush-on-shutdown"); - DeployState deployState = AbstractConfigProducer.deployStateFrom(ancestor); ContentSearchCluster search = new ContentSearchCluster(ancestor, clusterName, documentDefinitions, globallyDistributedDocuments, - getFlushOnShutdown(flushOnShutdownElem, deployState)); + getFlushOnShutdown(flushOnShutdownElem, AbstractConfigProducer.deployStateFrom(ancestor))); ModelElement tuning = clusterElem.getChildByPath("engine.proton.tuning"); if (tuning != null) { @@ -81,8 +80,8 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot search.setResourceLimits(DomResourceLimitsBuilder.build(protonElem)); } - buildAllStreamingSearchClusters(deployState, clusterElem, clusterName, search); - buildIndexedSearchCluster(deployState, clusterElem, clusterName, search); + buildAllStreamingSearchClusters(clusterElem, clusterName, search); + buildIndexedSearchCluster(clusterElem, clusterName, search); return search; } @@ -97,7 +96,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot return clusterElem.childAsDouble("engine.proton.query-timeout"); } - private void buildAllStreamingSearchClusters(DeployState deployState, ModelElement clusterElem, String clusterName, ContentSearchCluster search) { + private void buildAllStreamingSearchClusters(ModelElement clusterElem, String clusterName, ContentSearchCluster search) { ModelElement docElem = clusterElem.getChild("documents"); if (docElem == null) { @@ -107,20 +106,20 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot for (ModelElement docType : docElem.subElements("document")) { String mode = docType.getStringAttribute("mode"); if ("streaming".equals(mode)) { - buildStreamingSearchCluster(deployState, clusterElem, clusterName, search, docType); + buildStreamingSearchCluster(clusterElem, clusterName, search, docType); } } } - private void buildStreamingSearchCluster(DeployState deployState, ModelElement clusterElem, String clusterName, - ContentSearchCluster search, ModelElement docType) { + private void buildStreamingSearchCluster(ModelElement clusterElem, String clusterName, ContentSearchCluster search, ModelElement docType) { String docTypeName = docType.getStringAttribute("type"); StreamingSearchCluster cluster = new StreamingSearchCluster(search, clusterName + "." + docTypeName, 0, docTypeName, clusterName); - search.addSearchCluster(deployState, cluster, getQueryTimeout(clusterElem), Arrays.asList(docType)); + search.addSearchCluster(cluster, getQueryTimeout(clusterElem), Arrays.asList(docType)); } - private void buildIndexedSearchCluster(DeployState deployState, ModelElement clusterElem, - String clusterName, ContentSearchCluster search) { + private void buildIndexedSearchCluster(ModelElement clusterElem, + String clusterName, + ContentSearchCluster search) { List<ModelElement> indexedDefs = getIndexedSearchDefinitions(clusterElem); if (!indexedDefs.isEmpty()) { IndexedSearchCluster isc = new IndexedSearchCluster(search, clusterName, 0); @@ -131,7 +130,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot isc.setVisibilityDelay(visibilityDelay); } - search.addSearchCluster(deployState, isc, getQueryTimeout(clusterElem), indexedDefs); + search.addSearchCluster(isc, getQueryTimeout(clusterElem), indexedDefs); } } @@ -165,29 +164,29 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot this.flushOnShutdown = flushOnShutdown; } - void addSearchCluster(DeployState deployState, SearchCluster cluster, Double queryTimeout, List<ModelElement> documentDefs) { - addSearchDefinitions(deployState, documentDefs, cluster); + void addSearchCluster(SearchCluster cluster, Double queryTimeout, List<ModelElement> documentDefs) { + addSearchDefinitions(documentDefs, cluster); if (queryTimeout != null) { cluster.setQueryTimeout(queryTimeout); } cluster.defaultDocumentsConfig(); - cluster.deriveSearchDefinitions(deployState); + cluster.deriveSearchDefinitions(new ArrayList<>()); addCluster(cluster); } - private void addSearchDefinitions(DeployState deployState, List<ModelElement> searchDefs, AbstractSearchCluster sc) { + private void addSearchDefinitions(List<ModelElement> searchDefs, AbstractSearchCluster sc) { for (ModelElement e : searchDefs) { SearchDefinitionXMLHandler searchDefinitionXMLHandler = new SearchDefinitionXMLHandler(e); SearchDefinition searchDefinition = - searchDefinitionXMLHandler.getResponsibleSearchDefinition(deployState.getSearchDefinitions()); + searchDefinitionXMLHandler.getResponsibleSearchDefinition(sc.getRoot().getDeployState().getSearchDefinitions()); if (searchDefinition == null) throw new RuntimeException("Search definition parsing error or file does not exist: '" + searchDefinitionXMLHandler.getName() + "'"); // TODO: remove explicit building of user configs when the complete content model is built using builders. sc.getLocalSDS().add(new AbstractSearchCluster.SearchDefinitionSpec(searchDefinition, - UserConfigBuilder.build(e.getXml(), deployState, sc.getRoot().deployLogger()))); + UserConfigBuilder.build(e.getXml(), sc.getRoot().getDeployState(), sc.getRoot().deployLogger()))); //need to get the document names from this sdfile sc.addDocumentNames(searchDefinition); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java index 699da07f159..f15ba547894 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.model.content.cluster; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import com.yahoo.config.model.ConfigModelContext; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; @@ -500,11 +499,11 @@ public class ContentCluster extends AbstractConfigProducer implements this.zone = zone; } - public void prepare(DeployState deployState) { + public void prepare() { search.prepare(); if (clusterControllers != null) { - clusterControllers.prepare(deployState); + clusterControllers.prepare(); } } 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 e0dffcbc537..c46a662b682 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 @@ -1,7 +1,6 @@ // 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; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.log.LogLevel; import com.yahoo.vespa.config.search.AttributesConfig; import com.yahoo.vespa.config.search.DispatchConfig; @@ -283,16 +282,19 @@ public class IndexedSearchCluster extends SearchCluster } } } - @Override - protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, DeployState deployState) { + protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, + List<com.yahoo.searchdefinition.Search> globalSearches) { for (SearchDefinitionSpec spec : localSearches) { com.yahoo.searchdefinition.Search search = spec.getSearchDefinition().getSearch(); if ( ! (search instanceof DocumentOnlySearch)) { - DocumentDatabase db = new DocumentDatabase(this, search.getName(), - new DerivedConfiguration(search, deployLogger(), - deployState.rankProfileRegistry(), - deployState.getQueryProfiles().getRegistry(), - deployState.getImportedModels())); + DocumentDatabase db = new DocumentDatabase(this, + search.getName(), + new DerivedConfiguration(search, + globalSearches, + deployLogger(), + getRoot().getDeployState().rankProfileRegistry(), + getRoot().getDeployState().getQueryProfiles().getRegistry(), + getRoot().getDeployState().getImportedModels())); // TODO: remove explicit adding of user configs when the complete content model is built using builders. db.mergeUserConfigs(spec.getUserConfigs()); documentDbs.add(db); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.java index 34a2fc7ab0e..379c4c84e16 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.java @@ -1,7 +1,6 @@ // 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; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.searchdefinition.derived.RawRankProfile; import com.yahoo.searchdefinition.derived.SummaryMap; import com.yahoo.vespa.config.search.RankProfilesConfig; @@ -49,8 +48,8 @@ public abstract class SearchCluster extends AbstractSearchCluster * Also stores the document names contained in the search * definitions. */ - public void deriveSearchDefinitions(DeployState deployState) { - deriveAllSearchDefinitions(getLocalSDS(), deployState); + public void deriveSearchDefinitions(List<com.yahoo.searchdefinition.Search> global) { + deriveAllSearchDefinitions(getLocalSDS(), global); } @Override @@ -140,7 +139,8 @@ public abstract class SearchCluster extends AbstractSearchCluster return false; } - protected abstract void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, DeployState deployState); + protected abstract void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, + List<com.yahoo.searchdefinition.Search> globalSearches); public abstract void defaultDocumentsConfig(); public abstract DerivedConfiguration getSdConfig(); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.java index 7f177babf26..66553ebadf6 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.java @@ -1,7 +1,6 @@ // 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; -import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.prelude.fastsearch.DocumentdbInfoConfig; import com.yahoo.searchdefinition.derived.AttributeFields; @@ -90,22 +89,23 @@ public class StreamingSearchCluster extends SearchCluster implements } } - @Override - protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> local, DeployState deployState) { + protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> local, + List<com.yahoo.searchdefinition.Search> global) { if (local.size() == 1) { - deriveSingleSearchDefinition(local.get(0).getSearchDefinition().getSearch(), deployState); + deriveSingleSearchDefinition(local.get(0).getSearchDefinition().getSearch(), global); } else if (local.size() > 1){ throw new IllegalStateException("Logical indexes are not supported: Got " + local.size() + " search definitions, expected 1"); } } - private void deriveSingleSearchDefinition(com.yahoo.searchdefinition.Search localSearch, DeployState deployState) { + private void deriveSingleSearchDefinition(com.yahoo.searchdefinition.Search localSearch, + List<com.yahoo.searchdefinition.Search> globalSearches) { if (!localSearch.getName().equals(docTypeName)) { throw new IllegalStateException("Mismatch between document type name (" + docTypeName + ") and name of search definition (" + localSearch.getName() + ")"); } - this.sdConfig = new DerivedConfiguration(localSearch, deployLogger(), - deployState.rankProfileRegistry(), - deployState.getQueryProfiles().getRegistry(), - deployState.getImportedModels()); + this.sdConfig = new DerivedConfiguration(localSearch, globalSearches, deployLogger(), + getRoot().getDeployState().rankProfileRegistry(), + getRoot().getDeployState().getQueryProfiles().getRegistry(), + getRoot().getDeployState().getImportedModels()); } @Override public DerivedConfiguration getSdConfig() { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/jersey/xml/RestApiTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/jersey/xml/RestApiTest.java index e954e6343de..503b38b79b4 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/jersey/xml/RestApiTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/jersey/xml/RestApiTest.java @@ -55,7 +55,7 @@ public class RestApiTest extends ContainerModelBuilderTestBase { public void setup() throws Exception { createModel(root, restApiXml); root.validate(); - getContainerCluster(CLUSTER_ID).prepare(root.getDeployState()); + getContainerCluster(CLUSTER_ID).prepare(); restApi = getContainerCluster(CLUSTER_ID).getRestApiMap().values().iterator().next(); servlet = restApi.getJersey2Servlet(); context = restApi.getContext(); diff --git a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerApplication.java b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerApplication.java index ae7b8356682..8d2cd429517 100644 --- a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerApplication.java +++ b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerApplication.java @@ -243,7 +243,7 @@ public class StandaloneContainerApplication implements Application { Element spec = containerRootElement(applicationPackage); ContainerModel containerModel = newContainerModelBuilder(networkingOption).build(deployState, root, configModelRepo, vespaRoot, spec); - containerModel.getCluster().prepare(deployState); + containerModel.getCluster().prepare(); initializeContainerModel(containerModel, configModelRepo); Container container = first(containerModel.getCluster().getContainers()); |