diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-01-28 13:31:21 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-01-28 13:40:01 +0100 |
commit | 11782742bd36b88f116f716e03c11df1c8d21f12 (patch) | |
tree | a9a7f7201525d0b4d2bb562c38c931500f22a844 /container-search | |
parent | c58fe9e096554ec64a64060db4fc127f9d89f614 (diff) |
Use half of available cores to compile query profiles.
Diffstat (limited to 'container-search')
2 files changed, 27 insertions, 5 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistry.java b/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistry.java index 8d2c847dc3a..29a383f8896 100644 --- a/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistry.java +++ b/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistry.java @@ -12,6 +12,10 @@ import com.yahoo.search.query.profile.config.QueryProfilesConfig; import com.yahoo.search.query.profile.types.QueryProfileTypeRegistry; import com.yahoo.yolean.UncheckedInterruptedException; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; + /** * A set of compiled query profiles. * @@ -25,12 +29,28 @@ public class CompiledQueryProfileRegistry extends ComponentRegistry<CompiledQuer private final QueryProfileTypeRegistry typeRegistry; @Inject - public CompiledQueryProfileRegistry(QueryProfilesConfig config) { + public CompiledQueryProfileRegistry(QueryProfilesConfig config, Executor executor) { QueryProfileRegistry registry = QueryProfileConfigurer.createFromConfig(config); typeRegistry = registry.getTypeRegistry(); - for (QueryProfile inputProfile : registry.allComponents()) { - abortIfInterrupted(); - register(QueryProfileCompiler.compile(inputProfile, this)); + int maxConcurrent = Math.max(1, Runtime.getRuntime().availableProcessors()/2); + BlockingQueue<CompiledQueryProfile> doneQ = new LinkedBlockingQueue<>(); + int started = 0; + int completed = 0; + try { + for (QueryProfile inputProfile : registry.allComponents()) { + abortIfInterrupted(); + if (started++ >= maxConcurrent) { + register(doneQ.take()); + completed++; + } + executor.execute(() -> doneQ.add(QueryProfileCompiler.compile(inputProfile, this))); + } + while (completed < started) { + register(doneQ.take()); + completed++; + } + } catch (InterruptedException e) { + throw new UncheckedInterruptedException("Interrupted while waiting for compiled query profiles", true); } } diff --git a/container-search/src/test/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistryTest.java b/container-search/src/test/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistryTest.java index a9792049fb7..6819578c2ae 100644 --- a/container-search/src/test/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistryTest.java +++ b/container-search/src/test/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfileRegistryTest.java @@ -4,6 +4,8 @@ package com.yahoo.search.query.profile.compiled; import com.yahoo.search.query.profile.config.QueryProfilesConfig; import org.junit.Test; +import java.util.concurrent.Executors; + import static org.junit.Assert.assertEquals; /** @@ -21,7 +23,7 @@ public class CompiledQueryProfileRegistryTest { .value("5"))) .build(); - var registry = new CompiledQueryProfileRegistry(config); + var registry = new CompiledQueryProfileRegistry(config, Executors.newCachedThreadPool()); var profile1 = registry.findQueryProfile("profile1"); assertEquals("5", profile1.get("hits")); } |