summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-09-28 17:38:19 +0200
committerJon Bratseth <bratseth@gmail.com>2020-09-28 17:38:19 +0200
commitb12c17ea5e8a738570bc897e0fcd1e7f19688688 (patch)
treeaa48cbfe679e9ca1c5b83812e8e6cf45257784ab /config-model/src/main/java/com/yahoo
parentaf1d10a394b55cc0d31575bf979cecbbc177c568 (diff)
parent22e2f5ad80aedfe8ed3a9af7c7c11244ef184ed3 (diff)
Merge branch 'master' into bratseth/autoscaling-reconfiguration-events
Diffstat (limited to 'config-model/src/main/java/com/yahoo')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java21
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java15
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java18
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContainerRestartValidator.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRefeedAction.java16
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/VespaRestartAction.java35
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java21
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java1
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java3
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java3
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java19
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);
}
}