diff options
4 files changed, 158 insertions, 61 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java b/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java index 3f6d11fbb1..00aa64e5e3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java @@ -194,37 +194,46 @@ public final class LegacyLoadingPhaseRunner extends LoadingPhaseRunner { ImmutableSet.copyOf(Sets.difference(targetsToLoad, expandedTargetsToLoad)); long testSuiteTime = timer.stop().elapsed(TimeUnit.MILLISECONDS); + ImmutableSet<Label> targetLabels = + expandedTargetsToLoad.stream().map(Target::getLabel).collect(ImmutableSet.toImmutableSet()); + ImmutableSet<Label> testsToRunLabels = null; + if (testsToRun != null) { + testsToRunLabels = + testsToRun.stream().map(Target::getLabel).collect(ImmutableSet.toImmutableSet()); + } + ImmutableSet<Label> removedTargetLabels = + removedTargets.stream().map(Target::getLabel).collect(ImmutableSet.toImmutableSet()); + TargetPatternPhaseValue patternParsingValue = new TargetPatternPhaseValue( - expandedTargetsToLoad, - testsToRun, + targetLabels, + testsToRunLabels, targets.hasError(), expandedResult.hasError(), - filteredTargets, - testFilteredTargets, - removedTargets, + removedTargetLabels, getWorkspaceName(eventHandler)); // This is the same code as SkyframeLoadingPhaseRunner. eventHandler.post( new TargetParsingCompleteEvent( targets.getTargets(), - patternParsingValue.getFilteredTargets(), - patternParsingValue.getTestFilteredTargets(), + filteredTargets, + testFilteredTargets, targetPatterns, - patternParsingValue.getTargets())); + expandedTargetsToLoad)); eventHandler.post(new TargetParsingPhaseTimeEvent(targetPatternEvalTime)); if (callback != null) { - callback.notifyTargets(patternParsingValue.getTargets()); + callback.notifyTargets(expandedTargetsToLoad); } + eventHandler.post( new LoadingPhaseCompleteEvent( - patternParsingValue.getTargets(), - patternParsingValue.getRemovedTargets(), + expandedTargetsToLoad, + removedTargets, packageManager.getAndClearStatistics(), testSuiteTime)); logger.info("Target pattern evaluation finished"); - return patternParsingValue.toLoadingResult(); + return patternParsingValue.toLoadingResult(eventHandler, packageManager); } private ResolvedTargets<Target> expandTestSuites( diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 06bf59f9de..9a20f425a7 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -103,6 +103,7 @@ import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.packages.RuleVisibility; import com.google.devtools.build.lib.packages.SkylarkSemanticsOptions; +import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.LoadingCallback; import com.google.devtools.build.lib.pkgcache.LoadingFailedException; import com.google.devtools.build.lib.pkgcache.LoadingOptions; @@ -2202,13 +2203,17 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { TargetPatternPhaseValue patternParsingValue = evalResult.get(key); eventHandler.post(new TargetParsingPhaseTimeEvent(timeMillis)); + ImmutableSet<Target> targets = patternParsingValue.getTargets(eventHandler, packageManager); if (callback != null) { - callback.notifyTargets(patternParsingValue.getTargets()); + callback.notifyTargets(targets); } - eventHandler.post(new LoadingPhaseCompleteEvent( - patternParsingValue.getTargets(), patternParsingValue.getRemovedTargets(), - PackageManagerStatistics.ZERO, /*timeInMs=*/0)); - return patternParsingValue.toLoadingResult(); + eventHandler.post( + new LoadingPhaseCompleteEvent( + targets, + patternParsingValue.getRemovedTargets(eventHandler, packageManager), + PackageManagerStatistics.ZERO, + /*timeInMs=*/ 0)); + return patternParsingValue.toLoadingResult(eventHandler, packageManager); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java index ee6cddcb35..2e0c286c27 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java @@ -185,17 +185,37 @@ final class TargetPatternPhaseFunction implements SkyFunction { ResolvedTargets<Target> expandedTargets = expandedTargetsBuilder.build(); Set<Target> testSuiteTargets = Sets.difference(targets.getTargets(), expandedTargets.getTargets()); - TargetPatternPhaseValue result = new TargetPatternPhaseValue( - expandedTargets.getTargets(), testsToRun, preExpansionError, - expandedTargets.hasError() || workspaceError, filteredTargets, testFilteredTargets, - ImmutableSet.copyOf(testSuiteTargets), workspaceName); - env.getListener().post( - new TargetParsingCompleteEvent( - targets.getTargets(), - result.getFilteredTargets(), - result.getTestFilteredTargets(), - options.getTargetPatterns(), - result.getTargets())); + ImmutableSet<Label> targetLabels = + expandedTargets + .getTargets() + .stream() + .map(Target::getLabel) + .collect(ImmutableSet.toImmutableSet()); + ImmutableSet<Label> testsToRunLabels = null; + if (testsToRun != null) { + testsToRunLabels = + testsToRun.stream().map(Target::getLabel).collect(ImmutableSet.toImmutableSet()); + } + ImmutableSet<Label> removedTargetLabels = + testSuiteTargets.stream().map(Target::getLabel).collect(ImmutableSet.toImmutableSet()); + + TargetPatternPhaseValue result = + new TargetPatternPhaseValue( + targetLabels, + testsToRunLabels, + targets.hasError(), + expandedTargets.hasError() || workspaceError, + removedTargetLabels, + workspaceName); + + env.getListener() + .post( + new TargetParsingCompleteEvent( + targets.getTargets(), + filteredTargets, + testFilteredTargets, + options.getTargetPatterns(), + expandedTargets.getTargets())); return result; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java index 6e24906e52..787c095e91 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java @@ -17,10 +17,15 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.packages.NoSuchPackageException; +import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.LoadingResult; +import com.google.devtools.build.lib.pkgcache.PackageManager; import com.google.devtools.build.lib.pkgcache.TestFilter; import com.google.devtools.build.lib.skyframe.serialization.NotSerializableRuntimeException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; @@ -41,42 +46,58 @@ import javax.annotation.Nullable; @Immutable @ThreadSafe @VisibleForTesting +@AutoCodec public final class TargetPatternPhaseValue implements SkyValue { - private final ImmutableSet<Target> targets; - @Nullable private final ImmutableSet<Target> testsToRun; + private final ImmutableSet<Label> targetLabels; + @Nullable private final ImmutableSet<Label> testsToRunLabels; private final boolean hasError; private final boolean hasPostExpansionError; - private final ImmutableSet<Target> filteredTargets; - private final ImmutableSet<Target> testFilteredTargets; - // This field is only for the purposes of generating the LoadingPhaseCompleteEvent. // TODO(ulfjack): Support EventBus event posting in Skyframe, and remove this code again. - private final ImmutableSet<Target> removedTargets; + private final ImmutableSet<Label> removedTargetLabels; private final String workspaceName; - TargetPatternPhaseValue(ImmutableSet<Target> targets, @Nullable ImmutableSet<Target> testsToRun, - boolean hasError, boolean hasPostExpansionError, ImmutableSet<Target> filteredTargets, - ImmutableSet<Target> testFilteredTargets, ImmutableSet<Target> removedTargets, + TargetPatternPhaseValue( + ImmutableSet<Label> targetLabels, + ImmutableSet<Label> testsToRunLabels, + boolean hasError, + boolean hasPostExpansionError, + ImmutableSet<Label> removedTargetLabels, String workspaceName) { - this.targets = Preconditions.checkNotNull(targets); - this.testsToRun = testsToRun; + this.targetLabels = targetLabels; + this.testsToRunLabels = testsToRunLabels; this.hasError = hasError; this.hasPostExpansionError = hasPostExpansionError; - this.filteredTargets = Preconditions.checkNotNull(filteredTargets); - this.testFilteredTargets = Preconditions.checkNotNull(testFilteredTargets); - this.removedTargets = Preconditions.checkNotNull(removedTargets); + this.removedTargetLabels = removedTargetLabels; this.workspaceName = workspaceName; } - public ImmutableSet<Target> getTargets() { - return targets; + public ImmutableSet<Target> getTargets( + ExtendedEventHandler eventHandler, PackageManager packageManager) { + return targetLabels + .stream() + .map( + (label) -> { + try { + return packageManager + .getPackage(eventHandler, label.getPackageIdentifier()) + .getTarget(label.getName()); + } catch (NoSuchPackageException | NoSuchTargetException | InterruptedException e) { + throw new RuntimeException("Failed to get package from TargetPatternPhaseValue", e); + } + }) + .collect(ImmutableSet.toImmutableSet()); + } + + public ImmutableSet<Label> getTargetLabels() { + return targetLabels; } @Nullable - public ImmutableSet<Target> getTestsToRun() { - return testsToRun; + public ImmutableSet<Label> getTestsToRunLabels() { + return testsToRunLabels; } public boolean hasError() { @@ -87,30 +108,72 @@ public final class TargetPatternPhaseValue implements SkyValue { return hasPostExpansionError; } - public ImmutableSet<Target> getFilteredTargets() { - return filteredTargets; - } - - public ImmutableSet<Target> getTestFilteredTargets() { - return testFilteredTargets; - } - /** - * Returns a set of targets that were present on the command line but got - * expanded during the loading phase (currently these are only test suites; - * this set is always empty when <code>--expand_test_suites=false</code>. + * Returns a set of targets that were present on the command line but got expanded during the + * loading phase (currently these are only test suites; this set is always empty when <code> + * --expand_test_suites=false</code>. */ - public ImmutableSet<Target> getRemovedTargets() { - return removedTargets; + public ImmutableSet<Target> getRemovedTargets( + ExtendedEventHandler eventHandler, PackageManager packageManager) { + return removedTargetLabels + .stream() + .map( + (label) -> { + try { + return packageManager + .getPackage(eventHandler, label.getPackageIdentifier()) + .getTarget(label.getName()); + } catch (NoSuchPackageException | NoSuchTargetException | InterruptedException e) { + throw new RuntimeException(e); + } + }) + .collect(ImmutableSet.toImmutableSet()); } public String getWorkspaceName() { return workspaceName; } - public LoadingResult toLoadingResult() { + public LoadingResult toLoadingResult( + ExtendedEventHandler eventHandler, PackageManager packageManager) { + ImmutableSet<Target> targets = + getTargetLabels() + .stream() + .map( + (label) -> { + try { + return packageManager + .getPackage(eventHandler, label.getPackageIdentifier()) + .getTarget(label.getName()); + } catch (NoSuchPackageException + | NoSuchTargetException + | InterruptedException e) { + throw new RuntimeException(e); + } + }) + .collect(ImmutableSet.toImmutableSet()); + ImmutableSet<Target> testsToRun = null; + if (testsToRunLabels != null) { + testsToRun = + getTestsToRunLabels() + .stream() + .map( + (label) -> { + try { + return packageManager + .getPackage(eventHandler, label.getPackageIdentifier()) + .getTarget(label.getName()); + } catch (NoSuchPackageException + | NoSuchTargetException + | InterruptedException e) { + throw new RuntimeException(e); + } + }) + .collect(ImmutableSet.toImmutableSet()); + } + return new LoadingResult( - hasError(), hasPostExpansionError(), getTargets(), getTestsToRun(), getWorkspaceName()); + hasError(), hasPostExpansionError(), targets, testsToRun, getWorkspaceName()); } @SuppressWarnings("unused") |