diff options
Diffstat (limited to 'config-model')
12 files changed, 69 insertions, 69 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java index 4bf20e75a5d..e27e0e7624f 100644 --- a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java +++ b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java @@ -63,6 +63,8 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private double resourceLimitDisk = 0.8; private double resourceLimitMemory = 0.8; private double minNodeRatioPerGroup = 0.0; + private boolean containerDumpHeapOnShutdownTimeout = false; + private double containerShutdownTimeout = 50.0; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @Override public boolean multitenant() { return multitenant; } @@ -105,10 +107,14 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public double resourceLimitMemory() { return resourceLimitMemory; } @Override public double minNodeRatioPerGroup() { return minNodeRatioPerGroup; } @Override public int metricsproxyNumThreads() { return 1; } - @Override public boolean enforceRankProfileInheritance() { return enforceRankProfileInheritance; } - - public TestProperties enforceRankProfileInheritance(boolean value) { - enforceRankProfileInheritance = value; + @Override public double containerShutdownTimeout() { return containerShutdownTimeout; } + @Override public boolean containerDumpHeapOnShutdownTimeout() { return containerDumpHeapOnShutdownTimeout; } + public TestProperties containerDumpHeapOnShutdownTimeout(boolean value) { + containerDumpHeapOnShutdownTimeout = value; + return this; + } + public TestProperties containerShutdownTimeout(double value) { + containerShutdownTimeout = value; return this; } public TestProperties largeRankExpressionLimit(int value) { diff --git a/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java b/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java index 2784c111019..decc6e98bc4 100644 --- a/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java +++ b/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java @@ -223,15 +223,11 @@ public abstract class AbstractConfigProducer<CHILD extends AbstractConfigProduce didApply = parent.addUserConfig(builder); } - if (log.isLoggable(Level.FINEST)) { - log.log(Level.FINEST, "User configs is: " + userConfigs.toString()); - } + log.log(Level.FINEST, () -> "User configs is: " + userConfigs.toString()); // TODO: What do we do with md5. Currently ignored for user configs? ConfigDefinitionKey key = new ConfigDefinitionKey(builder.getDefName(), builder.getDefNamespace()); if (userConfigs.get(key) != null) { - if (log.isLoggable(Level.FINEST)) { - log.log(Level.FINEST, "Apply in " + configId); - } + log.log(Level.FINEST, () -> "Apply in " + configId); applyUserConfig(builder, userConfigs.get(key)); didApply = true; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/DistributableResource.java b/config-model/src/main/java/com/yahoo/searchdefinition/DistributableResource.java index 1719ea72cb0..472bc9d5413 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/DistributableResource.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/DistributableResource.java @@ -11,6 +11,7 @@ import java.util.Collection; import java.util.Objects; public class DistributableResource { + public enum PathType { FILE, URI, BLOB }; /** The search definition-unique name of this constant */ @@ -95,10 +96,9 @@ public class DistributableResource { } } + @Override public String toString() { - StringBuilder b = new StringBuilder(); - b.append("resource '").append(name).append(" of type '").append(pathType) - .append("' with ref '").append(fileReference).append("'"); - return b.toString(); + return "resource '" + name + " of type '" + pathType + "' with ref '" + fileReference + "'"; } + } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java index 9d51d39f3d0..d169760538d 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java @@ -227,12 +227,7 @@ public class RankProfile implements Cloneable { String msg = "rank-profile '" + getName() + "' inherits '" + inheritedName + "', but it does not exist anywhere in the inheritance of search '" + ((getSearch() != null) ? getSearch().getName() : " global rank profiles") + "'."; - if (search.getDeployProperties().featureFlags().enforceRankProfileInheritance()) { - throw new IllegalArgumentException(msg); - } else { - deployLogger.logApplicationPackage(Level.WARNING, msg); - inherited = resolveIndependentOfInheritance(); - } + throw new IllegalArgumentException(msg); } else { List<String> children = new ArrayList<>(); children.add(createFullyQualifiedName()); @@ -241,12 +236,7 @@ public class RankProfile implements Cloneable { } return inherited; } - private RankProfile resolveIndependentOfInheritance() { - for (RankProfile rankProfile : rankProfileRegistry.all()) { - if (rankProfile.getName().equals(inheritedName)) return rankProfile; - } - return null; - } + private String createFullyQualifiedName() { return (search != null) ? (search.getName() + "." + getName()) diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java index 46b785ccf42..ad85f68cb8a 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java @@ -100,12 +100,6 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ remaining.forEach((name, rank) -> { if (areDependenciesReady(rank, rankProfileRegistry)) ready.add(rank); }); - if (ready.isEmpty() && ! deployProperties.featureFlags().enforceRankProfileInheritance()) { - // Dirty fallback to allow incorrect rankprofile inheritance to pass for now. - // We then handle one by one. - // TODO remove ASAP - ready.add(remaining.values().iterator().next()); - } processRankProfiles(ready, queryProfiles, importedModels, search, attributeFields, deployProperties, executor); ready.forEach(rank -> remaining.remove(rank.getName())); } 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 4332d8baea8..87fa74b92fe 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 @@ -11,6 +11,7 @@ import com.yahoo.vespa.indexinglanguage.ScriptParserContext; import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; import com.yahoo.vespa.indexinglanguage.expressions.StatementExpression; import com.yahoo.vespa.indexinglanguage.linguistics.AnnotatorConfig; +import com.yahoo.yolean.Exceptions; /** * @author Einar M R Rosenvinge @@ -46,7 +47,7 @@ public class IndexingOperation implements FieldOperation { exp = new ScriptExpression(StatementExpression.newInstance(config)); } } catch (com.yahoo.vespa.indexinglanguage.parser.ParseException e) { - ParseException t = new ParseException("Error reported by IL parser: " + e.getMessage()); + ParseException t = new ParseException("Could not parse indexing statement: " + Exceptions.toMessageString(e)); t.initCause(e); throw t; } 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 937537e5f99..2c87fd5c5b3 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 @@ -492,8 +492,8 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri boolean found = configProducer.cascadeConfig(builder); boolean foundOverride = configProducer.addUserConfig(builder); log.log(Level.FINE, () -> "Trying to get config for " + builder.getClass().getDeclaringClass().getName() + - " for config id " + quote(configProducer.getConfigId()) + - ", found=" + found + ", foundOverride=" + foundOverride); + " for config id " + quote(configProducer.getConfigId()) + + ", found=" + found + ", foundOverride=" + foundOverride); } /** 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 b915453b593..cdf8d592391 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 @@ -74,6 +74,8 @@ public abstract class Container extends AbstractService implements private final boolean retired; /** The unique index of this node */ private final int index; + private final boolean dumpHeapOnShutdownTimeout; + private final double shutdownTimeoutS; private final ComponentGroup<Handler<?>> handlers = new ComponentGroup<>(this, "handler"); private final ComponentGroup<Component<?, ?>> components = new ComponentGroup<>(this, "components"); @@ -90,6 +92,8 @@ public abstract class Container extends AbstractService implements this.parent = parent; this.retired = retired; this.index = index; + dumpHeapOnShutdownTimeout = deployState.featureFlags().containerDumpHeapOnShutdownTimeout(); + shutdownTimeoutS = deployState.featureFlags().containerShutdownTimeout(); this.defaultHttpServer = new JettyHttpServer("DefaultHttpServer", containerClusterOrNull(parent), deployState.isHosted()); if (getHttp() == null) { addChild(defaultHttpServer); @@ -315,7 +319,9 @@ public abstract class Container extends AbstractService implements .slobrokId(serviceSlobrokId())) .filedistributor(filedistributorConfig()) .discriminator((clusterName != null ? clusterName + "." : "" ) + name) - .nodeIndex(index); + .nodeIndex(index) + .shutdown.dumpHeapOnTimeout(dumpHeapOnShutdownTimeout) + .timeout(shutdownTimeoutS); } /** Returns the jvm args set explicitly for this node */ diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Component.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Component.java index 6d891c55075..e7f6697aecc 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Component.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Component.java @@ -69,4 +69,10 @@ public class Component<CHILD extends AbstractConfigProducer<?>, MODEL extends Co return getComponentId().compareTo(other.getComponentId()); } + @Override + public String toString() { + return "component " + getClassId() + + (getClassId().toString().equals(getComponentId().toString()) ? "" : ": " + getComponentId()); + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/utils/FileSender.java b/config-model/src/main/java/com/yahoo/vespa/model/utils/FileSender.java index de5eaa2278e..7d761eb07eb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/utils/FileSender.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/utils/FileSender.java @@ -149,6 +149,7 @@ public class FileSender implements Serializable { String path = builder.getValue(); FileReference reference = sentFiles.get(path); if (reference == null) { + reference = fileRegistry.addFile(path); send(reference, services); sentFiles.put(path, reference); diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java index 2c1f68e5ecc..aa068ec8f0e 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileTestCase.java @@ -118,13 +118,8 @@ public class RankProfileTestCase extends SchemaTestCase { @Test public void requireThatSidewaysInheritanceIsImpossible() throws ParseException { - verifySidewaysInheritance(false); - verifySidewaysInheritance(true); - } - private void verifySidewaysInheritance(boolean enforce) throws ParseException { RankProfileRegistry registry = new RankProfileRegistry(); - SearchBuilder builder = new SearchBuilder(registry, setupQueryProfileTypes(), - new TestProperties().enforceRankProfileInheritance(enforce)); + SearchBuilder builder = new SearchBuilder(registry, setupQueryProfileTypes()); builder.importString(joinLines( "schema child1 {", " document child1 {", @@ -168,15 +163,8 @@ public class RankProfileTestCase extends SchemaTestCase { "}")); try { builder.build(true); - if (enforce) { - fail("Sideways inheritance should have been enforced"); - } else { - assertNotNull(builder.getSearch("child2")); - assertNotNull(builder.getSearch("child1")); - assertTrue(registry.get("child1", "child").inherits("parent")); - } + fail("Sideways inheritance should have been enforced"); } catch (IllegalArgumentException e) { - if (!enforce) fail("Sideways inheritance should have been allowed"); assertEquals("rank-profile 'child' inherits 'parent', but it does not exist anywhere in the inheritance of search 'child1'.", 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 2505aa3b01e..912ca23dce2 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 @@ -7,6 +7,7 @@ import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.model.NullConfigModelRegistry; import com.yahoo.config.model.api.ContainerEndpoint; import com.yahoo.config.model.api.EndpointCertificateSecrets; +import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.api.TenantSecretStore; import com.yahoo.config.model.builder.xml.test.DomBuilderTest; import com.yahoo.config.model.deploy.DeployState; @@ -681,36 +682,47 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { @Test public void qrconfig_is_produced() throws IOException, SAXException { + QrConfig qr = getQrConfig(new TestProperties()); + String hostname = HostName.getLocalhost(); // Using the same way of getting hostname as filedistribution model + assertEquals("default.container.0", qr.discriminator()); + assertEquals(19102, qr.rpc().port()); + assertEquals("vespa/service/default/container.0", qr.rpc().slobrokId()); + assertTrue(qr.rpc().enabled()); + assertEquals("", qr.rpc().host()); + assertFalse(qr.restartOnDeploy()); + assertEquals("filedistribution/" + hostname, qr.filedistributor().configid()); + assertEquals(50.0, qr.shutdown().timeout(), 0.00000000000001); + assertFalse(qr.shutdown().dumpHeapOnTimeout()); + } + private QrConfig getQrConfig(ModelContext.Properties properties) throws IOException, SAXException { String servicesXml = "<services>" + - "<admin version='3.0'>" + - " <nodes count='2'/>" + - "</admin>" + - "<container id ='default' version='1.0'>" + - " <nodes>" + - " <node hostalias='node1' />" + - " </nodes>" + - "</container>" + - "</services>"; + " <admin version='3.0'>" + + " <nodes count='2'/>" + + " </admin>" + + " <container id ='default' version='1.0'>" + + " <nodes>" + + " <node hostalias='node1' />" + + " </nodes>" + + " </container>" + + "</services>"; ApplicationPackage applicationPackage = new MockApplicationPackage.Builder() .withServices(servicesXml) .build(); VespaModel model = new VespaModel(new NullConfigModelRegistry(), new DeployState.Builder() .applicationPackage(applicationPackage) - .properties(new TestProperties()) + .properties(properties) .build()); - String hostname = HostName.getLocalhost(); // Using the same way of getting hostname as filedistribution model + return model.getConfig(QrConfig.class, "default/container.0"); + } - QrConfig config = model.getConfig(QrConfig.class, "default/container.0"); - assertEquals("default.container.0", config.discriminator()); - assertEquals(19102, config.rpc().port()); - assertEquals("vespa/service/default/container.0", config.rpc().slobrokId()); - assertTrue(config.rpc().enabled()); - assertEquals("", config.rpc().host()); - assertFalse(config.restartOnDeploy()); - assertEquals("filedistribution/" + hostname, config.filedistributor().configid()); + @Test + public void control_container_shutdown() throws IOException, SAXException { + QrConfig qr = getQrConfig(new TestProperties().containerShutdownTimeout(133).containerDumpHeapOnShutdownTimeout(true)); + assertEquals(133.0, qr.shutdown().timeout(), 0.00000000000001); + assertTrue(qr.shutdown().dumpHeapOnTimeout()); } @Test |