diff options
author | 2016-11-14 19:55:50 +0000 | |
---|---|---|
committer | 2016-11-15 15:59:08 +0000 | |
commit | 5bd26b24a643432c962b6256876b6729199c03d9 (patch) | |
tree | 9475e4cbc373a57504c41812e4cd593a7cc7d84e /src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java | |
parent | b7eeaa37705c7f4282d0c9bd654fb2540c361d7a (diff) |
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java | 47 |
1 files changed, 38 insertions, 9 deletions
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<Target> graphBackedRecursivePackageProvider, eventHandler, TargetPatternEvaluator.DEFAULT_FILTERING_POLICY, - forkJoinPool, packageSemaphore); } @@ -580,6 +579,18 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> return new ThreadSafeReverseDepSkyKeyUniquifier(DEFAULT_THREAD_COUNT); } + private Pair<TargetPattern, ImmutableSet<PathFragment>> getPatternAndExcludes(String pattern) + throws TargetParsingException, InterruptedException { + TargetPatternKey targetPatternKey = + ((TargetPatternKey) + TargetPatternValue.key( + pattern, TargetPatternEvaluator.DEFAULT_FILTERING_POLICY, parserPrefix) + .argument()); + ImmutableSet<PathFragment> subdirectoriesToExclude = + targetPatternKey.getAllSubdirectoriesToExclude(blacklistPatternsSupplier); + return Pair.of(targetPatternKey.getParsedPattern(), subdirectoriesToExclude); + } + @ThreadSafe @Override public void getTargetsMatchingPattern( @@ -587,15 +598,33 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> 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<TargetPattern, ImmutableSet<PathFragment>> patternToEvalAndSubdirectoriesToExclude = + getPatternAndExcludes(pattern); + TargetPattern patternToEval = patternToEvalAndSubdirectoriesToExclude.getFirst(); + ImmutableSet<PathFragment> 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<Target> callback, + ForkJoinPool forkJoinPool) + throws QueryException, InterruptedException { + // Directly evaluate the target pattern, making use of packages in the graph. + try { + Pair<TargetPattern, ImmutableSet<PathFragment>> patternToEvalAndSubdirectoriesToExclude = + getPatternAndExcludes(pattern); + TargetPattern patternToEval = patternToEvalAndSubdirectoriesToExclude.getFirst(); ImmutableSet<PathFragment> 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()); } |