diff options
Diffstat (limited to 'config-model/src')
8 files changed, 162 insertions, 31 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 308dcf25d2a..62c192e2c99 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 @@ -64,6 +64,8 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private boolean allowDisableMtls = true; private boolean dryRunOnnxOnSetup = false; private List<X509Certificate> operatorCertificates = Collections.emptyList(); + private double resourceLimitDisk = 0.8; + private double resourceLimitMemory = 0.8; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @Override public boolean multitenant() { return multitenant; } @@ -107,6 +109,8 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public int maxConcurrentMergesPerNode() { return maxConcurrentMergesPerNode; } @Override public int maxMergeQueueSize() { return maxMergeQueueSize; } @Override public boolean dryRunOnnxOnSetup() { return dryRunOnnxOnSetup; } + @Override public double resourceLimitDisk() { return resourceLimitDisk; } + @Override public double resourceLimitMemory() { return resourceLimitMemory; } public TestProperties setDryRunOnnxOnSetup(boolean value) { dryRunOnnxOnSetup = value; @@ -260,6 +264,16 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea return this; } + public TestProperties setResourceLimitDisk(double value) { + this.resourceLimitDisk = value; + return this; + } + + public TestProperties setResourceLimitMemory(double value) { + this.resourceLimitMemory = value; + return this; + } + public static class Spec implements ConfigServerSpec { private final String hostName; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java index 1743d5f4432..65b70bdce33 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java @@ -322,6 +322,7 @@ public class VespaMetricSet { metrics.add(new Metric("documents_total.count")); metrics.add(new Metric("dispatch_internal.rate")); metrics.add(new Metric("dispatch_fdispatch.rate")); + addMetric(metrics, "jdisc.search.render_latency", Set.of("min", "max", "count", "sum", "last")); metrics.add(new Metric("totalhits_per_query.max")); metrics.add(new Metric("totalhits_per_query.sum")); @@ -783,7 +784,7 @@ public class VespaMetricSet { return metrics; } - private static void addMetric(Set<Metric> metrics, String metricName, List<String> aggregateSuffices) { + private static void addMetric(Set<Metric> metrics, String metricName, Iterable<String> aggregateSuffices) { for (String suffix : aggregateSuffices) { metrics.add(new Metric(metricName + "." + suffix)); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java index 317ed0f66c7..fde3e3f012e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java @@ -111,6 +111,8 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat addSimpleComponent("com.yahoo.container.jdisc.AthenzIdentityProviderProvider"); addSimpleComponent("com.yahoo.container.jdisc.SystemInfoProvider"); addSimpleComponent(com.yahoo.container.core.documentapi.DocumentAccessProvider.class.getName()); + addSimpleComponent("com.yahoo.container.jdisc.messagebus.SessionCache"); + addMetricsHandlers(); addTestrunnerComponentsIfTester(deployState); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterResourceLimits.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterResourceLimits.java index 638864d85bb..dc5e6c9baee 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterResourceLimits.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterResourceLimits.java @@ -39,15 +39,21 @@ public class ClusterResourceLimits { private final boolean hostedVespa; private final boolean throwIfSpecified; private final DeployLogger deployLogger; + private final double resourceLimitDisk; + private final double resourceLimitMemory; private ResourceLimits.Builder ctrlBuilder = new ResourceLimits.Builder(); private ResourceLimits.Builder nodeBuilder = new ResourceLimits.Builder(); - public Builder(boolean enableFeedBlockInDistributor, boolean hostedVespa, boolean throwIfSpecified, DeployLogger deployLogger) { + public Builder(boolean enableFeedBlockInDistributor, boolean hostedVespa, boolean throwIfSpecified, + DeployLogger deployLogger, double resourceLimitDisk, double resourceLimitMemory) { this.enableFeedBlockInDistributor = enableFeedBlockInDistributor; this.hostedVespa = hostedVespa; this.throwIfSpecified = throwIfSpecified; this.deployLogger = deployLogger; + this.resourceLimitDisk = resourceLimitDisk; + this.resourceLimitMemory = resourceLimitMemory; + verifyLimits(resourceLimitDisk, resourceLimitMemory); } public ClusterResourceLimits build(ModelElement clusterElem) { @@ -80,8 +86,14 @@ public class ClusterResourceLimits { private void deriveLimits() { if (enableFeedBlockInDistributor) { // This also ensures that content nodes limits are derived according to the formula in calcContentNodeLimit(). - considerSettingDefaultClusterControllerLimit(ctrlBuilder.getDiskLimit(), nodeBuilder.getDiskLimit(), ctrlBuilder::setDiskLimit); - considerSettingDefaultClusterControllerLimit(ctrlBuilder.getMemoryLimit(), nodeBuilder.getMemoryLimit(), ctrlBuilder::setMemoryLimit); + considerSettingDefaultClusterControllerLimit(ctrlBuilder.getDiskLimit(), + nodeBuilder.getDiskLimit(), + ctrlBuilder::setDiskLimit, + resourceLimitDisk); + considerSettingDefaultClusterControllerLimit(ctrlBuilder.getMemoryLimit(), + nodeBuilder.getMemoryLimit(), + ctrlBuilder::setMemoryLimit, + resourceLimitMemory); } deriveClusterControllerLimit(ctrlBuilder.getDiskLimit(), nodeBuilder.getDiskLimit(), ctrlBuilder::setDiskLimit); @@ -93,10 +105,11 @@ public class ClusterResourceLimits { private void considerSettingDefaultClusterControllerLimit(Optional<Double> clusterControllerLimit, Optional<Double> contentNodeLimit, - Consumer<Double> setter) { + Consumer<Double> setter, + double resourceLimit) { // TODO: remove this when feed block in distributor is default enabled. if (clusterControllerLimit.isEmpty() && contentNodeLimit.isEmpty()) { - setter.accept(0.8); + setter.accept(resourceLimit); } } @@ -120,10 +133,25 @@ public class ClusterResourceLimits { } private double calcContentNodeLimit(double clusterControllerLimit) { - // Note that validation in the range [0.0-1.0] is handled by the rnc schema. return clusterControllerLimit + ((1.0 - clusterControllerLimit) / 2); } + + private void verifyLimits(double resourceLimitDisk, double resourceLimitMemory) { + verifyLimitInRange(resourceLimitDisk, "disk"); + verifyLimitInRange(resourceLimitMemory, "memory"); + } + + private void verifyLimitInRange(double limit, String type) { + String message = "Resource limit for " + type + " is set to illegal value " + limit + + ", but must be in the range [0.0, 1.0]"; + if (limit < 0.0) + throw new IllegalArgumentException(message); + + if (limit > 1.0) + throw new IllegalArgumentException(message); + } + } } 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 c298b7f5f5a..fabcbbcc9ec 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 @@ -124,7 +124,9 @@ public class ContentCluster extends AbstractConfigProducer<AbstractConfigProduce var resourceLimits = new ClusterResourceLimits.Builder(enableFeedBlockInDistributor, stateIsHosted(deployState), deployState.featureFlags().throwIfResourceLimitsSpecified(), - deployState.getDeployLogger()) + deployState.getDeployLogger(), + deployState.featureFlags().resourceLimitDisk(), + deployState.featureFlags().resourceLimitMemory()) .build(contentElement); c.clusterControllerConfig = new ClusterControllerConfig.Builder(getClusterId(contentElement), contentElement, diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/DomResourceLimitsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/DomResourceLimitsBuilder.java index 37adb73bc15..32b0f5b6477 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/DomResourceLimitsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/DomResourceLimitsBuilder.java @@ -24,10 +24,12 @@ public class DomResourceLimitsBuilder { if (hostedVespa) { String message = "Element '" + resourceLimits + "' is not allowed to be set"; - if (throwIfSpecified) - throw new IllegalArgumentException(message); - else - deployLogger.logApplicationPackage(Level.WARNING, message); + if (throwIfSpecified) throw new IllegalArgumentException(message); + + + deployLogger.logApplicationPackage(Level.WARNING, message); + // TODO: return (default values will then be used). Cannot be done now as an app needs current behavior + //return builder; } if (resourceLimits.child("disk") != null) { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/ClusterResourceLimitsTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/ClusterResourceLimitsTest.java index 4324f257922..c0b1a64bace 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/ClusterResourceLimitsTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/ClusterResourceLimitsTest.java @@ -2,10 +2,13 @@ package com.yahoo.vespa.model.content; import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.application.provider.BaseDeployLogger; +import com.yahoo.config.model.deploy.TestProperties; import com.yahoo.searchdefinition.derived.TestableDeployLogger; import com.yahoo.text.XML; import com.yahoo.vespa.model.builder.xml.dom.ModelElement; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -24,15 +27,23 @@ public class ClusterResourceLimitsTest { private static class Fixture { private final boolean enableFeedBlockInDistributor; + private final boolean hostedVespa; + private final boolean throwIfSpecified; private final ResourceLimits.Builder ctrlBuilder = new ResourceLimits.Builder(); private final ResourceLimits.Builder nodeBuilder = new ResourceLimits.Builder(); public Fixture() { - this.enableFeedBlockInDistributor = false; + this(false); } public Fixture(boolean enableFeedBlockInDistributor) { + this(enableFeedBlockInDistributor, false, false); + } + + public Fixture(boolean enableFeedBlockInDistributor, boolean hostedVespa, boolean throwIfSpecified) { this.enableFeedBlockInDistributor = enableFeedBlockInDistributor; + this.hostedVespa = hostedVespa; + this.throwIfSpecified = throwIfSpecified; } public Fixture ctrlDisk(double limit) { @@ -52,10 +63,13 @@ public class ClusterResourceLimitsTest { return this; } public ClusterResourceLimits build() { + ModelContext.FeatureFlags featureFlags = new TestProperties(); var builder = new ClusterResourceLimits.Builder(enableFeedBlockInDistributor, - false, - false, - new BaseDeployLogger()); + hostedVespa, + throwIfSpecified, + new BaseDeployLogger(), + featureFlags.resourceLimitDisk(), + featureFlags.resourceLimitMemory()); builder.setClusterControllerBuilder(ctrlBuilder); builder.setContentNodeBuilder(nodeBuilder); return builder.build(); @@ -130,27 +144,86 @@ public class ClusterResourceLimitsTest { } @Test - public void exception_is_thrown_when_resource_limits_are_specified() { + @Ignore // TODO: Remove hosted_limits_are_used_if_app_is_allowed_to_set_limits and enable this when code is fixed to do so + public void hosted_log_when_resource_limits_are_specified() { TestableDeployLogger logger = new TestableDeployLogger(); - buildClusterResourceLimitsAndLogIfSpecified(logger); + var limits = hostedBuildAndLogIfSpecified(logger); assertEquals(1, logger.warnings.size()); assertEquals("Element 'resource-limits' is not allowed to be set", logger.warnings.get(0)); + // Verify that default limits are used + assertLimits(0.8, 0.8, limits.getClusterControllerLimits()); + assertLimits(0.9, 0.9, limits.getContentNodeLimits()); + } + + @Test + public void hosted_exception_is_thrown_when_resource_limits_are_specified() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(containsString("Element 'resource-limits' is not allowed to be set")); - buildClusterResourceLimitsAndThrowIfSpecified(logger); + hostedBuildAndThrowIfSpecified(); + } + + @Test + // TODO: Remove this and enable hosted_log_when_resource_limits_are_specified when code is fixed to do so + public void hosted_limits_are_used_if_app_is_allowed_to_set_limits() { + TestableDeployLogger logger = new TestableDeployLogger(); + + var limits = hostedBuildAndLogIfSpecified(logger); + assertEquals(1, logger.warnings.size()); + assertEquals("Element 'resource-limits' is not allowed to be set", logger.warnings.get(0)); + + // Verify that limits in XML are used + assertLimits(0.8, 0.92, limits.getClusterControllerLimits()); + assertLimits(0.9, 0.96, limits.getContentNodeLimits()); + } + + @Test + public void hosted_limits_from_feature_flag_are_used() { + TestableDeployLogger logger = new TestableDeployLogger(); + + TestProperties featureFlags = new TestProperties(); + featureFlags.setResourceLimitDisk(0.85); + featureFlags.setResourceLimitMemory(0.90); + var limits = hostedBuild(false, logger, featureFlags, false); + + // Verify that limits from feature flags are used + assertLimits(0.85, 0.90, limits.getClusterControllerLimits()); + assertLimits(0.925, 0.95, limits.getContentNodeLimits()); } - private void buildClusterResourceLimitsAndThrowIfSpecified(DeployLogger deployLogger) { - buildClusterResourceLimits(true, deployLogger); + @Test + public void exception_is_thrown_when_resource_limits_are_out_of_range() { + TestableDeployLogger logger = new TestableDeployLogger(); + + TestProperties featureFlags = new TestProperties(); + featureFlags.setResourceLimitDisk(1.1); + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage(containsString("Resource limit for disk is set to illegal value 1.1, but must be in the range [0.0, 1.0]")); + hostedBuild(false, logger, featureFlags, false); + + featureFlags = new TestProperties(); + featureFlags.setResourceLimitDisk(-0.1); + expectedException.expectMessage(containsString("Resource limit for disk is set to illegal value -0.1, but must be in the range [0.0, 1.0]")); + hostedBuild(false, logger, featureFlags, false); + } + + private void hostedBuildAndThrowIfSpecified() { + hostedBuild(true, new TestableDeployLogger(), new TestProperties(), true); } - private void buildClusterResourceLimitsAndLogIfSpecified(DeployLogger deployLogger) { - buildClusterResourceLimits(false, deployLogger); + private ClusterResourceLimits hostedBuildAndLogIfSpecified(DeployLogger deployLogger) { + return hostedBuild(false, deployLogger); } - private void buildClusterResourceLimits(boolean throwIfSpecified, DeployLogger deployLogger) { + private ClusterResourceLimits hostedBuild(boolean throwIfSpecified, DeployLogger deployLogger) { + return hostedBuild(throwIfSpecified, deployLogger, new TestProperties(), true); + } + + private ClusterResourceLimits hostedBuild(boolean throwIfSpecified, + DeployLogger deployLogger, + ModelContext.FeatureFlags featureFlags, + boolean limitsInXml) { Document clusterXml = XML.getDocument("<cluster id=\"test\">" + " <tuning>\n" + " <resource-limits>\n" + @@ -159,11 +232,16 @@ public class ClusterResourceLimitsTest { " </tuning>\n" + "</cluster>"); + Document noLimitsXml = XML.getDocument("<cluster id=\"test\">" + + "</cluster>"); + ClusterResourceLimits.Builder builder = new ClusterResourceLimits.Builder(true, true, throwIfSpecified, - deployLogger); - builder.build(new ModelElement(clusterXml.getDocumentElement())); + deployLogger, + featureFlags.resourceLimitDisk(), + featureFlags.resourceLimitMemory()); + return builder.build(new ModelElement((limitsInXml ? clusterXml : noLimitsXml).getDocumentElement())); } private void assertLimits(Double expCtrlDisk, Double expCtrlMemory, Double expNodeDisk, Double expNodeMemory, Fixture f) { @@ -173,15 +251,15 @@ public class ClusterResourceLimitsTest { } private void assertLimits(Double expDisk, Double expMemory, ResourceLimits limits) { - assertLimit(expDisk, limits.getDiskLimit()); - assertLimit(expMemory, limits.getMemoryLimit()); + assertLimit(expDisk, limits.getDiskLimit(), "disk"); + assertLimit(expMemory, limits.getMemoryLimit(), "memory"); } - private void assertLimit(Double expLimit, Optional<Double> actLimit) { + private void assertLimit(Double expLimit, Optional<Double> actLimit, String limitType) { if (expLimit == null) { assertFalse(actLimit.isPresent()); } else { - assertEquals(expLimit, actLimit.get(), 0.00001); + assertEquals(limitType + " limit not as expected", expLimit, actLimit.get(), 0.00001); } } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java index 10bb00168bb..dedf344c546 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java @@ -1,6 +1,7 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.content; +import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.application.provider.BaseDeployLogger; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; @@ -22,12 +23,15 @@ public class FleetControllerClusterTest { new TestProperties().enableFeedBlockInDistributor(enableFeedBlockInDistributor)).build(); MockRoot root = new MockRoot("", deployState); var clusterElement = new ModelElement(doc.getDocumentElement()); + ModelContext.FeatureFlags featureFlags = new TestProperties(); return new ClusterControllerConfig.Builder("storage", clusterElement, new ClusterResourceLimits.Builder(enableFeedBlockInDistributor, false, false, - new BaseDeployLogger()) + new BaseDeployLogger(), + featureFlags.resourceLimitDisk(), + featureFlags.resourceLimitMemory()) .build(clusterElement).getClusterControllerLimits()) .build(root.getDeployState(), root, clusterElement.getXml()); } |