summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/searchchain/RenderingExecutorFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/searchchain/RenderingExecutorFactory.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchchain/RenderingExecutorFactory.java39
1 files changed, 39 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/searchchain/RenderingExecutorFactory.java b/container-search/src/main/java/com/yahoo/search/searchchain/RenderingExecutorFactory.java
new file mode 100644
index 00000000000..f67db059470
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/searchchain/RenderingExecutorFactory.java
@@ -0,0 +1,39 @@
+package com.yahoo.search.searchchain;
+
+import com.yahoo.concurrent.ThreadFactoryFactory;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Factory of the executor passed to renderers by default.
+ *
+ * @author bratseth
+ */
+class RenderingExecutorFactory {
+
+ private final int maxQueuedRenderingTasksPerProcessor;
+ private final int availableProcessors;
+
+ public RenderingExecutorFactory() {
+ this.maxQueuedRenderingTasksPerProcessor = 100;
+ this.availableProcessors = Runtime.getRuntime().availableProcessors();
+ }
+
+ ThreadPoolExecutor createExecutor() {
+ int maxOutstandingTasks = maxQueuedRenderingTasksPerProcessor * availableProcessors;
+ ThreadPoolExecutor executor = new ThreadPoolExecutor(availableProcessors, availableProcessors, 1L, TimeUnit.SECONDS,
+ new LinkedBlockingQueue<>(maxOutstandingTasks),
+ ThreadFactoryFactory.getThreadFactory("common-rendering"),
+ (task, exec) -> renderingRejected(maxOutstandingTasks));
+ executor.prestartAllCoreThreads();
+ return executor;
+ }
+
+ private void renderingRejected(int maxOutstandingTasks) {
+ throw new RejectedExecutionException("More than " + maxOutstandingTasks + " rendering tasks queued, rejecting this");
+ }
+
+}