aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2018-05-29 05:17:35 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-29 05:18:35 -0700
commit904a8d63833301f54c7df85bccc56ff67156afc5 (patch)
tree3e272496bee7dee8f2d9c4690128e4f13cb323fe /src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
parentab2431e1ef62d91230fdef49b2556bbe60c9de56 (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.java40
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));
}