diff options
Diffstat (limited to 'config-model')
34 files changed, 318 insertions, 221 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentModelBuilder.java b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentModelBuilder.java index b4d72f3a456..f0b1b427531 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentModelBuilder.java @@ -302,11 +302,11 @@ public class DocumentModelBuilder { private static StructDataType handleStruct(NewDocumentType dt, SDDocumentType type) { StructDataType s = new StructDataType(type.getName()); - for (Field f : type.getDocumentType().getHeaderType().getFieldsThisTypeOnly()) { + for (Field f : type.getDocumentType().contentStruct().getFieldsThisTypeOnly()) { specialHandleAnnotationReference(dt, f); s.addField(f); } - for (StructDataType inherited : type.getDocumentType().getHeaderType().getInheritedTypes()) { + for (StructDataType inherited : type.getDocumentType().contentStruct().getInheritedTypes()) { s.inherit(inherited); } extractNestedTypes(dt, s); @@ -330,11 +330,12 @@ public class DocumentModelBuilder { } return false; } + @SuppressWarnings("deprecation") private NewDocumentType convert(SDDocumentType sdoc) { Map<AnnotationType, String> annotationInheritance = new HashMap<>(); Map<StructDataType, String> structInheritance = new HashMap<>(); NewDocumentType dt = new NewDocumentType(new NewDocumentType.Name(sdoc.getName()), - sdoc.getDocumentType().getHeaderType(), + sdoc.getDocumentType().contentStruct(), sdoc.getDocumentType().getBodyType(), sdoc.getFieldSets(), convertDocumentReferencesToNames(sdoc.getDocumentReferences())); @@ -386,7 +387,7 @@ public class DocumentModelBuilder { e.getKey().inherit(s); } } - handleStruct(dt, sdoc.getDocumentType().getHeaderType()); + handleStruct(dt, sdoc.getDocumentType().contentStruct()); handleStruct(dt, sdoc.getDocumentType().getBodyType()); extractDataTypesFromFields(dt, sdoc.fieldSet()); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/FieldOperationApplierForStructs.java b/config-model/src/main/java/com/yahoo/searchdefinition/FieldOperationApplierForStructs.java index 04b0fc6e331..9ff749a994c 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/FieldOperationApplierForStructs.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/FieldOperationApplierForStructs.java @@ -25,6 +25,7 @@ public class FieldOperationApplierForStructs extends FieldOperationApplier { } } + @SuppressWarnings("deprecation") private void copyFields(SDDocumentType structType, SDDocumentType sdoc) { //find all fields in OTHER types that have this type: List<SDDocumentType> list = new ArrayList<>(); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/IndexSchema.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/IndexSchema.java index 4566d188c45..39d51414607 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/IndexSchema.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/IndexSchema.java @@ -133,6 +133,7 @@ public class IndexSchema extends Derived implements IndexschemaConfig.Producer { } } + @SuppressWarnings("deprecation") static List<Field> flattenField(Field field) { DataType fieldType = field.getDataType(); if (fieldType.getPrimitiveType() != null){ diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java index dc2a1a2bbae..e1253d14747 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java @@ -58,11 +58,6 @@ public class ImmutableImportedSDField implements ImmutableSDField { } @Override - public boolean isHeader() { - return importedField.targetField().isHeader(); - } - - @Override public boolean isImportedField() { return true; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java index 4ae7561a7bc..21ef60cf0b9 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java @@ -10,7 +10,6 @@ import com.yahoo.vespa.indexinglanguage.expressions.Expression; import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -32,8 +31,6 @@ public interface ImmutableSDField { boolean isExtraField(); - boolean isHeader(); - boolean isImportedField(); /** diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDDocumentType.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDDocumentType.java index 98be4900ef6..c7b698f5835 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDDocumentType.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDDocumentType.java @@ -148,9 +148,10 @@ public class SDDocumentType implements Cloneable, Serializable { * @param name The name of the new document type * @param search check for type ID collisions in this search definition */ + @SuppressWarnings("deprecation") public SDDocumentType(String name, Search search) { docType = new DocumentType(name); - docType.getHeaderType().setCompressionConfig(new CompressionConfig()); + docType.contentStruct().setCompressionConfig(new CompressionConfig()); docType.getBodyType().setCompressionConfig(new CompressionConfig()); validateId(search); inherit(VESPA_DOCUMENT); @@ -163,8 +164,8 @@ public class SDDocumentType implements Cloneable, Serializable { this.structType = structType; inheritedTypes.clear(); } else { - if (docType.getHeaderType() != null) { - this.structType = docType.getHeaderType(); + if (docType.contentStruct() != null) { + this.structType = docType.contentStruct(); inheritedTypes.clear(); } else { throw new IllegalArgumentException("You can not set a null struct"); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java index dd2ffba20ec..d2d28dadfda 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java @@ -426,6 +426,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, } /** Parse an indexing expression which will use the simple linguistics implementatino suitable for testing */ + @SuppressWarnings("deprecation") public void parseIndexingScript(String script) { parseIndexingScript(script, new SimpleLinguistics(false)); } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/BodyOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/BodyOperation.java deleted file mode 100644 index 7ea11873a12..00000000000 --- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/BodyOperation.java +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.searchdefinition.fieldoperation; - -import com.yahoo.searchdefinition.document.SDField; - -/** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> - */ -public class BodyOperation implements FieldOperation { - public void apply(SDField field) { - field.setHeader(false); - field.setHeaderOrBodyDefined(true); - } -} diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/HeaderOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/HeaderOperation.java deleted file mode 100644 index 22d85f89105..00000000000 --- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/HeaderOperation.java +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.searchdefinition.fieldoperation; - -import com.yahoo.searchdefinition.document.SDField; - -/** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> - */ -public class HeaderOperation implements FieldOperation { - public void apply(SDField field) { - field.setHeader(true); - field.setHeaderOrBodyDefined(true); - } -} diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java index cd586960185..d1dc68373db 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/IndexingOperation.java @@ -12,7 +12,7 @@ import com.yahoo.vespa.indexinglanguage.expressions.StatementExpression; import com.yahoo.vespa.indexinglanguage.linguistics.AnnotatorConfig; /** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public class IndexingOperation implements FieldOperation { @@ -27,6 +27,7 @@ public class IndexingOperation implements FieldOperation { } /** Creates an indexing operation which will use the simple linguistics implementation suitable for testing */ + @SuppressWarnings("deprecation") public static IndexingOperation fromStream(SimpleCharStream input, boolean multiLine) throws ParseException { return fromStream(input, multiLine, new SimpleLinguistics(false)); } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/AddExtraFieldsToDocument.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/AddExtraFieldsToDocument.java index 803a6c5ab40..b62639961bf 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/AddExtraFieldsToDocument.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/AddExtraFieldsToDocument.java @@ -56,6 +56,7 @@ public class AddExtraFieldsToDocument extends Processor { addField(search, document, field, validate); } + @SuppressWarnings("deprecation") private void addSummaryField(Search search, SDDocumentType document, SummaryField field, boolean validate) { Field docField = document.getField(field.getName()); if (docField == null) { diff --git a/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java b/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java index 9368d6aaa39..02d500931d7 100644 --- a/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java +++ b/config-model/src/main/java/com/yahoo/vespa/configmodel/producers/DocumentManager.java @@ -70,6 +70,7 @@ public class DocumentManager { } } + @SuppressWarnings("deprecation") private void buildConfig(DataType type, Datatype.Builder builder) { builder.id(type.getId()); if (type instanceof ArrayDataType) { @@ -92,7 +93,7 @@ public class DocumentManager { builder.documenttype(doc); doc. name(dt.getName()). - headerstruct(dt.getHeaderType().getId()). + headerstruct(dt.contentStruct().getId()). bodystruct(dt.getBodyType().getId()); for (DocumentType inherited : dt.getInheritedTypes()) { doc.inherits(new Datatype.Documenttype.Inherits.Builder().name(inherited.getName())); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java b/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java index fcd9df309a4..60a49598c42 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java @@ -47,9 +47,9 @@ public abstract class AbstractService extends AbstractConfigProducer<AbstractCon /** The ports allocated to this Service. */ private List<Integer> ports = new ArrayList<>(); - /** The optional JVM execution args for this Service. */ + /** The optional JVM execution options for this Service. */ // Please keep non-null, as passed to command line in service startup - private String jvmArgs = ""; + private String jvmOptions = ""; /** The optional PRELOAD libraries for this Service. */ // Please keep non-null, as passed to command line in service startup @@ -399,23 +399,23 @@ public abstract class AbstractService extends AbstractConfigProducer<AbstractCon } /** Optional execution args for this service */ - public String getJvmArgs() { - return jvmArgs; + public String getJvmOptions() { + return jvmOptions; } - public void setJvmArgs(String args) { - jvmArgs = (args == null) ? "" : args; + public void setJvmOptions(String args) { + jvmOptions = (args == null) ? "" : args; } - public void appendJvmArgs(String args) { + public void appendJvmOptions(String args) { if ((args != null) && ! "".equals(args)) { - setJvmArgs(jvmArgs + getSeparator(jvmArgs) + args); + setJvmOptions(jvmOptions + getSeparator(jvmOptions) + args); } } private static String getSeparator(String current) { return ("".equals(current)) ? "" : " "; } - public void prependJvmArgs(String args) { + public void prependJvmOptions(String args) { if ((args != null) && ! "".equals(args)) { - setJvmArgs(args + getSeparator(jvmArgs) + jvmArgs); + setJvmOptions(args + getSeparator(jvmOptions) + jvmOptions); } } public String getPreLoad() { return preload; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/Service.java b/config-model/src/main/java/com/yahoo/vespa/model/Service.java index 29ec26b06d2..d5d33a08b5d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/Service.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/Service.java @@ -98,8 +98,8 @@ public interface Service extends ConfigProducer { */ String getHostName(); - /** Optional JVM execution args for this service */ - String getJvmArgs(); + /** Optional JVM execution options for this service */ + String getJvmOptions(); /** * Computes and returns the i'th port for this service, based on diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java index 8b98dc9d06a..c354445b690 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java @@ -29,7 +29,7 @@ public class Logserver extends AbstractService { * @return the startup command for the logserver */ public String getStartupCommand() { - return "exec $ROOT/bin/vespa-logserver-start " + getMyJVMArgs() + " " + getJvmArgs(); + return "exec $ROOT/bin/vespa-logserver-start " + getMyJVMArgs() + " " + getJvmOptions(); } /** diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java index 01dd6495d13..6a02619bdb4 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java @@ -75,7 +75,7 @@ public class DomV20ClientsBuilder { int index = clients.getVespaSpoolers().size(); VespaSpoolerService spoolerService = new VespaSpoolerServiceBuilder(index, new VespaSpooler(feederConfig, spoolConfig)). build(deployState, spoolerCfg, e); - if ("".equals(spoolerService.getJvmArgs()) && jvmArgs!=null) spoolerService.setJvmArgs(jvmArgs); + if ("".equals(spoolerService.getJvmOptions()) && jvmArgs!=null) spoolerService.setJvmOptions(jvmArgs); spoolerService.setProp("index", String.valueOf(index)); clients.getVespaSpoolers().add(spoolerService); } else { 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 1f6f7ad6c69..a6d3809ff64 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 @@ -44,7 +44,8 @@ import java.util.logging.Logger; public class VespaDomBuilder extends VespaModelBuilder { public static final String JVMARGS_ATTRIB_NAME = "jvmargs"; - public static final String GCOPTS_ATTRIB_NAME = "gcopts"; + public static final String JVM_OPTIONS = "jvm-options"; + public static final String JVM_GC_OPTIONS = "jvm-gc-options"; public static final String PRELOAD_ATTRIB_NAME = "preload"; // Intended for vespa engineers public static final String MMAP_NOCORE_LIMIT = "mmap-core-limit"; // Intended for vespa engineers public static final String CORE_ON_OOM = "core-on-oom"; // Intended for vespa engineers @@ -143,8 +144,12 @@ public class VespaDomBuilder extends VespaModelBuilder { { initializeProducer(t, deployState, producerSpec); if (producerSpec != null) { - if (producerSpec.hasAttribute(JVMARGS_ATTRIB_NAME)) { - t.appendJvmArgs(producerSpec.getAttribute(JVMARGS_ATTRIB_NAME)); + if (producerSpec.hasAttribute(JVM_OPTIONS)) { + t.appendJvmOptions(producerSpec.getAttribute(JVM_OPTIONS)); + } else { + if (producerSpec.hasAttribute(JVMARGS_ATTRIB_NAME)) { + t.appendJvmOptions(producerSpec.getAttribute(JVMARGS_ATTRIB_NAME)); + } } if (producerSpec.hasAttribute(PRELOAD_ATTRIB_NAME)) { t.setPreLoad(producerSpec.getAttribute(PRELOAD_ATTRIB_NAME)); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java b/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java index f4287cf982e..378c85dc325 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java @@ -26,7 +26,7 @@ public class VespaSpoolerService extends AbstractService implements SpoolerConfi } public String getStartupCommand() { - return "exec vespaspooler "+getJvmArgs(); + return "exec vespaspooler "+ getJvmOptions(); } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java index ab65c68dea4..e098263119c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java @@ -295,7 +295,7 @@ public class Container extends AbstractService implements } public String getStartupCommand() { - return "PRELOAD=" + getPreLoad() + " exec vespa-start-container-daemon " + getJvmArgs() + " "; + return "PRELOAD=" + getPreLoad() + " exec vespa-start-container-daemon " + getJvmOptions() + " "; } @Override @@ -315,15 +315,15 @@ public class Container extends AbstractService implements /** Returns the jvm arguments this should start with */ @Override - public String getJvmArgs() { - String jvmArgs = super.getJvmArgs(); + public String getJvmOptions() { + String jvmArgs = super.getJvmOptions(); return isHostedVespa && hasDocproc() ? ("".equals(jvmArgs) ? defaultHostedJVMArgs : defaultHostedJVMArgs + " " + jvmArgs) : jvmArgs; } /** Returns the jvm args set explicitly for this node */ - public String getAssignedJvmArgs() { return super.getJvmArgs(); } + public String getAssignedJvmOptions() { return super.getJvmOptions(); } private String serviceSlobrokId() { return "vespa/service/" + getConfigId(); 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 ccd828b5f48..29a758fee74 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 @@ -14,9 +14,6 @@ import com.yahoo.config.docproc.SchemamappingConfig; import com.yahoo.config.model.ApplicationConfigProducerRoot; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; -import com.yahoo.config.provision.Environment; -import com.yahoo.config.provision.RegionName; -import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.container.BundlesConfig; import com.yahoo.container.ComponentsConfig; @@ -144,7 +141,7 @@ public final class ContainerCluster public static final String STATISTICS_HANDLER_CLASS = "com.yahoo.container.config.StatisticsRequestHandler"; public static final String SIMPLE_LINGUISTICS_PROVIDER = "com.yahoo.language.provider.SimpleLinguisticsProvider"; public static final String CMS = "-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"; - static final String G1GC = "-XX:+UseG1GC -XX:MaxTenuringThreshold=15"; + public static final String G1GC = "-XX:+UseG1GC -XX:MaxTenuringThreshold=15"; public static final String ROOT_HANDLER_BINDING = "*://*/"; @@ -186,7 +183,7 @@ public final class ContainerCluster private Zone zone; private String hostClusterId = null; - private String gcopts = null; + private String jvmGCOptions = null; private Integer memoryPercentage = null; private static class AcceptAllVerifier implements ContainerClusterVerifier { @@ -631,20 +628,6 @@ public final class ContainerCluster if (containerSearch!=null) containerSearch.getConfig(builder); } - private String buildGCOpts(Zone zone) { - Optional<String> gcopts = getGCOpts(); - if (gcopts.isPresent()) { - return gcopts.get(); - } else if (zone.system() == SystemName.dev) { - return G1GC; - } else if (isHostedVespa()) { - return ((zone.environment() != Environment.prod) || RegionName.from("us-east-3").equals(zone.region())) - ? G1GC : CMS; - } else { - return CMS; - } - } - @Override public void getConfig(QrStartConfig.Builder builder) { QrStartConfig.Jvm.Builder jvmBuilder = new QrStartConfig.Jvm.Builder(); @@ -656,7 +639,9 @@ public final class ContainerCluster if (containerSearch!=null) { jvmBuilder.directMemorySizeCache(containerSearch.totalCacheSizeMb()); } - jvmBuilder.gcopts(buildGCOpts(getZone())); + if (jvmGCOptions != null) { + jvmBuilder.gcopts(jvmGCOptions); + } builder.jvm(jvmBuilder); } @@ -814,8 +799,8 @@ public final class ContainerCluster public Optional<String> getHostClusterId() { return Optional.ofNullable(hostClusterId); } public void setMemoryPercentage(Integer memoryPercentage) { this.memoryPercentage = memoryPercentage; } - public void setGCOpts(String gcopts) { this.gcopts = gcopts; } - public Optional<String> getGCOpts() { return Optional.ofNullable(gcopts); } + public void setJvmGCOptions(String opts) { this.jvmGCOptions = opts; } + public Optional<String> getJvmGCOptions() { return Optional.ofNullable(jvmGCOptions); } /** * Returns the percentage of host physical memory this application has specified for nodes in this cluster, 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 e8142999433..66294d3fcef 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 @@ -20,10 +20,10 @@ public class ConfigProducerGroup<CHILD extends AbstractConfigProducer<?>> extend } public void addComponent(ComponentId id, CHILD producer) { - boolean wasAdded = producerById.put(id, producer) == null; - if (!wasAdded) { - throw new IllegalArgumentException("Two entities have the same component id '" + - id + "' in the same scope."); + CHILD existing = producerById.put(id, producer); + if ( existing != null) { + throw new IllegalArgumentException("Both " + producer + " and " + existing + " are configured" + + " with the id '" + id + "'. All components must have a unique id."); } addChild(producer); } 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 f795e481f62..6b4f8c8f8b5 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 @@ -78,4 +78,9 @@ public class Chain<T extends ChainedComponent<?>> extends AbstractConfigProducer return TYPE; } + @Override + public String toString() { + return "chain '" + componentId + "'"; + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChain.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChain.java index 2605736e23b..ff211264a34 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChain.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/searchchain/SearchChain.java @@ -28,4 +28,9 @@ public class SearchChain extends Chain<Searcher<?>> { return Collections.emptyList(); } + @Override + public String toString() { + return "search chain '" + getId() + "'"; + } + } 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 ac1f313d983..91df3fee6e8 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 @@ -21,7 +21,9 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeType; +import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Rotation; +import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.config.MetricDefaultsConfig; import com.yahoo.search.rendering.RendererRegistry; @@ -456,6 +458,37 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { Pattern cmsArgs = Pattern.compile("-XX:[-+]*CMS"); return (gcAlgorithm.matcher(jvmargs).find() ||cmsArgs.matcher(jvmargs).find()); } + + private static String buildJvmGCOptions(Zone zone, String jvmGCOPtions, boolean isHostedVespa) { + if (jvmGCOPtions != null) { + return jvmGCOPtions; + } else if (zone.system() == SystemName.dev) { + return ContainerCluster.G1GC; + } else if (isHostedVespa) { + return ((zone.environment() != Environment.prod) || RegionName.from("us-east-3").equals(zone.region())) + ? ContainerCluster.G1GC : ContainerCluster.CMS; + } else { + return ContainerCluster.CMS; + } + } + private String getJvmOptions(ContainerCluster cluster, Element nodesElement, DeployLogger deployLogger) { + String jvmOptions = ""; + if (nodesElement.hasAttribute(VespaDomBuilder.JVM_OPTIONS)) { + jvmOptions = nodesElement.getAttribute(VespaDomBuilder.JVM_OPTIONS); + if (nodesElement.hasAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME)) { + String jvmArgs = nodesElement.getAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME); + throw new IllegalArgumentException("You have specified both jvm-options='" + jvmOptions + "'" + + " and deprecated jvmargs='" + jvmArgs + "'. Merge jvmargs into jvm-options."); + } + } else { + jvmOptions = nodesElement.getAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME); + if (incompatibleGCOptions(jvmOptions)) { + deployLogger.log(Level.WARNING, "You need to move out your GC related options from 'jvmargs' to 'jvm-gc-options'"); + cluster.setJvmGCOptions(ContainerCluster.CMS); + } + } + return jvmOptions; + } private void addNodesFromXml(ContainerCluster cluster, Element containerElement, ConfigModelContext context) { Element nodesElement = XML.getChild(containerElement, "nodes"); if (nodesElement == null) { // default single node on localhost @@ -464,19 +497,17 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { node.setHostResource(host); node.initService(context.getDeployLogger()); cluster.addContainers(Collections.singleton(node)); - } - else { + } else { List<Container> nodes = createNodes(cluster, nodesElement, context); - String jvmArgs = nodesElement.getAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME); - String gcopts = nodesElement.hasAttribute(VespaDomBuilder.GCOPTS_ATTRIB_NAME) - ? nodesElement.getAttribute(VespaDomBuilder.GCOPTS_ATTRIB_NAME) - : null; - if (incompatibleGCOptions(jvmArgs)) { - context.getDeployLogger().log(Level.WARNING, "You need to move out your GC related options from 'jvmargs' to 'gcopts'"); - } else { - cluster.setGCOpts(gcopts); + applyNodesTagJvmArgs(nodes, getJvmOptions(cluster, nodesElement, context.getDeployLogger())); + + if ( !cluster.getJvmGCOptions().isPresent()) { + String jvmGCOptions = nodesElement.hasAttribute(VespaDomBuilder.JVM_GC_OPTIONS) + ? nodesElement.getAttribute(VespaDomBuilder.JVM_GC_OPTIONS) + : null; + cluster.setJvmGCOptions(buildJvmGCOptions(context.getDeployState().zone(), jvmGCOptions, context.getDeployState().isHosted())); } - applyNodesTagJvmArgs(nodes, jvmArgs); + applyRoutingAliasProperties(nodes, cluster); applyDefaultPreload(nodes, nodesElement); applyMemoryPercentage(cluster, nodesElement.getAttribute(VespaDomBuilder.Allocated_MEMORY_ATTRIB_NAME)); @@ -677,8 +708,8 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { private void applyNodesTagJvmArgs(List<Container> containers, String jvmArgs) { for (Container container: containers) { - if (container.getAssignedJvmArgs().isEmpty()) - container.prependJvmArgs(jvmArgs); + if (container.getAssignedJvmOptions().isEmpty()) + container.prependJvmOptions(jvmArgs); } } diff --git a/config-model/src/main/javacc/SDParser.jj b/config-model/src/main/javacc/SDParser.jj index d1c67a6d425..a6fa472d5c4 100644 --- a/config-model/src/main/javacc/SDParser.jj +++ b/config-model/src/main/javacc/SDParser.jj @@ -70,6 +70,7 @@ import org.apache.commons.lang.StringUtils; * * @author bratseth */ + @SuppressWarnings("deprecation") public class SDParser { private DocumentTypeManager docMan = null; @@ -111,6 +112,7 @@ public class SDParser { * * @param multiline Whether or not to allow multi-line expressions. */ + @SuppressWarnings("deprecation") private IndexingOperation newIndexingOperation(boolean multiline) throws ParseException { return newIndexingOperation(multiline, new SimpleLinguistics(false)); } @@ -579,7 +581,7 @@ void compression(SDDocumentType document, String name) : <COMPRESSION> lbrace() (cfg = compressionItem(cfg) (<NL>)*)* <RBRACE> { if (name == null || name.equals("header")) { - document.getDocumentType().getHeaderType().setCompressionConfig(cfg); + document.getDocumentType().contentStruct().setCompressionConfig(cfg); } if (name == null || name.equals("body")) { document.getDocumentType().getBodyType().setCompressionConfig(cfg); diff --git a/config-model/src/main/resources/schema/common.rnc b/config-model/src/main/resources/schema/common.rnc index 6a82556f01b..73882da2b01 100644 --- a/config-model/src/main/resources/schema/common.rnc +++ b/config-model/src/main/resources/schema/common.rnc @@ -2,7 +2,8 @@ service.attlist &= attribute hostalias { xsd:NCName } service.attlist &= attribute baseport { xsd:unsignedShort }? service.attlist &= attribute jvmargs { text }? -service.attlist &= attribute gcopts { text }? +service.attlist &= attribute jvm-options { text }? +service.attlist &= attribute jvm-gc-options { text }? # preload is for internal use only service.attlist &= attribute preload { text }? diff --git a/config-model/src/main/resources/schema/containercluster.rnc b/config-model/src/main/resources/schema/containercluster.rnc index 4862fdf7a50..5dbcffce736 100644 --- a/config-model/src/main/resources/schema/containercluster.rnc +++ b/config-model/src/main/resources/schema/containercluster.rnc @@ -211,7 +211,8 @@ DocumentApi = element document-api { NodesOfContainerCluster = element nodes { attribute jvmargs { text }? & - attribute gcopts { text }? & + attribute jvm-options { text }? & + attribute jvm-gc-options { text }? & attribute preload { text }? & attribute allocated-memory { text }? & attribute cpu-socket-affinity { xsd:boolean }? & diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java index 8396cac265c..f9585224bd6 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java @@ -86,7 +86,7 @@ public class ModelProvisioningTest { " <handler id='myHandler'>" + " <component id='injected' />" + " </handler>" + - " <nodes count='2' allocated-memory='45%' gcopts='-XX:+UseParNewGC' jvmargs='-verbosegc' preload='lib/blablamalloc.so'/>" + + " <nodes count='2' allocated-memory='45%' jvm-gc-options='-XX:+UseParNewGC' jvm-options='-verbosegc' preload='lib/blablamalloc.so'/>" + "</jdisc>" + "</services>"; String hosts ="<hosts>" @@ -127,20 +127,20 @@ public class ModelProvisioningTest { assertThat(mydisc2.getContainers().get(1).getConfigId(), is("mydisc2/container.1")); assertTrue(mydisc2.getContainers().get(1).isInitialized()); - assertThat(mydisc.getContainers().get(0).getJvmArgs(), is("")); - assertThat(mydisc.getContainers().get(1).getJvmArgs(), is("")); - assertThat(mydisc.getContainers().get(2).getJvmArgs(), is("")); + assertThat(mydisc.getContainers().get(0).getJvmOptions(), is("")); + assertThat(mydisc.getContainers().get(1).getJvmOptions(), is("")); + assertThat(mydisc.getContainers().get(2).getJvmOptions(), is("")); assertThat(mydisc.getContainers().get(0).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so"))); assertThat(mydisc.getContainers().get(1).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so"))); assertThat(mydisc.getContainers().get(2).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so"))); assertThat(mydisc.getMemoryPercentage(), is(Optional.empty())); - assertThat(mydisc2.getContainers().get(0).getJvmArgs(), is("-verbosegc")); - assertThat(mydisc2.getContainers().get(1).getJvmArgs(), is("-verbosegc")); + assertThat(mydisc2.getContainers().get(0).getJvmOptions(), is("-verbosegc")); + assertThat(mydisc2.getContainers().get(1).getJvmOptions(), is("-verbosegc")); assertThat(mydisc2.getContainers().get(0).getPreLoad(), is("lib/blablamalloc.so")); assertThat(mydisc2.getContainers().get(1).getPreLoad(), is("lib/blablamalloc.so")); assertThat(mydisc2.getMemoryPercentage(), is(Optional.of(45))); - assertThat(mydisc2.getGCOpts(), is(Optional.of("-XX:+UseParNewGC"))); + assertThat(mydisc2.getJvmGCOptions(), is(Optional.of("-XX:+UseParNewGC"))); QrStartConfig.Builder qrStartBuilder = new QrStartConfig.Builder(); mydisc2.getConfig(qrStartBuilder); QrStartConfig qrsStartConfig = new QrStartConfig(qrStartBuilder); @@ -261,13 +261,13 @@ public class ModelProvisioningTest { } @Test - public void testCombinedClusterWithJvmArgs() { + public void testCombinedClusterWithJvmOptions() { String xmlWithNodes = "<?xml version='1.0' encoding='utf-8' ?>" + "<services>" + " <container version='1.0' id='container1'>" + " <document-processing/>" + - " <nodes of='content1' jvmargs='testarg'/>" + + " <nodes of='content1' jvm-options='testoption'/>" + " </container>" + " <content version='1.0' id='content1'>" + " <redundancy>2</redundancy>" + @@ -284,7 +284,7 @@ public class ModelProvisioningTest { assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); assertEquals("Nodes in container1", 2, model.getContainerClusters().get("container1").getContainers().size()); for (Container container : model.getContainerClusters().get("container1").getContainers()) - assertTrue(container.getJvmArgs().contains("testarg")); + assertTrue(container.getJvmOptions().contains("testoption")); } @Test @@ -1225,6 +1225,58 @@ public class ModelProvisioningTest { } @Test + public void testJvmArgs() { + String services = + "<?xml version='1.0' encoding='utf-8' ?>\n" + + "<jdisc version='1.0'>" + + " <search/>" + + " <nodes jvmargs='xyz' count='3'/>" + + "</jdisc>"; + int numberOfHosts = 3; + VespaModelTester tester = new VespaModelTester(); + tester.addHosts(numberOfHosts); + VespaModel model = tester.createModel(services, true); + assertEquals(numberOfHosts, model.getRoot().getHostSystem().getHosts().size()); + assertEquals("xyz", model.getContainerClusters().get("jdisc").getContainers().get(0).getAssignedJvmOptions()); + } + + @Test + public void testJvmOptions() { + String services = + "<?xml version='1.0' encoding='utf-8' ?>\n" + + "<jdisc version='1.0'>" + + " <search/>" + + " <nodes jvm-options='xyz' count='3'/>" + + "</jdisc>"; + int numberOfHosts = 3; + VespaModelTester tester = new VespaModelTester(); + tester.addHosts(numberOfHosts); + VespaModel model = tester.createModel(services, true); + assertEquals(numberOfHosts, model.getRoot().getHostSystem().getHosts().size()); + assertEquals("xyz", model.getContainerClusters().get("jdisc").getContainers().get(0).getAssignedJvmOptions()); + } + + @Test + public void testJvmOptionsOverridesJvmArgs() { + String services = + "<?xml version='1.0' encoding='utf-8' ?>\n" + + "<jdisc version='1.0'>" + + " <search/>" + + " <nodes jvm-options='xyz' jvmargs='abc' count='3'/>" + + "</jdisc>"; + int numberOfHosts = 3; + VespaModelTester tester = new VespaModelTester(); + tester.addHosts(numberOfHosts); + try { + tester.createModel(services, true); + fail("Expected exception"); + } + catch (IllegalArgumentException e) { + assertEquals("You have specified both jvm-options='xyz' and deprecated jvmargs='abc'. Merge jvmargs into jvm-options.", e.getMessage()); + } + } + + @Test public void testUsingHostaliasWithProvisioner() { String services = "<?xml version='1.0' encoding='utf-8' ?>\n" + @@ -1418,7 +1470,7 @@ public class ModelProvisioningTest { " <document-processing/>\n" + " <document-api/>\n" + " <search/>\n" + - " <nodes jvmargs=\"-Xms512m -Xmx512m\">\n" + + " <nodes jvm-options=\"-Xms512m -Xmx512m\">\n" + " <node hostalias=\"vespa-1\"/>\n" + " </nodes>\n" + " </container>\n" + @@ -1477,7 +1529,7 @@ public class ModelProvisioningTest { " <document-processing/>\n" + " <document-api/>\n" + " <search/>\n" + - " <nodes jvmargs=\"-Xms512m -Xmx512m\">\n" + + " <nodes jvm-options=\"-Xms512m -Xmx512m\">\n" + " <node hostalias=\"vespa-1\"/>\n" + " <node hostalias=\"vespa-2\"/>\n" + " <node hostalias=\"vespa-3\"/>\n" + diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/SearchImporterTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/SearchImporterTestCase.java index 127ed7a528b..0c464d668f7 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/SearchImporterTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/SearchImporterTestCase.java @@ -19,7 +19,11 @@ import org.junit.Test; import java.io.IOException; import java.util.Iterator; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * Tests importing of search definitions @@ -29,6 +33,7 @@ import static org.junit.Assert.*; public class SearchImporterTestCase extends SearchDefinitionTestCase { @Test + @SuppressWarnings("deprecation") public void testSimpleImporting() throws IOException, ParseException { RankProfileRegistry rankProfileRegistry = new RankProfileRegistry(); SearchBuilder sb = new SearchBuilder(rankProfileRegistry, new QueryProfileRegistry()); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java index e4fb19010f5..b4dea09010d 100755 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java @@ -168,45 +168,15 @@ public class ContainerClusterTest { addContainer(root.deployLogger(), cluster, "c1", "host-c1"); assertEquals(1, cluster.getContainers().size()); Container container = cluster.getContainers().get(0); - verifyJvmArgs(isHosted, hasDocProc, "", container.getJvmArgs()); - container.setJvmArgs("initial"); - verifyJvmArgs(isHosted, hasDocProc, "initial", container.getJvmArgs()); - container.prependJvmArgs("ignored"); - verifyJvmArgs(isHosted, hasDocProc, "ignored initial", container.getJvmArgs()); - container.appendJvmArgs("override"); - verifyJvmArgs(isHosted, hasDocProc, "ignored initial override", container.getJvmArgs()); - container.setJvmArgs(null); - verifyJvmArgs(isHosted, hasDocProc, "", container.getJvmArgs()); - } - - private void verifyGCOpts(boolean isHosted, String override, Zone zone, String expected) { - MockRoot root = createRoot(isHosted, zone); - ContainerCluster cluster = createContainerCluster(root, false); - addContainer(root.deployLogger(), cluster, "c1", "host-c1"); - cluster.setGCOpts(override); - assertEquals(1, cluster.getContainers().size()); - QrStartConfig.Builder qsB = new QrStartConfig.Builder(); - cluster.getConfig(qsB); - QrStartConfig qsC= new QrStartConfig(qsB); - assertEquals(expected, qsC.jvm().gcopts()); - } - - private void verifyGCOpts(boolean isHosted, Zone zone, String expected) { - verifyGCOpts(isHosted, null, zone, expected); - verifyGCOpts(isHosted, "-XX:+UseG1GC", zone, "-XX:+UseG1GC"); - Zone DEV = new Zone(SystemName.dev, zone.environment(), zone.region()); - verifyGCOpts(isHosted, null, DEV, ContainerCluster.G1GC); - verifyGCOpts(isHosted, "-XX:+UseConcMarkSweepGC", DEV, "-XX:+UseConcMarkSweepGC"); - - } - - @Test - public void requireThatGCOptsIsHonoured() { - final Zone US_EAST_3 = new Zone(Environment.prod, RegionName.from("us-east-3")); - verifyGCOpts(false, Zone.defaultZone(),ContainerCluster.CMS); - verifyGCOpts(false, US_EAST_3, ContainerCluster.CMS); - verifyGCOpts(true, Zone.defaultZone(), ContainerCluster.CMS); - verifyGCOpts(true, US_EAST_3, ContainerCluster.G1GC); + verifyJvmArgs(isHosted, hasDocProc, "", container.getJvmOptions()); + container.setJvmOptions("initial"); + verifyJvmArgs(isHosted, hasDocProc, "initial", container.getJvmOptions()); + container.prependJvmOptions("ignored"); + verifyJvmArgs(isHosted, hasDocProc, "ignored initial", container.getJvmOptions()); + container.appendJvmOptions("override"); + verifyJvmArgs(isHosted, hasDocProc, "ignored initial override", container.getJvmOptions()); + container.setJvmOptions(null); + verifyJvmArgs(isHosted, hasDocProc, "", container.getJvmOptions()); } @Test @@ -289,10 +259,10 @@ public class ContainerClusterTest { ContainerCluster cluster = createContainerCluster(root, false); addContainer(root.deployLogger(), cluster, "c1", "host-c1"); Container container = cluster.getContainers().get(0); - container.setJvmArgs(""); - String empty = container.getJvmArgs(); - container.setJvmArgs(null); - assertEquals(empty, container.getJvmArgs()); + container.setJvmOptions(""); + String empty = container.getJvmOptions(); + container.setJvmOptions(null); + assertEquals(empty, container.getJvmOptions()); } @Test diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java b/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java index 9122e855461..6ba75f1ff05 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java @@ -9,13 +9,11 @@ import org.junit.Before; import org.junit.Test; import org.w3c.dom.Element; -import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.hamcrest.Matchers.containsString; /** * @author gjoranv - * @since 5.1.11 */ public class SearchChainsTest2 { @@ -38,7 +36,8 @@ public class SearchChainsTest2 { chains.validate(); fail("Expected exception when inheriting a nonexistent search chain."); } catch (Exception e) { - assertThat(e.getMessage(), containsString("Missing chain 'nonexistent'")); + assertEquals("Missing chain 'nonexistent'.", + e.getMessage()); } } @@ -56,12 +55,13 @@ public class SearchChainsTest2 { ContainerModelBuilderTest.createModel(root, clusterElem); fail("Expected exception when declaring chains with duplicate id."); } catch (Exception e) { - assertThat(e.getMessage(), containsString("Two entities have the same component id 'same'")); + assertEquals("Both search chain 'same' and search chain 'same' are configured with the id 'same'. All components must have a unique id.", + e.getMessage()); } } @Test - public void fail_upon_user_declared_chain_with_same_id_as_builtin_chain() throws Exception { + public void fail_upon_user_declared_chain_with_same_id_as_builtin_chain() { final Element clusterElem = DomBuilderTest.parse( "<jdisc id='cluster1' version='1.0'>", ContainerModelBuilderTest.nodesXml, @@ -73,7 +73,8 @@ public class SearchChainsTest2 { ContainerModelBuilderTest.createModel(root, clusterElem); fail("Expected exception when taking the id from a builtin chain."); } catch (Exception e) { - assertThat(e.getMessage(), containsString("Two entities have the same component id 'vespa'")); + assertEquals("Both search chain 'vespa' and search chain 'vespa' are configured with the id 'vespa'. All components must have a unique id.", + e.getMessage()); } } } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java index a3e24b8a520..396fe3e0af5 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java @@ -14,6 +14,7 @@ import com.yahoo.config.model.provision.InMemoryProvisioner; import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.container.ComponentsConfig; import com.yahoo.container.QrConfig; @@ -69,7 +70,7 @@ import static org.junit.Assert.fail; public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { @Test - public void detect_conflicting_gcoptions_in_jvmargs() { + public void detect_conflicting_jvmgcoptions_in_jvmargs() { assertFalse(ContainerModelBuilder.incompatibleGCOptions("")); assertFalse(ContainerModelBuilder.incompatibleGCOptions("UseG1GC")); assertTrue(ContainerModelBuilder.incompatibleGCOptions("-XX:+UseG1GC")); @@ -78,11 +79,11 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void honours_gcopts() { + public void honours_jvm_gc_options() { Element clusterElem = DomBuilderTest.parse( "<jdisc version='1.0'>", " <search/>", - " <nodes gcopts='-XX:+UseG1GC'>", + " <nodes jvm-gc-options='-XX:+UseG1GC'>", " <node hostalias='mockhost'/>", " </nodes>", "</jdisc>" ); @@ -93,23 +94,84 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { assertEquals("-XX:+UseG1GC", qrStartConfig.jvm().gcopts()); } + private static void verifyIgnoreJvmGCOptions(boolean isHosted) throws IOException, SAXException { + verifyIgnoreJvmGCOptionsIfJvmArgs(isHosted, "jvmargs", ContainerCluster.CMS); + verifyIgnoreJvmGCOptionsIfJvmArgs(isHosted, "jvm-options", "-XX:+UseG1GC"); + + } + private static void verifyIgnoreJvmGCOptionsIfJvmArgs(boolean isHosted, String jvmOptionsName, String expectedGC) throws IOException, SAXException { + String servicesXml = + "<jdisc version='1.0'>" + + " <nodes jvm-gc-options='-XX:+UseG1GC' " + jvmOptionsName + "='-XX:+UseParNewGC'>" + + " <node hostalias='mockhost'/>" + + " </nodes>" + + "</jdisc>"; + ApplicationPackage applicationPackage = new MockApplicationPackage.Builder().withServices(servicesXml).build(); + // Need to create VespaModel to make deploy properties have effect + final MyLogger logger = new MyLogger(); + VespaModel model = new VespaModel(new NullConfigModelRegistry(), new DeployState.Builder() + .applicationPackage(applicationPackage) + .deployLogger(logger) + .zone(new Zone(SystemName.cd, Environment.dev, RegionName.from("here"))) + .properties(new DeployProperties.Builder() + .hostedVespa(isHosted) + .build()) + .build()); + QrStartConfig.Builder qrStartBuilder = new QrStartConfig.Builder(); + model.getConfig(qrStartBuilder, "jdisc/container.0"); + QrStartConfig qrStartConfig = new QrStartConfig(qrStartBuilder); + assertEquals(expectedGC, qrStartConfig.jvm().gcopts()); + } + @Test - public void ignores_gcopts_on_conflicting_jvargs() { - Element clusterElem = DomBuilderTest.parse( - "<jdisc version='1.0'>", - " <nodes gcopts='-XX:+UseG1GC' jvmargs='-XX:+UseParNewGC'>", - " <node hostalias='mockhost'/>", - " </nodes>", - "</jdisc>" ); - createModel(root, clusterElem); + public void ignores_jvmgcoptions_on_conflicting_jvmargs() throws IOException, SAXException { + verifyIgnoreJvmGCOptions(false); + verifyIgnoreJvmGCOptions(true); + } + + private void verifyJvmGCOptions(boolean isHosted, String override, Zone zone, String expected) throws IOException, SAXException { + String servicesXml = + "<jdisc version='1.0'>" + + " <nodes " + ((override == null) ? ">" : ("jvm-gc-options='" + override + "'>")) + + " <node hostalias='mockhost'/>" + + " </nodes>" + + "</jdisc>"; + ApplicationPackage applicationPackage = new MockApplicationPackage.Builder().withServices(servicesXml).build(); + // Need to create VespaModel to make deploy properties have effect + final MyLogger logger = new MyLogger(); + VespaModel model = new VespaModel(new NullConfigModelRegistry(), new DeployState.Builder() + .applicationPackage(applicationPackage) + .deployLogger(logger) + .zone(zone) + .properties(new DeployProperties.Builder() + .hostedVespa(isHosted) + .build()) + .build()); QrStartConfig.Builder qrStartBuilder = new QrStartConfig.Builder(); - root.getConfig(qrStartBuilder, "jdisc/container.0"); + model.getConfig(qrStartBuilder, "jdisc/container.0"); QrStartConfig qrStartConfig = new QrStartConfig(qrStartBuilder); - assertEquals(ContainerCluster.CMS, qrStartConfig.jvm().gcopts()); + assertEquals(expected, qrStartConfig.jvm().gcopts()); + } + + private void verifyJvmGCOptions(boolean isHosted, Zone zone, String expected) throws IOException, SAXException { + verifyJvmGCOptions(isHosted, null, zone, expected); + verifyJvmGCOptions(isHosted, "-XX:+UseG1GC", zone, "-XX:+UseG1GC"); + Zone DEV = new Zone(SystemName.dev, zone.environment(), zone.region()); + verifyJvmGCOptions(isHosted, null, DEV, ContainerCluster.G1GC); + verifyJvmGCOptions(isHosted, "-XX:+UseConcMarkSweepGC", DEV, "-XX:+UseConcMarkSweepGC"); + } + + @Test + public void requireThatJvmGCOptionsIsHonoured() throws IOException, SAXException { + final Zone US_EAST_3 = new Zone(Environment.prod, RegionName.from("us-east-3")); + verifyJvmGCOptions(false, Zone.defaultZone(),ContainerCluster.CMS); + verifyJvmGCOptions(false, US_EAST_3, ContainerCluster.CMS); + verifyJvmGCOptions(true, Zone.defaultZone(), ContainerCluster.CMS); + verifyJvmGCOptions(true, US_EAST_3, ContainerCluster.G1GC); } @Test - public void default_port_is_4080() throws Exception { + public void default_port_is_4080() { Element clusterElem = DomBuilderTest.parse( "<jdisc version='1.0'>", nodesXml, @@ -120,7 +182,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void http_server_port_is_configurable_and_does_not_affect_other_ports() throws Exception { + public void http_server_port_is_configurable_and_does_not_affect_other_ports() { Element clusterElem = DomBuilderTest.parse( "<jdisc version='1.0'>", " <http>", @@ -162,7 +224,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { assertThat(logger.msgs.get(0).getSecond(), containsString(String.format("You cannot set port to anything else than %d", Container.BASEPORT))); } - private class MyLogger implements DeployLogger { + private static class MyLogger implements DeployLogger { List<Pair<Level, String>> msgs = new ArrayList<>(); @Override public void log(Level level, String message) { @@ -171,7 +233,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void one_cluster_with_explicit_port_and_one_without_is_ok() throws Exception { + public void one_cluster_with_explicit_port_and_one_without_is_ok() { Element cluster1Elem = DomBuilderTest.parse( "<jdisc id='cluster1' version='1.0' />"); Element cluster2Elem = DomBuilderTest.parse( @@ -184,7 +246,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void two_clusters_without_explicit_port_throws_exception() throws SAXException, IOException { + public void two_clusters_without_explicit_port_throws_exception() { Element cluster1Elem = DomBuilderTest.parse( "<jdisc id='cluster1' version='1.0'>", nodesXml, @@ -202,7 +264,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void verify_bindings_for_builtin_handlers() throws Exception { + public void verify_bindings_for_builtin_handlers() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0' />" ); @@ -226,7 +288,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void default_root_handler_is_disabled_when_user_adds_a_handler_with_same_binding() throws Exception { + public void default_root_handler_is_disabled_when_user_adds_a_handler_with_same_binding() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>" + " <handler id='userRootHandler'>" + @@ -240,7 +302,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void handler_bindings_are_included_in_discBindings_config() throws Exception { + public void handler_bindings_are_included_in_discBindings_config() { createClusterWithJDiscHandler(); String discBindingsConfig = root.getConfig(JdiscBindingsConfig.class, "default").toString(); assertThat(discBindingsConfig, containsString("{discHandler}")); @@ -250,12 +312,12 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void handlers_are_included_in_components_config() throws Exception { + public void handlers_are_included_in_components_config() { createClusterWithJDiscHandler(); assertThat(componentsConfig().toString(), containsString(".id \"discHandler\"")); } - private void createClusterWithJDiscHandler() throws SAXException, IOException { + private void createClusterWithJDiscHandler() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <handler id='discHandler'>", @@ -269,14 +331,14 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void servlets_are_included_in_ServletPathConfig() throws Exception { + public void servlets_are_included_in_ServletPathConfig() { createClusterWithServlet(); ServletPathsConfig servletPathsConfig = root.getConfig(ServletPathsConfig.class, "default"); assertThat(servletPathsConfig.servlets().values().iterator().next().path(), is("p/a/t/h")); } @Test - public void servletconfig_is_produced() throws Exception { + public void servletconfig_is_produced() { createClusterWithServlet(); String configId = getContainerCluster("default").getServletMap(). @@ -287,7 +349,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { assertThat(servletConfig.map().get("myKey"), is("myValue")); } - private void createClusterWithServlet() throws SAXException, IOException { + private void createClusterWithServlet() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <servlet id='myServlet' class='myClass' bundle='myBundle'>", @@ -303,7 +365,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { @Test - public void processing_handler_bindings_can_be_overridden() throws Exception { + public void processing_handler_bindings_can_be_overridden() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <processing>", @@ -321,7 +383,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void clientProvider_bindings_are_included_in_discBindings_config() throws Exception { + public void clientProvider_bindings_are_included_in_discBindings_config() { createModelWithClientProvider(); String discBindingsConfig = root.getConfig(JdiscBindingsConfig.class, "default").toString(); assertThat(discBindingsConfig, containsString("{discClient}")); @@ -331,12 +393,12 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void clientProviders_are_included_in_components_config() throws Exception { + public void clientProviders_are_included_in_components_config() { createModelWithClientProvider(); assertThat(componentsConfig().toString(), containsString(".id \"discClient\"")); } - private void createModelWithClientProvider() throws SAXException, IOException { + private void createModelWithClientProvider() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>" + " <client id='discClient'>" + @@ -350,7 +412,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void serverProviders_are_included_in_components_config() throws Exception { + public void serverProviders_are_included_in_components_config() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>" + " <server id='discServer' />" + @@ -367,7 +429,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void searchHandler_gets_only_search_chains_in_chains_config() throws Exception { + public void searchHandler_gets_only_search_chains_in_chains_config() { createClusterWithProcessingAndSearchChains(); String searchHandlerConfigId = "default/component/com.yahoo.search.handler.SearchHandler"; String chainsConfig = getChainsConfig(searchHandlerConfigId); @@ -376,7 +438,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void processingHandler_gets_only_processing_chains_in_chains_config() throws Exception { + public void processingHandler_gets_only_processing_chains_in_chains_config() { createClusterWithProcessingAndSearchChains(); String processingHandlerConfigId = "default/component/com.yahoo.processing.handler.ProcessingHandler"; String chainsConfig = getChainsConfig(processingHandlerConfigId); @@ -384,7 +446,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { assertThat(chainsConfig, not(containsLineWithPattern(".*\\.id \"testSearcher@default\"$"))); } - private void createClusterWithProcessingAndSearchChains() throws SAXException, IOException { + private void createClusterWithProcessingAndSearchChains() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>" + " <search>" + @@ -404,7 +466,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void user_config_can_be_overridden_on_node() throws Exception { + public void user_config_can_be_overridden_on_node() { Element containerElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <config name=\"prelude.cluster.qr-monitor\">" + @@ -429,7 +491,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void legacy_yca_filter_and_its_config_provider_are_included_in_components_config() throws Exception { + public void legacy_yca_filter_and_its_config_provider_are_included_in_components_config() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <filter id='YcaFilter' /> ", @@ -443,7 +505,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void nested_components_are_injected_to_handlers() throws Exception { + public void nested_components_are_injected_to_handlers() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <handler id='myHandler'>", @@ -474,7 +536,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void affinity_is_set() throws IOException, SAXException { + public void affinity_is_set() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <http>", @@ -516,7 +578,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void http_aliases_are_stored_on_cluster_and_on_service_properties() throws SAXException, IOException { + public void http_aliases_are_stored_on_cluster_and_on_service_properties() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <aliases>", @@ -541,7 +603,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test - public void http_aliases_are_only_honored_in_prod_environment() throws SAXException, IOException { + public void http_aliases_are_only_honored_in_prod_environment() { Element clusterElem = DomBuilderTest.parse( "<jdisc id='default' version='1.0'>", " <aliases>", @@ -578,17 +640,17 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { } @Test(expected = IllegalArgumentException.class) - public void renderers_named_JsonRenderer_are_not_allowed() throws IOException, SAXException { + public void renderers_named_JsonRenderer_are_not_allowed() { createModel(root, generateContainerElementWithRenderer("JsonRenderer")); } @Test(expected = IllegalArgumentException.class) - public void renderers_named_DefaultRenderer_are_not_allowed() throws IOException, SAXException { + public void renderers_named_DefaultRenderer_are_not_allowed() { createModel(root, generateContainerElementWithRenderer("DefaultRenderer")); } @Test - public void renderers_named_something_else_are_allowed() throws IOException, SAXException { + public void renderers_named_something_else_are_allowed() { createModel(root, generateContainerElementWithRenderer("my-little-renderer")); } @@ -642,15 +704,15 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { assertEquals("default.container.0", config.discriminator()); assertEquals(19102, config.rpc().port()); assertEquals("vespa/service/default/container.0", config.rpc().slobrokId()); - assertEquals(true, config.rpc().enabled()); + assertTrue(config.rpc().enabled()); assertEquals("", config.rpc().host()); - assertEquals(false, config.restartOnDeploy()); - assertEquals(false, config.coveragereports()); + assertFalse(config.restartOnDeploy()); + assertFalse(config.coveragereports()); assertEquals("filedistribution/" + hostname, config.filedistributor().configid()); } @Test - public void secret_store_can_be_set_up() throws IOException, SAXException { + public void secret_store_can_be_set_up() { Element clusterElem = DomBuilderTest.parse( "<jdisc version='1.0'>", " <secret-store>", diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java index 69e2dba556a..31c1e250183 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java @@ -26,7 +26,7 @@ public class StorageGroupTest { "<content id=\"storage\">\n" + " <documents/>" + " <group>\n" + - " <node jvmargs=\"foo\" hostalias=\"mockhost\" distribution-key=\"0\"/>\n" + + " <node hostalias=\"mockhost\" distribution-key=\"0\"/>\n" + " <node hostalias=\"mockhost\" distribution-key=\"1\"/>\n" + " </group>\n" + "</content>" diff --git a/config-model/src/test/schema-test-files/services.xml b/config-model/src/test/schema-test-files/services.xml index 632abe68ab7..43a8d31e2ee 100644 --- a/config-model/src/test/schema-test-files/services.xml +++ b/config-model/src/test/schema-test-files/services.xml @@ -209,7 +209,7 @@ </server> - <nodes jvmargs="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps"> + <nodes jvm-options="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps"> <node hostalias="host1" /> <node hostalias="host1"> <server-port id="myServer" port="4090" /> |