diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-10-08 13:52:48 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-10-08 13:52:48 +0200 |
commit | 475f0c93523daa1c3c53786ee8a9a9aee6702204 (patch) | |
tree | d20932871aa4c917052f2e37dde77c5d4a880e39 /container-search/src | |
parent | 9d435e48c742b3efc94c68c02da835c5f5298255 (diff) |
Use the executor from the context
Diffstat (limited to 'container-search/src')
14 files changed, 65 insertions, 188 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java index e541cc8b5c0..c28e18a37d5 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java @@ -30,7 +30,6 @@ import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; - /** * Superclass for backend searchers. * diff --git a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java index 4b9d469d90d..98c3ac9e3ac 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java @@ -90,37 +90,28 @@ public class FederationSearcher extends ForkingSearcher { private final boolean strictSearchchain; private final TargetSelector<?> targetSelector; private final Clock clock = Clock.systemUTC(); - private final Executor executor; - - @Inject public FederationSearcher(FederationConfig config, StrictContractsConfig strict, - ComponentRegistry<TargetSelector> targetSelectors, Executor executor) { + ComponentRegistry<TargetSelector> targetSelectors) { this(createResolver(config), strict.searchchains(), strict.propagateSourceProperties(), - resolveSelector(config.targetSelector(), targetSelectors), executor); + resolveSelector(config.targetSelector(), targetSelectors)); } // for testing - FederationSearcher(ComponentId id, SearchChainResolver searchChainResolver, Executor executor) { - this(searchChainResolver, false, PropagateSourceProperties.EVERY, null, executor); - } - // for testing public FederationSearcher(ComponentId id, SearchChainResolver searchChainResolver) { - this(id, searchChainResolver, new InThreadExecutorService()); + this(searchChainResolver, false, PropagateSourceProperties.EVERY, null); } private FederationSearcher(SearchChainResolver searchChainResolver, boolean strictSearchchain, PropagateSourceProperties.Enum propagateSourceProperties, - TargetSelector targetSelector, - Executor executor) { + TargetSelector targetSelector) { this.searchChainResolver = searchChainResolver; sourceRefResolver = new SourceRefResolver(searchChainResolver); this.strictSearchchain = strictSearchchain; this.propagateSourceProperties = propagateSourceProperties; this.targetSelector = targetSelector; - this.executor = executor; } private static TargetSelector resolveSelector(String selectorId, @@ -255,7 +246,7 @@ public class FederationSearcher extends ForkingSearcher { if (timeout <= 0) return new FutureResult(() -> new Result(query, ErrorMessage.createTimeout("Timed out before federation")), execution, query); Query clonedQuery = cloneFederationQuery(query, window, timeout, target); - return new AsyncExecution(target.getChain(), execution).search(clonedQuery, executor); + return new AsyncExecution(target.getChain(), execution).search(clonedQuery); } private Query cloneFederationQuery(Query query, Window window, long timeout, Target target) { @@ -446,7 +437,7 @@ public class FederationSearcher extends ForkingSearcher { propagateErrors(resultToFill, result); } else { AsyncExecution asyncFill = new AsyncExecution(chainExecution); - futureFilledResults.add(new Pair<>(resultToFill, asyncFill.fill(resultToFill, summaryClass, executor))); + futureFilledResults.add(new Pair<>(resultToFill, asyncFill.fill(resultToFill, summaryClass))); } } } diff --git a/container-search/src/main/java/com/yahoo/search/searchchain/AsyncExecution.java b/container-search/src/main/java/com/yahoo/search/searchchain/AsyncExecution.java index 1b2eeb5efe6..ac879183125 100644 --- a/container-search/src/main/java/com/yahoo/search/searchchain/AsyncExecution.java +++ b/container-search/src/main/java/com/yahoo/search/searchchain/AsyncExecution.java @@ -53,31 +53,6 @@ import java.util.concurrent.atomic.AtomicReference; * @author Arne Bergene Fossaa */ public class AsyncExecution { - private static final AtomicReference<Executor> deprecatedExecutor = new AtomicReference<>(null); - - private static Executor createDeprecatedExecutor() { - int numCpus = Runtime.getRuntime().availableProcessors(); - ThreadPoolExecutor executor = new ThreadPoolExecutor(2*numCpus, numCpus*10, 1L, TimeUnit.SECONDS, - new SynchronousQueue<>(false), ThreadFactoryFactory.getThreadFactory("search")); - // Prestart needed, if not all threads will be created by the fist N tasks and hence they might also - // get the dreaded thread locals initialized even if they will never run. - // That counters what we we want to achieve with the Q that will prefer thread locality. - executor.prestartAllCoreThreads(); - return executor; - } - private static Executor getDeprecatedExecutor() { - Executor executor = deprecatedExecutor.get(); - if (executor == null) { - synchronized (deprecatedExecutor) { - executor = deprecatedExecutor.get(); - if (executor == null) { - executor = createDeprecatedExecutor(); - deprecatedExecutor.set(executor); - } - } - } - return executor; - } /** The execution this executes */ private final Execution execution; @@ -138,41 +113,29 @@ public class AsyncExecution { * * @see com.yahoo.search.searchchain.Execution */ - public FutureResult search(Query query, Executor executor) { - return getFutureResult(executor, () -> execution.search(query), query); - } - @Deprecated public FutureResult search(Query query) { - return search(query, getDeprecatedExecutor()); + return getFutureResult(execution.context().executor(), () -> execution.search(query), query); } - public FutureResult searchAndFill(Query query, Executor executor) { - return getFutureResult(executor, () -> { + public FutureResult searchAndFill(Query query) { + return getFutureResult(execution.context().executor(), () -> { Result result = execution.search(query); execution.fill(result, query.getPresentation().getSummary()); return result; }, query); } - @Deprecated - public FutureResult searchAndFill(Query query) { - return searchAndFill(query, getDeprecatedExecutor()); - } /** * The future of this functions returns the original Result * * @see com.yahoo.search.searchchain.Execution */ - public FutureResult fill(Result result, String summaryClass, Executor executor) { - return getFutureResult(executor, () -> { + public FutureResult fill(Result result, String summaryClass) { + return getFutureResult(execution.context().executor(), () -> { execution.fill(result, summaryClass); return result; }, result.getQuery()); } - @Deprecated - public FutureResult fill(Result result, String summaryClass) { - return fill(result, summaryClass, getDeprecatedExecutor()); - } private static <T> Future<T> getFuture(Executor executor, Callable<T> callable) { FutureTask<T> future = new FutureTask<>(callable); @@ -206,14 +169,15 @@ public class AsyncExecution { * done when the timeout expires, it will be cancelled, and it will return a * result. All unfinished Futures will be cancelled. * - * @return the list of results in the same order as returned from the task - * collection + * @return the list of results in the same order as returned from the task collection */ - public static List<Result> waitForAll(Collection<FutureResult> tasks, long timeoutMs, Executor executor) { + public static List<Result> waitForAll(Collection<FutureResult> tasks, long timeoutMs) { + if (tasks.isEmpty()) return new ArrayList<>(); + // Copy the list in case it is modified while we are waiting List<FutureResult> workingTasks = new ArrayList<>(tasks); try { - runTask(executor, () -> { + runTask(tasks.stream().findAny().get().getExecution().context().executor(), () -> { for (FutureResult task : workingTasks) task.get(timeoutMs, TimeUnit.MILLISECONDS); }).get(timeoutMs, TimeUnit.MILLISECONDS); @@ -233,9 +197,5 @@ public class AsyncExecution { } return results; } - @Deprecated - public static List<Result> waitForAll(Collection<FutureResult> tasks, long timeoutMs) { - return waitForAll(tasks, timeoutMs, getDeprecatedExecutor()); - } } diff --git a/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java b/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java index 86ba8664dee..fc2d44e01d9 100644 --- a/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java +++ b/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java @@ -18,6 +18,7 @@ import com.yahoo.search.rendering.RendererRegistry; import com.yahoo.search.statistics.TimeTracker; import java.util.concurrent.Executor; +import java.util.concurrent.Executors; /** * <p>An execution of a search chain. This keeps track of the call state for an execution (in the calling thread) @@ -122,7 +123,7 @@ public class Execution extends com.yahoo.processing.execution.Execution { this.tokenRegistry = tokenRegistry; this.rendererRegistry = rendererRegistry; this.linguistics = linguistics; - this.executor = executor != null ? executor : Runnable::run; // Run in same thread if no executor is provided + this.executor = executor != null ? executor : Executors.newSingleThreadExecutor(); } /** @deprecated pass an executor */ @@ -362,7 +363,7 @@ public class Execution extends com.yahoo.processing.execution.Execution { /** * Returns the executor that should be used to execute tasks as part of this execution. - * This is never null but will be an executor that runs in the same thread if none is passed to this. + * This is never null but will be an executor that runs a single thread if none is passed to this. */ public Executor executor() { return executor; } diff --git a/container-search/src/main/java/com/yahoo/search/searchchain/ExecutionFactory.java b/container-search/src/main/java/com/yahoo/search/searchchain/ExecutionFactory.java index 210a77ccf57..f6977849a02 100644 --- a/container-search/src/main/java/com/yahoo/search/searchchain/ExecutionFactory.java +++ b/container-search/src/main/java/com/yahoo/search/searchchain/ExecutionFactory.java @@ -66,7 +66,7 @@ public class ExecutionFactory extends AbstractComponent { this.specialTokens = new SpecialTokenRegistry(specialTokens); this.linguistics = linguistics; this.rendererRegistry = new RendererRegistry(renderers.allComponents()); - this.executor = executor != null ? executor : Runnable::run; + this.executor = executor != null ? executor : Executors.newSingleThreadExecutor(); } /** @deprecated pass the container threadpool */ diff --git a/container-search/src/main/java/com/yahoo/search/searchchain/FutureResult.java b/container-search/src/main/java/com/yahoo/search/searchchain/FutureResult.java index 81d98f828fd..64bbcb4780c 100644 --- a/container-search/src/main/java/com/yahoo/search/searchchain/FutureResult.java +++ b/container-search/src/main/java/com/yahoo/search/searchchain/FutureResult.java @@ -24,7 +24,6 @@ public class FutureResult extends FutureTask<Result> { private final Query query; - /** Only used for generating messages */ private final Execution execution; private final static Logger log = Logger.getLogger(FutureResult.class.getName()); @@ -90,6 +89,9 @@ public class FutureResult extends FutureTask<Result> { return query; } + /** Returns the execution which creates this */ + public Execution getExecution() { return execution; } + private ErrorMessage createInterruptedError(Exception e) { return ErrorMessage.createUnspecifiedError(execution + " was interrupted while executing: " + Exceptions.toMessageString(e)); diff --git a/container-search/src/test/java/com/yahoo/prelude/searcher/test/BlendingSearcherTestCase.java b/container-search/src/test/java/com/yahoo/prelude/searcher/test/BlendingSearcherTestCase.java index 69d66c6341f..50509300dd1 100644 --- a/container-search/src/test/java/com/yahoo/prelude/searcher/test/BlendingSearcherTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/searcher/test/BlendingSearcherTestCase.java @@ -6,8 +6,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import com.yahoo.component.ComponentId; import com.yahoo.component.chain.Chain; @@ -49,18 +47,6 @@ public class BlendingSearcherTestCase { private static final double delta = 0.00000001; - private ExecutorService executor; - - @Before - public void setUp() throws Exception { - executor = Executors.newFixedThreadPool(16); - } - - @After - public void tearDown() { - assertEquals(0, executor.shutdownNow().size()); - } - public class BlendingSearcherWrapper extends Searcher { private SearchChain blendingChain; @@ -127,7 +113,7 @@ public class BlendingSearcherTestCase { StrictContractsConfig contracts = new StrictContractsConfig.Builder().build(); FederationSearcher fedSearcher = - new FederationSearcher(new FederationConfig(builder), contracts, new ComponentRegistry<>(), executor); + new FederationSearcher(new FederationConfig(builder), contracts, new ComponentRegistry<>()); BlendingSearcher blendingSearcher = new BlendingSearcher(blendingField); blendingChain = new SearchChain(ComponentId.createAnonymousComponentId("blendingChain"), blendingSearcher, fedSearcher); return true; diff --git a/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTest.java b/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTest.java index 7651849a519..ef9e0311e59 100644 --- a/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTest.java +++ b/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTest.java @@ -28,8 +28,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -43,18 +41,6 @@ public class FederationSearcherTest { private static final String hasBeenFilled = "hasBeenFilled"; - private ExecutorService executor; - - @Before - public void setUp() throws Exception { - executor = Executors.newFixedThreadPool(16); - } - - @After - public void tearDown() { - assertEquals(0, executor.shutdownNow().size()); - } - @Test public void require_that_hits_are_not_automatically_filled() { Result result = federationToSingleAddHitSearcher().search(); @@ -69,7 +55,7 @@ public class FederationSearcherTest { @Test public void require_that_hits_can_be_filled_when_moved() { - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new AddHitSearcher()); tester.addSearchChain("chain2", new AddHitSearcher()); @@ -97,7 +83,7 @@ public class FederationSearcherTest { @Test public void require_that_hits_can_be_filled_for_multiple_chains_and_queries() { - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new AddHitSearcher()); tester.addSearchChain("chain2", new ModifyQueryAndAddHitSearcher("modified1")); tester.addSearchChain("chain3", new ModifyQueryAndAddHitSearcher("modified2")); @@ -111,7 +97,7 @@ public class FederationSearcherTest { @Test public void require_that_hits_that_time_out_in_fill_are_removed() { - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new AddHitSearcher()); tester.addSearchChain("chain2", new TimeoutInFillSearcher()); @@ -129,7 +115,7 @@ public class FederationSearcherTest { public void require_that_optional_search_chains_does_not_delay_federation() { BlockingSearcher blockingSearcher = new BlockingSearcher(); - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new AddHitSearcher()); tester.addOptionalSearchChain("chain2", blockingSearcher); @@ -158,7 +144,7 @@ public class FederationSearcherTest { @Test public void require_that_calling_a_single_slow_source_with_long_timeout_does_not_delay_federation() { - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new FederationOptions().setUseByDefault(true).setRequestTimeoutInMilliseconds(3600 * 1000), new BlockingSearcher() ); @@ -188,7 +174,7 @@ public class FederationSearcherTest { FederationSearcher searcher = new FederationSearcher( new FederationConfig(new FederationConfig.Builder().targetSelector(targetSelectorId.toString())), new StrictContractsConfig(new StrictContractsConfig.Builder()), - targetSelectors, executor); + targetSelectors); Query query = new Query(); query.setTimeout(20000); @@ -207,7 +193,7 @@ public class FederationSearcherTest { FederationSearcher searcher = new FederationSearcher( new FederationConfig(new FederationConfig.Builder().targetSelector(targetSelectorId.toString())), new StrictContractsConfig(new StrictContractsConfig.Builder()), - targetSelectors, executor); + targetSelectors); Query query = new Query(); query.setTimeout(20000); @@ -241,7 +227,7 @@ public class FederationSearcherTest { } private FederationTester federationToSingleAddHitSearcher() { - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new AddHitSearcher()); return tester; } diff --git a/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTestCase.java b/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTestCase.java index 65640cc94f0..d7c3217069c 100644 --- a/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/federation/FederationSearcherTestCase.java @@ -25,8 +25,6 @@ import org.junit.Before; import org.junit.Test; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import static com.yahoo.search.federation.StrictContractsConfig.PropagateSourceProperties; import static org.junit.Assert.assertEquals; @@ -64,20 +62,17 @@ public class FederationSearcherTestCase { private FederationConfig.Builder builder; private SearchChainRegistry chainRegistry; - private ExecutorService executor; @Before public void setUp() throws Exception { builder = new FederationConfig.Builder(); chainRegistry = new SearchChainRegistry(); - executor = Executors.newFixedThreadPool(16); } @After public void tearDown() { builder = null; chainRegistry = null; - assertEquals(0, executor.shutdownNow().size()); } private void addChained(Searcher searcher, String sourceName) { @@ -107,7 +102,7 @@ public class FederationSearcherTestCase { } private Searcher buildFederation(StrictContractsConfig contracts) throws RuntimeException { - return new FederationSearcher(new FederationConfig(builder), contracts, new ComponentRegistry<>(), executor); + return new FederationSearcher(new FederationConfig(builder), contracts, new ComponentRegistry<>()); } private SearchChain createSearchChain(ComponentId chainId,Searcher searcher) { @@ -169,8 +164,7 @@ public class FederationSearcherTestCase { new FederationSearcher(new FederationConfig(builder), new StrictContractsConfig( new StrictContractsConfig.Builder().searchchains(strictContracts)), - new ComponentRegistry<>(), - executor)); + new ComponentRegistry<>())); } @Test @@ -356,7 +350,7 @@ public class FederationSearcherTestCase { builder.addSourceForProvider(news, provider1, provider1, true, options, List.of()); builder.addSourceForProvider(news, provider2, provider2, false, options, List.of()); - return new FederationSearcher(new ComponentId("federation"), builder.build(), executor); + return new FederationSearcher(new ComponentId("federation"), builder.build()); } private static class MockProvider extends Searcher { diff --git a/container-search/src/test/java/com/yahoo/search/federation/FederationTester.java b/container-search/src/test/java/com/yahoo/search/federation/FederationTester.java index 433fe557b24..7a9d5f3a4f0 100644 --- a/container-search/src/test/java/com/yahoo/search/federation/FederationTester.java +++ b/container-search/src/test/java/com/yahoo/search/federation/FederationTester.java @@ -12,7 +12,6 @@ import com.yahoo.search.searchchain.SearchChainRegistry; import com.yahoo.search.searchchain.model.federation.FederationOptions; import java.util.Collections; -import java.util.concurrent.Executor; /** * @author Tony Vaagenes @@ -23,11 +22,7 @@ class FederationTester { private final SearchChainRegistry registry = new SearchChainRegistry(); private Execution execution; - private final Executor executor; - FederationTester(Executor executor) { - this.executor = executor; - } void addSearchChain(String id, Searcher... searchers) { addSearchChain(id, federationOptions(), searchers); } @@ -51,7 +46,7 @@ class FederationTester { } FederationSearcher buildFederationSearcher() { - return new FederationSearcher(ComponentId.fromString("federation"), builder.build(), executor); + return new FederationSearcher(ComponentId.fromString("federation"), builder.build()); } public Result search() { diff --git a/container-search/src/test/java/com/yahoo/search/federation/HitCountTestCase.java b/container-search/src/test/java/com/yahoo/search/federation/HitCountTestCase.java index 163263b7640..6f1570b702f 100644 --- a/container-search/src/test/java/com/yahoo/search/federation/HitCountTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/federation/HitCountTestCase.java @@ -5,14 +5,10 @@ import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.result.Hit; import com.yahoo.search.result.HitGroup; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -22,24 +18,12 @@ import static org.junit.Assert.assertTrue; */ public class HitCountTestCase { - private ExecutorService executor; - - @Before - public void setUp() throws Exception { - executor = Executors.newFixedThreadPool(16); - } - - @After - public void tearDown() { - assertEquals(0, executor.shutdownNow().size()); - } - @Test public void require_that_offset_and_hits_are_adjusted_when_federating() { final int chain1RelevanceMultiplier = 1; final int chain2RelevanceMultiplier = 10; - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new AddHitsWithRelevanceSearcher("chain1", chain1RelevanceMultiplier)); tester.addSearchChain("chain2", new AddHitsWithRelevanceSearcher("chain2", chain2RelevanceMultiplier)); @@ -61,7 +45,7 @@ public class HitCountTestCase { final long chain2TotalHitCount = 7; final long chain2DeepHitCount = 11; - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new SetHitCountsSearcher(chain1TotalHitCount, chain1DeepHitCount)); tester.addSearchChain("chain2", new SetHitCountsSearcher(chain2TotalHitCount, chain2DeepHitCount)); @@ -79,7 +63,7 @@ public class HitCountTestCase { final long chain2TotalHitCount = 11; final long chain2DeepHitCount = 15; - FederationTester tester = new FederationTester(executor); + FederationTester tester = new FederationTester(); tester.addSearchChain("chain1", new SetHitCountsSearcher(chain1TotalHitCount, chain1DeepHitCount)); diff --git a/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionOfOneChainTestCase.java b/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionOfOneChainTestCase.java index 74d74e96b05..f0be6a25f92 100644 --- a/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionOfOneChainTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionOfOneChainTestCase.java @@ -58,12 +58,12 @@ public class AsyncExecutionOfOneChainTestCase { public Result search(Query query, Execution execution) { List<FutureResult> futureResults = new ArrayList<>(parallelism); for (int i = 0; i < parallelism; i++) - futureResults.add(new AsyncExecution(execution).search(query.clone(), executor)); + futureResults.add(new AsyncExecution(execution).search(query.clone())); Result mainResult = execution.search(query); // Add hits from other threads - AsyncExecution.waitForAll(futureResults,query.getTimeLeft(), executor); + AsyncExecution.waitForAll(futureResults,query.getTimeLeft()); for (FutureResult futureResult : futureResults) { Result result = futureResult.get(); mainResult.mergeWith(result); diff --git a/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionTestCase.java b/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionTestCase.java index ec1c78437b6..8f23c7eef83 100644 --- a/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/searchchain/AsyncExecutionTestCase.java @@ -7,15 +7,11 @@ import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.Searcher; import com.yahoo.search.result.Hit; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; @@ -30,29 +26,17 @@ import static org.junit.Assert.assertTrue; */ public class AsyncExecutionTestCase { - private ExecutorService executor; - - @Before - public void setUp() throws Exception { - executor = Executors.newFixedThreadPool(16); - } - - @After - public void tearDown() { - assertEquals(0, executor.shutdownNow().size()); - } - public static class WaitingSearcher extends Searcher { int waittime; - private WaitingSearcher(String id,int waittime) { + private WaitingSearcher(String id, int waittime) { super(new ComponentId(id)); this.waittime = waittime; } @Override - public Result search(Query query,Execution execution) { - Result result=execution.search(query); + public Result search(Query query, Execution execution) { + Result result = execution.search(query); if(waittime != 0) try { Thread.sleep(waittime); @@ -64,7 +48,7 @@ public class AsyncExecutionTestCase { public static class SimpleSearcher extends Searcher { - public Result search(Query query,Execution execution) { + public Result search(Query query, Execution execution) { return execution.search(query); } @@ -79,7 +63,7 @@ public class AsyncExecutionTestCase { Chain<Searcher> searchChain = new Chain<>(new ComponentId("chain"), searchList); AsyncExecution asyncExecution = new AsyncExecution(searchChain, Execution.Context.createContextStub()); - FutureResult future = asyncExecution.search(new Query("?hits=0"), executor); + FutureResult future = asyncExecution.search(new Query("?hits=0")); Result result = future.get(0, TimeUnit.MILLISECONDS); assertNotNull(result.hits().getError()); @@ -98,11 +82,11 @@ public class AsyncExecutionTestCase { Arrays.asList(new Searcher[]{new SimpleSearcher()}) ); - FutureResult slowFuture = new AsyncExecution(slowChain, Execution.Context.createContextStub()).search(new Query("?hits=0"), executor); - FutureResult fastFuture = new AsyncExecution(fastChain, Execution.Context.createContextStub()).search(new Query("?hits=0"), executor); + FutureResult slowFuture = new AsyncExecution(slowChain, Execution.Context.createContextStub()).search(new Query("?hits=0")); + FutureResult fastFuture = new AsyncExecution(fastChain, Execution.Context.createContextStub()).search(new Query("?hits=0")); fastFuture.get(); FutureResult [] reslist = new FutureResult[]{slowFuture,fastFuture}; - List<Result> results = AsyncExecution.waitForAll(Arrays.asList(reslist),0, executor); + List<Result> results = AsyncExecution.waitForAll(Arrays.asList(reslist),0); //assertTrue(slowFuture.isCancelled()); assertTrue(fastFuture.isDone() && !fastFuture.isCancelled()); @@ -133,26 +117,26 @@ public class AsyncExecutionTestCase { @Test public void testAsyncThroughSync() { - Query query=new Query("?query=test"); - Searcher searcher=new ResultProducingSearcher(); - FutureResult futureResult=new AsyncExecution(new Execution(searcher, Execution.Context.createContextStub())).search(query, executor); + Query query = new Query("?query=test"); + Searcher searcher = new ResultProducingSearcher(); + FutureResult futureResult = new AsyncExecution(new Execution(searcher, Execution.Context.createContextStub())).search(query); - List<FutureResult> futureResultList=new ArrayList<>(); + List<FutureResult> futureResultList = new ArrayList<>(); futureResultList.add(futureResult); - AsyncExecution.waitForAll(futureResultList,1000, executor); - Result result=futureResult.get(); + AsyncExecution.waitForAll(futureResultList, 1000); + Result result = futureResult.get(); - assertEquals(1,result.hits().size()); - assertEquals("hello",result.hits().get(0).getField("test")); + assertEquals(1, result.hits().size()); + assertEquals("hello", result.hits().get(0).getField("test")); } private static class ResultProducingSearcher extends Searcher { @Override - public Result search(Query query,Execution execution) { - Result result=new Result(query); - Hit hit=new Hit("test"); - hit.setField("test","hello"); + public Result search(Query query, Execution execution) { + Result result = new Result(query); + Hit hit = new Hit("test"); + hit.setField("test", "hello"); result.hits().add(hit); return result; } @@ -174,7 +158,7 @@ public class AsyncExecutionTestCase { }); Execution execution = new Execution(chain, Execution.Context.createContextStub()); AsyncExecution async = new AsyncExecution(execution); - FutureResult future = async.searchAndFill(new Query(), executor); + FutureResult future = async.searchAndFill(new Query()); future.get(1, TimeUnit.MILLISECONDS); } diff --git a/container-search/src/test/java/com/yahoo/search/searchchain/VespaAsyncSearcherTest.java b/container-search/src/test/java/com/yahoo/search/searchchain/VespaAsyncSearcherTest.java index 0b893020a16..7ac6ded7877 100644 --- a/container-search/src/test/java/com/yahoo/search/searchchain/VespaAsyncSearcherTest.java +++ b/container-search/src/test/java/com/yahoo/search/searchchain/VespaAsyncSearcherTest.java @@ -2,7 +2,6 @@ package com.yahoo.search.searchchain; import com.yahoo.component.chain.Chain; -import com.yahoo.concurrent.InThreadExecutorService; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.Searcher; @@ -12,7 +11,6 @@ import org.junit.Test; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -40,19 +38,16 @@ public class VespaAsyncSearcherTest { private static class FirstSearcher extends Searcher { - private final Executor executor; - FirstSearcher(Executor executor) { this.executor = executor;} - @Override public Result search(Query query, Execution execution) { int count = 10; List<FutureResult> futures = new ArrayList<>(count); for (int i = 0; i < count; i++) { Query subQuery = query.clone(); - FutureResult future = new AsyncExecution(execution).search(subQuery, executor); + FutureResult future = new AsyncExecution(execution).search(subQuery); futures.add(future); } - AsyncExecution.waitForAll(futures, 10 * 60 * 1000, new InThreadExecutorService()); + AsyncExecution.waitForAll(futures, 10 * 60 * 1000); Result combinedResult = new Result(query); for (FutureResult resultFuture : futures) { Result result = resultFuture.get(); @@ -75,7 +70,7 @@ public class VespaAsyncSearcherTest { @Test public void testAsyncExecution() { - Chain<Searcher> chain = new Chain<>(new FirstSearcher(executor), new SecondSearcher()); + Chain<Searcher> chain = new Chain<>(new FirstSearcher(), new SecondSearcher()); Execution execution = new Execution(chain, Execution.Context.createContextStub(null)); Query query = new Query(); execution.search(query); |