diff options
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.java | 39 |
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"); + } + +} |