diff options
author | 2018-05-29 05:17:35 -0700 | |
---|---|---|
committer | 2018-05-29 05:18:35 -0700 | |
commit | 904a8d63833301f54c7df85bccc56ff67156afc5 (patch) | |
tree | 3e272496bee7dee8f2d9c4690128e4f13cb323fe /src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java | |
parent | ab2431e1ef62d91230fdef49b2556bbe60c9de56 (diff) |
Refactor root cause reporting in ConfiguredTargetFunction
We now track Causes instead of plain Labels, which will allow us to do better reporting in the future. Add basic tests.
PiperOrigin-RevId: 198380468
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java index 9c36ba5daa..c4491ff6a0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java @@ -34,12 +34,10 @@ import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictEx import com.google.devtools.build.lib.actions.PackageRoots; import com.google.devtools.build.lib.analysis.AnalysisFailureEvent; import com.google.devtools.build.lib.analysis.BlazeDirectories; -import com.google.devtools.build.lib.analysis.BuildView; import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.ConfiguredTargetFactory; -import com.google.devtools.build.lib.analysis.LegacyAnalysisFailureEvent; import com.google.devtools.build.lib.analysis.ToolchainContext; import com.google.devtools.build.lib.analysis.ViewCreationFailedException; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; @@ -51,6 +49,7 @@ import com.google.devtools.build.lib.analysis.config.FragmentClassSet; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.causes.Cause; import com.google.devtools.build.lib.causes.LabelCause; +import com.google.devtools.build.lib.causes.LoadingFailedCause; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.events.Event; @@ -78,10 +77,10 @@ import com.google.devtools.build.skyframe.SkyFunction.Environment; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.logging.Logger; import javax.annotation.Nullable; /** @@ -90,8 +89,6 @@ import javax.annotation.Nullable; * <p>Covers enough functionality to work as a substitute for {@code BuildView#configureTargets}. */ public final class SkyframeBuildView { - private static final Logger logger = Logger.getLogger(BuildView.class.getName()); - private final ConfiguredTargetFactory factory; private final ArtifactFactory artifactFactory; private final SkyframeExecutor skyframeExecutor; @@ -332,26 +329,34 @@ public final class SkyframeBuildView { skyframeExecutor.getCyclesReporter().reportCycles(errorInfo.getCycleInfo(), errorKey, eventHandler); Exception cause = errorInfo.getException(); - Label analysisRootCause = null; BuildEventId configuration = null; Iterable<Cause> rootCauses; if (cause instanceof ConfiguredValueCreationException) { ConfiguredValueCreationException ctCause = (ConfiguredValueCreationException) cause; - for (Label rootCause : ctCause.getRootCauses()) { - hasLoadingError = true; - eventBus.post(new LoadingFailureEvent(topLevelLabel, rootCause)); + // Previously, the nested set was de-duplicating loading root cause labels. Now that we + // track Cause instances including a message, we get one event per label and message. In + // order to keep backwards compatibility, we de-duplicate root cause labels here. + // TODO(ulfjack): Remove this code once we've migrated to the BEP. + Set<Label> loadingRootCauses = new HashSet<>(); + for (Cause rootCause : ctCause.getRootCauses()) { + if (rootCause instanceof LoadingFailedCause) { + hasLoadingError = true; + loadingRootCauses.add(rootCause.getLabel()); + } } - analysisRootCause = ctCause.getAnalysisRootCause(); - rootCauses = analysisRootCause != null - ? ImmutableList.of(new LabelCause(analysisRootCause)) - : ImmutableList.copyOf(Iterables.transform(ctCause.getRootCauses(), LabelCause::new)); + for (Label loadingRootCause : loadingRootCauses) { + // This event is only for backwards compatibility with the old event protocol. Remove + // once we've migrated to the build event protocol. + eventBus.post(new LoadingFailureEvent(topLevelLabel, loadingRootCause)); + } + rootCauses = ctCause.getRootCauses(); configuration = ctCause.getConfiguration(); } else if (!Iterables.isEmpty(errorInfo.getCycleInfo())) { - analysisRootCause = maybeGetConfiguredTargetCycleCulprit( + Label analysisRootCause = maybeGetConfiguredTargetCycleCulprit( topLevelLabel, errorInfo.getCycleInfo()); - // TODO(ulfjack): Report the dependency cycle. rootCauses = analysisRootCause != null - ? ImmutableList.of(new LabelCause(analysisRootCause)) + ? ImmutableList.of(new LabelCause(analysisRootCause, "Dependency cycle")) + // TODO(ulfjack): We need to report the dependency cycle here. How? : ImmutableList.of(); } else if (cause instanceof ActionConflictException) { ((ActionConflictException) cause).reportTo(eventHandler); @@ -367,9 +372,6 @@ public final class SkyframeBuildView { ConfiguredTargetKey configuredTargetKey = ConfiguredTargetKey.of( topLevelLabel, label.getConfigurationKey(), label.isHostConfiguration()); - if (analysisRootCause != null) { - eventBus.post(new LegacyAnalysisFailureEvent(configuredTargetKey, analysisRootCause)); - } eventBus.post(new AnalysisFailureEvent(configuredTargetKey, configuration, rootCauses)); } |