From 5bd26b24a643432c962b6256876b6729199c03d9 Mon Sep 17 00:00:00 2001 From: Nathan Harmata Date: Mon, 14 Nov 2016 19:55:50 +0000 Subject: Make TargetPattern evaluation during query evaluation more parallel-friendly by introducing TargetPattern#parEval, which allows TargetPatterns' evaluations to explicitly have parallel implementations (no need to secretly use a FJP). -- MOS_MIGRATED_REVID=139101922 --- .../build/lib/query2/SkyQueryEnvironment.java | 47 +++++++++++++++++----- 1 file changed, 38 insertions(+), 9 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java') diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java index 8ca4cc5232..9e33d50bf6 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java @@ -224,7 +224,6 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment graphBackedRecursivePackageProvider, eventHandler, TargetPatternEvaluator.DEFAULT_FILTERING_POLICY, - forkJoinPool, packageSemaphore); } @@ -580,6 +579,18 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment return new ThreadSafeReverseDepSkyKeyUniquifier(DEFAULT_THREAD_COUNT); } + private Pair> getPatternAndExcludes(String pattern) + throws TargetParsingException, InterruptedException { + TargetPatternKey targetPatternKey = + ((TargetPatternKey) + TargetPatternValue.key( + pattern, TargetPatternEvaluator.DEFAULT_FILTERING_POLICY, parserPrefix) + .argument()); + ImmutableSet subdirectoriesToExclude = + targetPatternKey.getAllSubdirectoriesToExclude(blacklistPatternsSupplier); + return Pair.of(targetPatternKey.getParsedPattern(), subdirectoriesToExclude); + } + @ThreadSafe @Override public void getTargetsMatchingPattern( @@ -587,15 +598,33 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment throws QueryException, InterruptedException { // Directly evaluate the target pattern, making use of packages in the graph. try { - TargetPatternKey targetPatternKey = - ((TargetPatternKey) - TargetPatternValue.key( - pattern, TargetPatternEvaluator.DEFAULT_FILTERING_POLICY, parserPrefix) - .argument()); - TargetPattern parsedPattern = targetPatternKey.getParsedPattern(); + Pair> patternToEvalAndSubdirectoriesToExclude = + getPatternAndExcludes(pattern); + TargetPattern patternToEval = patternToEvalAndSubdirectoriesToExclude.getFirst(); + ImmutableSet subdirectoriesToExclude = + patternToEvalAndSubdirectoriesToExclude.getSecond(); + patternToEval.eval(resolver, subdirectoriesToExclude, callback, QueryException.class); + } catch (TargetParsingException e) { + reportBuildFileError(owner, e.getMessage()); + } + } + + @Override + public void getTargetsMatchingPatternPar( + QueryExpression owner, + String pattern, + ThreadSafeCallback callback, + ForkJoinPool forkJoinPool) + throws QueryException, InterruptedException { + // Directly evaluate the target pattern, making use of packages in the graph. + try { + Pair> patternToEvalAndSubdirectoriesToExclude = + getPatternAndExcludes(pattern); + TargetPattern patternToEval = patternToEvalAndSubdirectoriesToExclude.getFirst(); ImmutableSet subdirectoriesToExclude = - targetPatternKey.getAllSubdirectoriesToExclude(blacklistPatternsSupplier); - parsedPattern.eval(resolver, subdirectoriesToExclude, callback, QueryException.class); + patternToEvalAndSubdirectoriesToExclude.getSecond(); + patternToEval.parEval( + resolver, subdirectoriesToExclude, callback, QueryException.class, forkJoinPool); } catch (TargetParsingException e) { reportBuildFileError(owner, e.getMessage()); } -- cgit v1.2.3