aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2020-09-16 18:22:11 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2020-09-16 18:22:11 +0200
commit6d09cc239f0f4145aab0ec21419fa7726589a4d7 (patch)
tree84e7356d4cd222bc97f423773729ab69225f17e8 /config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java
parent951e558ed5cbfa4ae98fc0962f8ebe5ea1fddeb0 (diff)
Allow applications to override threadpool configuration in services.xml
Diffstat (limited to 'config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java47
1 files changed, 45 insertions, 2 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java
index 6e4514c31b4..c4d252ccbfe 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerThreadpool.java
@@ -5,9 +5,12 @@ import com.yahoo.container.bundle.BundleInstantiationSpecification;
import com.yahoo.container.handler.threadpool.ContainerThreadPool;
import com.yahoo.container.handler.threadpool.ContainerThreadpoolConfig;
import com.yahoo.osgi.provider.model.ComponentModel;
+import com.yahoo.text.XML;
import com.yahoo.vespa.model.container.component.SimpleComponent;
+import org.w3c.dom.Element;
import java.util.List;
+import java.util.Optional;
import java.util.stream.Collectors;
/**
@@ -18,17 +21,32 @@ import java.util.stream.Collectors;
public class ContainerThreadpool extends SimpleComponent implements ContainerThreadpoolConfig.Producer {
private final String name;
+ private final UserOptions userOptions;
- public ContainerThreadpool(String name) {
+ public ContainerThreadpool(String name) { this(name, null); }
+
+ public ContainerThreadpool(String name, UserOptions userOptions) {
super(new ComponentModel(
BundleInstantiationSpecification.getFromStrings(
"threadpool@" + name,
ContainerThreadPool.class.getName(),
null)));
this.name = name;
+ this.userOptions = userOptions;
+ }
+
+ @Override
+ public void getConfig(ContainerThreadpoolConfig.Builder builder) {
+ builder.name(this.name);
+ if (userOptions != null) {
+ builder.maxThreads(userOptions.maxThreads);
+ builder.minThreads(userOptions.minThreads);
+ builder.queueSize(userOptions.queueSize);
+ }
}
- @Override public void getConfig(ContainerThreadpoolConfig.Builder builder) { builder.name(this.name); }
+ protected Optional<UserOptions> userOptions() { return Optional.ofNullable(userOptions); }
+ protected boolean hasUserOptions() { return userOptions().isPresent(); }
protected static double vcpu(ContainerCluster<?> cluster) {
List<Double> vcpus = cluster.getContainers().stream()
@@ -40,4 +58,29 @@ public class ContainerThreadpool extends SimpleComponent implements ContainerThr
if (vcpus.size() != 1 || vcpus.get(0) == 0) return 0;
return vcpus.get(0);
}
+
+ public static class UserOptions {
+ private final int maxThreads;
+ private final int minThreads;
+ private final int queueSize;
+
+ private UserOptions(int maxThreads, int minThreads, int queueSize) {
+ this.maxThreads = maxThreads;
+ this.minThreads = minThreads;
+ this.queueSize = queueSize;
+ }
+
+ public static Optional<UserOptions> fromXml(Element xml) {
+ Element element = XML.getChild(xml, "threadpool");
+ if (element == null) return Optional.empty();
+ return Optional.of(new UserOptions(
+ intOption(element, "max-threads"),
+ intOption(element, "min-threads"),
+ intOption(element, "queue-size")));
+ }
+
+ private static int intOption(Element element, String name) {
+ return Integer.parseInt(XML.getChild(element, name).getTextContent());
+ }
+ }
}