diff options
author | Jon Bratseth <bratseth@gmail.com> | 2020-09-28 17:38:19 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2020-09-28 17:38:19 +0200 |
commit | b12c17ea5e8a738570bc897e0fcd1e7f19688688 (patch) | |
tree | aa48cbfe679e9ca1c5b83812e8e6cf45257784ab /config-model/src/main/java/com/yahoo | |
parent | af1d10a394b55cc0d31575bf979cecbbc177c568 (diff) | |
parent | 22e2f5ad80aedfe8ed3a9af7c7c11244ef184ed3 (diff) |
Merge branch 'master' into bratseth/autoscaling-reconfiguration-events
Diffstat (limited to 'config-model/src/main/java/com/yahoo')
11 files changed, 123 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 22bdf31350a..31c72e1be69 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 @@ -38,9 +38,12 @@ public class TestProperties implements ModelContext.Properties { private boolean useContentNodeBtreeDb = false; private boolean useThreePhaseUpdates = false; private boolean useDirectStorageApiRpc = false; + private boolean tlsUseFSync = false; + private String tlsCompressionType = "NONE"; private double defaultTermwiseLimit = 1.0; private double threadPoolSizeFactor = 0.0; private double queueSizeFactor = 0.0; + private double visibilityDelay = 0.0; private String jvmGCOptions = null; private String sequencerType = "LATENCY"; private String responseSequencerType = "ADAPTIVE"; @@ -83,6 +86,9 @@ public class TestProperties implements ModelContext.Properties { @Override public boolean skipMbusRequestThread() { return false; } @Override public boolean skipMbusReplyThread() { return false; } @Override public Quota quota() { return quota; } + @Override public double visibilityDelay() { return visibilityDelay; } + @Override public boolean tlsUseFSync() { return tlsUseFSync; } + @Override public String tlsCompressionType() { return tlsCompressionType; } public TestProperties setJvmGCOptions(String gcOptions) { jvmGCOptions = gcOptions; @@ -139,6 +145,21 @@ public class TestProperties implements ModelContext.Properties { return this; } + public TestProperties setTlsUseFSync(boolean useFSync) { + this.tlsUseFSync = useFSync; + return this; + } + + public TestProperties setTlsCompressionType(String type) { + this.tlsCompressionType = type; + return this; + } + + public TestProperties setVisibilityDelay(double visibilityDelay) { + this.visibilityDelay = visibilityDelay; + return this; + } + public TestProperties setMultitenant(boolean multitenant) { this.multitenant = multitenant; return this; 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 120e323e652..56b70bec24e 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 @@ -3,6 +3,7 @@ package com.yahoo.vespa.model.admin.monitoring; import java.util.Collections; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import static com.yahoo.vespa.model.admin.monitoring.DefaultVespaMetrics.defaultVespaMetricSet; @@ -129,7 +130,12 @@ public class VespaMetricSet { metrics.add(new Metric("serverActiveThreads.count")); metrics.add(new Metric("serverActiveThreads.last")); - metrics.add(new Metric("jdisc.thread_pool.unhandled_exceptions.rate")); + { + List<String> suffices = List.of("sum", "count", "last", "min", "max"); + addMetric(metrics, "jdisc.thread_pool.unhandled_exceptions", suffices); + addMetric(metrics, "jdisc.thread_pool.work_queue.capacity", suffices); + addMetric(metrics, "jdisc.thread_pool.work_queue.size", suffices); + } metrics.add(new Metric("httpapi_latency.max")); metrics.add(new Metric("httpapi_latency.sum")); @@ -399,6 +405,7 @@ public class VespaMetricSet { metrics.add(new Metric("content.proton.resource_usage.transient_memory.average")); metrics.add(new Metric("content.proton.resource_usage.memory_mappings.max")); metrics.add(new Metric("content.proton.resource_usage.open_file_descriptors.max")); + metrics.add(new Metric("content.proton.resource_usage.feeding_blocked.max")); metrics.add(new Metric("content.proton.documentdb.attribute.resource_usage.enum_store.average")); metrics.add(new Metric("content.proton.documentdb.attribute.resource_usage.multi_value.average")); metrics.add(new Metric("content.proton.documentdb.attribute.resource_usage.feeding_blocked.last")); // TODO: Remove in Vespa 8 @@ -687,4 +694,10 @@ public class VespaMetricSet { return metrics; } + private static void addMetric(Set<Metric> metrics, String metricName, List<String> aggregateSuffices) { + for (String suffix : aggregateSuffices) { + metrics.add(new Metric(metricName + "." + suffix)); + } + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java index f6108f5ac77..c0a2fe4fdf2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java @@ -6,7 +6,7 @@ import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.vespa.model.VespaModel; -import java.util.Optional; +import java.util.Locale; import java.util.stream.Collectors; /** @@ -23,16 +23,15 @@ public class QuotaValidator extends Validator { } private void validateBudget(int budget, VespaModel model) { - Optional<Double> spend = model.allClusters().stream() + var spend = model.allClusters().stream() .map(clusterId -> model.provisioned().all().get(clusterId)) .map(Capacity::maxResources) .map(clusterCapacity -> clusterCapacity.nodeResources().cost() * clusterCapacity.nodes()) - .reduce(Double::sum); + .reduce(0.0, Double::sum); - if(spend.isPresent() && spend.get() > budget) - throw new IllegalArgumentException( - String.format("Hourly spend for maximum specified resources ($%.2f) exceeds budget from quota ($%d)!", - spend.get(), budget)); + if (spend > budget) { + throwBudgetExceeded(spend, budget); + } } /** Check that all clusters in the application do not exceed the quota max cluster size. */ @@ -51,4 +50,9 @@ public class QuotaValidator extends Validator { throw new IllegalArgumentException("Clusters " + clusterNames + " exceeded max cluster size of " + maxClusterSize); } } + + private void throwBudgetExceeded(double spend, double budget) { + var message = String.format(Locale.US, "Hourly spend for maximum specified resources ($%.2f) exceeds budget from quota ($%.2f)!", spend, budget); + throw new IllegalArgumentException(message); + } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContainerRestartValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContainerRestartValidator.java index 5cee08ea9af..3176ad9f912 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContainerRestartValidator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContainerRestartValidator.java @@ -31,7 +31,7 @@ public class ContainerRestartValidator implements ChangeValidator { } private static ConfigChangeAction createConfigChangeAction(Container container) { - return new VespaRestartAction(createMessage(container), container.getServiceInfo()); + return new VespaRestartAction(createMessage(container), container.getServiceInfo(), true); } private static String createMessage(Container container) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRefeedAction.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRefeedAction.java index 0fd38e5dbdd..be43c6eddfb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRefeedAction.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRefeedAction.java @@ -6,7 +6,6 @@ import com.yahoo.config.model.api.ServiceInfo; import com.yahoo.config.application.api.ValidationOverrides; import java.time.Instant; -import java.util.Collections; import java.util.List; /** @@ -27,31 +26,29 @@ public class VespaRefeedAction extends VespaConfigChangeAction implements Config private final String documentType; private final boolean allowed; - private final Instant now; - private VespaRefeedAction(String name, String message, List<ServiceInfo> services, String documentType, boolean allowed, Instant now) { + private VespaRefeedAction(String name, String message, List<ServiceInfo> services, String documentType, boolean allowed) { super(message, services); this.name = name; this.documentType = documentType; this.allowed = allowed; - this.now = now; } /** Creates a refeed action with some missing information */ // TODO: We should require document type or model its absence properly public static VespaRefeedAction of(String name, ValidationOverrides overrides, String message, Instant now) { - return new VespaRefeedAction(name, message, Collections.emptyList(), "", overrides.allows(name, now), now); + return new VespaRefeedAction(name, message, List.of(), "", overrides.allows(name, now)); } /** Creates a refeed action */ public static VespaRefeedAction of(String name, ValidationOverrides overrides, String message, List<ServiceInfo> services, String documentType, Instant now) { - return new VespaRefeedAction(name, message, services, documentType, overrides.allows(name, now), now); + return new VespaRefeedAction(name, message, services, documentType, overrides.allows(name, now)); } @Override public VespaConfigChangeAction modifyAction(String newMessage, List<ServiceInfo> newServices, String documentType) { - return new VespaRefeedAction(name, newMessage, newServices, documentType, allowed, now); + return new VespaRefeedAction(name, newMessage, newServices, documentType, allowed); } @Override @@ -64,6 +61,11 @@ public class VespaRefeedAction extends VespaConfigChangeAction implements Config public boolean allowed() { return allowed; } @Override + public boolean ignoreForInternalRedeploy() { + return false; + } + + @Override public String toString() { return super.toString() + ", documentType='" + documentType + "'"; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRestartAction.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRestartAction.java index d42db15d062..3ea18cac1d6 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRestartAction.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRestartAction.java @@ -4,8 +4,6 @@ package com.yahoo.vespa.model.application.validation.change; import com.yahoo.config.model.api.ConfigChangeRestartAction; import com.yahoo.config.model.api.ServiceInfo; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** @@ -15,16 +13,24 @@ import java.util.List; */ public class VespaRestartAction extends VespaConfigChangeAction implements ConfigChangeRestartAction { + private final boolean ignoreForInternalRedeploy; + public VespaRestartAction(String message) { - super(message, new ArrayList<>()); + this(message, List.of()); } public VespaRestartAction(String message, ServiceInfo service) { - super(message, Collections.singletonList(service)); + this(message, List.of(service)); + } + + public VespaRestartAction(String message, ServiceInfo services, boolean ignoreForInternalRedeploy) { + super(message, List.of(services)); + this.ignoreForInternalRedeploy = ignoreForInternalRedeploy; } public VespaRestartAction(String message, List<ServiceInfo> services) { super(message, services); + this.ignoreForInternalRedeploy = false; } @Override @@ -32,4 +38,25 @@ public class VespaRestartAction extends VespaConfigChangeAction implements Confi return new VespaRestartAction(newMessage, newServices); } + @Override + public boolean ignoreForInternalRedeploy() { + return ignoreForInternalRedeploy; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + + VespaRestartAction that = (VespaRestartAction) o; + return ignoreForInternalRedeploy == that.ignoreForInternalRedeploy; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (ignoreForInternalRedeploy ? 1 : 0); + return result; + } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java b/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java index feaa6eb5940..9018a0231db 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java @@ -41,13 +41,17 @@ public class ContainerDocumentApi { private static void addRestApiHandler(ContainerCluster<?> cluster, Options options) { - var handler = newVespaClientHandler( - "com.yahoo.document.restapi.resource.RestApi", "/document/v1/*", options); + String handlerClassName = options.useNewRestapiHandler + ? "com.yahoo.document.restapi.resource.DocumentV1ApiHandler" + : "com.yahoo.document.restapi.resource.RestApi"; + var handler = newVespaClientHandler(handlerClassName, "/document/v1/*", options); cluster.addComponent(handler); - var executor = new Threadpool( - "restapi-handler", cluster, options.restApiThreadpoolOptions, options.feedThreadPoolSizeFactor); - handler.inject(executor); - handler.addComponent(executor); + if (!options.useNewRestapiHandler) { + var executor = new Threadpool( + "restapi-handler", cluster, options.restApiThreadpoolOptions, options.feedThreadPoolSizeFactor); + handler.inject(executor); + handler.addComponent(executor); + } } private static Handler<AbstractConfigProducer<?>> newVespaClientHandler( @@ -76,15 +80,18 @@ public class ContainerDocumentApi { private final ContainerThreadpool.UserOptions restApiThreadpoolOptions; private final ContainerThreadpool.UserOptions feedApiThreadpoolOptions; private final double feedThreadPoolSizeFactor; + private final boolean useNewRestapiHandler; public Options(Collection<String> bindings, ContainerThreadpool.UserOptions restApiThreadpoolOptions, ContainerThreadpool.UserOptions feedApiThreadpoolOptions, - double feedThreadPoolSizeFactor) { + double feedThreadPoolSizeFactor, + boolean useNewRestapiHandler) { this.bindings = Collections.unmodifiableCollection(bindings); this.restApiThreadpoolOptions = restApiThreadpoolOptions; this.feedApiThreadpoolOptions = feedApiThreadpoolOptions; this.feedThreadPoolSizeFactor = feedThreadPoolSizeFactor; + this.useNewRestapiHandler = useNewRestapiHandler; } } 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 1427fa492dc..7822b03db08 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 @@ -94,6 +94,7 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat addSimpleComponent("com.yahoo.container.jdisc.CertificateStoreProvider"); addSimpleComponent("com.yahoo.container.jdisc.AthenzIdentityProviderProvider"); addSimpleComponent("com.yahoo.container.jdisc.SystemInfoProvider"); + addSimpleComponent(com.yahoo.container.core.documentapi.DocumentAccessProvider.class.getName()); addMetricsHandlers(); addTestrunnerComponentsIfTester(deployState); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java index 99ae6184f5c..3baf792dfba 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java @@ -25,7 +25,8 @@ public class DocumentApiOptionsBuilder { getBindings(spec), threadpoolOptions(spec, "rest-api"), threadpoolOptions(spec, "http-client-api"), - deployState.getProperties().feedCoreThreadPoolSizeFactor()); + deployState.getProperties().feedCoreThreadPoolSizeFactor(), + deployState.getProperties().useNewRestapiHandler()); } private static ContainerThreadpool.UserOptions threadpoolOptions(Element spec, String elementName) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java index f329f62ee7b..2198b6e278b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java @@ -200,6 +200,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot this.flushOnShutdown = flushOnShutdown; this.combined = combined; feedSequencerType = convertFeedSequencerType(featureFlags.feedSequencerType()); + visibilityDelay = featureFlags.visibilityDelay(); } public void setVisibilityDelay(double delay) { @@ -267,7 +268,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot searchNode.setHostResource(node.getHostResource()); searchNode.initService(deployState.getDeployLogger()); - tls = new TransactionLogServer(searchNode, clusterName); + tls = new TransactionLogServer(searchNode, clusterName, deployState.getProperties()); tls.setHostResource(searchNode.getHostResource()); tls.initService(deployState.getDeployLogger()); } else { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java index 2c457940f24..347250176e5 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.search; +import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.searchlib.TranslogserverConfig; import com.yahoo.config.model.producer.AbstractConfigProducer; @@ -15,12 +16,24 @@ import org.w3c.dom.Element; public class TransactionLogServer extends AbstractService { private static final long serialVersionUID = 1L; + private final boolean useFSync; + private final TranslogserverConfig.Compression.Type.Enum compressionType; - public TransactionLogServer(AbstractConfigProducer searchNode, String clusterName) { + private static TranslogserverConfig.Compression.Type.Enum convertCompressionType(String type) { + try { + return TranslogserverConfig.Compression.Type.Enum.valueOf(type); + } catch (Throwable t) { + return TranslogserverConfig.Compression.Type.NONE; + } + } + + public TransactionLogServer(AbstractConfigProducer searchNode, String clusterName, ModelContext.Properties featureFlags) { super(searchNode, "transactionlogserver"); portsMeta.on(0).tag("tls"); setProp("clustername", clusterName); setProp("clustertype", "search"); + useFSync = featureFlags.tlsUseFSync(); + compressionType = convertCompressionType(featureFlags.tlsCompressionType()); } public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<TransactionLogServer> { @@ -31,7 +44,7 @@ public class TransactionLogServer extends AbstractService { @Override protected TransactionLogServer doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { - return new TransactionLogServer(ancestor, clusterName); + return new TransactionLogServer(ancestor, clusterName, deployState.getProperties()); } } @@ -65,6 +78,8 @@ public class TransactionLogServer extends AbstractService { public void getConfig(TranslogserverConfig.Builder builder) { builder.listenport(getTlsPort()).basedir(getTlsDir()); + builder.usefsync(useFSync); + builder.compression.type(compressionType); } } |