Thread BlazeRuntime#bugReporter through to SkyframeExecutor -> ActionExecutionFunction and friends, allowing us to make better assertions in tests.
I couldn't reproduce my claims of actually crashing in these tests, so added the additional coverage for my sins.
This may be overkill since in the end I might just remove these bug reports anyway, but the overall changes seem worth it for future testability at the cost of one more straw on the camel's back of SkyframeExecutor constructor argument length.
PiperOrigin-RevId: 366857978
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 73302b4..50a6d96 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -791,7 +791,8 @@
? modifiedOutputFiles
: ModifiedFileSet.NOTHING_MODIFIED,
env.getFileCache(),
- prefetcher);
+ prefetcher,
+ env.getRuntime().getBugReporter());
}
@VisibleForTesting
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
index 5e0c736..8d48b77 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
@@ -35,7 +35,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
import com.google.devtools.build.lib.analysis.test.TestProvider;
-import com.google.devtools.build.lib.bugreport.BugReport;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressReceiverAvailableEvent;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
import com.google.devtools.build.lib.events.Reporter;
@@ -87,6 +87,7 @@
private final ActionInputPrefetcher actionInputPrefetcher;
private final ActionCacheChecker actionCacheChecker;
private final TopDownActionCache topDownActionCache;
+ private final BugReporter bugReporter;
@VisibleForTesting
public SkyframeBuilder(
@@ -96,7 +97,8 @@
TopDownActionCache topDownActionCache,
ModifiedFileSet modifiedOutputFiles,
MetadataProvider fileCache,
- ActionInputPrefetcher actionInputPrefetcher) {
+ ActionInputPrefetcher actionInputPrefetcher,
+ BugReporter bugReporter) {
this.resourceManager = resourceManager;
this.skyframeExecutor = skyframeExecutor;
this.actionCacheChecker = actionCacheChecker;
@@ -104,6 +106,7 @@
this.modifiedOutputFiles = modifiedOutputFiles;
this.fileCache = fileCache;
this.actionInputPrefetcher = actionInputPrefetcher;
+ this.bugReporter = bugReporter;
}
@Override
@@ -257,7 +260,7 @@
* <p>Throws on catastrophic failures and, if !keepGoing, on any failure.
*/
@Nullable
- private static DetailedExitCode processResult(
+ private DetailedExitCode processResult(
ExtendedEventHandler eventHandler,
EvaluationResult<?> result,
boolean keepGoing,
@@ -270,7 +273,7 @@
}
if (result.getCatastrophe() != null) {
- rethrow(result.getCatastrophe());
+ rethrow(result.getCatastrophe(), bugReporter);
}
if (keepGoing) {
// If build fails and keepGoing is true, an exit code is assigned using reported errors
@@ -327,7 +330,7 @@
throw new BuildFailedException(
null, createDetailedExitCode("cycle found during execution", Code.CYCLE));
} else {
- rethrow(exception);
+ rethrow(exception, bugReporter);
}
}
@@ -336,7 +339,8 @@
/** Figure out why an action's execution failed and rethrow the right kind of exception. */
@VisibleForTesting
- public static void rethrow(Throwable cause) throws BuildFailedException, TestExecException {
+ public static void rethrow(Throwable cause, BugReporter bugReporter)
+ throws BuildFailedException, TestExecException {
Throwables.throwIfUnchecked(cause);
Throwable innerCause = cause.getCause();
if (innerCause instanceof TestExecException) {
@@ -378,7 +382,7 @@
// We encountered an exception we don't think we should have encountered. This can indicate
// an exception-processing bug in our code, such as lower level exceptions not being properly
// handled, or in our expectations in this method.
- BugReport.sendBugReport(
+ bugReporter.sendBugReport(
new IllegalStateException("action terminated with unexpected exception", cause));
String message =
"Unexpected exception, please file an issue with the Bazel team: " + cause.getMessage();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java b/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java
index 4438c96..1d9ff08 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java
@@ -81,7 +81,8 @@
diffAwarenessFactories.build(),
skyFunctions.build(),
customDirtinessCheckers.build(),
- managedDirectoriesKnowledge);
+ managedDirectoriesKnowledge,
+ runtime.getBugReporter());
return new BlazeWorkspace(
runtime,
directories,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index e9091ee..259e6e0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -59,6 +59,7 @@
import com.google.devtools.build.lib.actionsketch.ActionSketch;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.bugreport.BugReport;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.causes.Cause;
import com.google.devtools.build.lib.causes.LabelCause;
import com.google.devtools.build.lib.clock.BlazeClock;
@@ -140,15 +141,18 @@
private final SkyframeActionExecutor skyframeActionExecutor;
private final BlazeDirectories directories;
private final AtomicReference<TimestampGranularityMonitor> tsgm;
+ private final BugReporter bugReporter;
private ConcurrentMap<Action, ContinuationState> stateMap;
public ActionExecutionFunction(
SkyframeActionExecutor skyframeActionExecutor,
BlazeDirectories directories,
- AtomicReference<TimestampGranularityMonitor> tsgm) {
+ AtomicReference<TimestampGranularityMonitor> tsgm,
+ BugReporter bugReporter) {
this.skyframeActionExecutor = skyframeActionExecutor;
this.directories = directories;
this.tsgm = tsgm;
+ this.bugReporter = bugReporter;
// TODO(b/136156191): This stays in RAM while the SkyFunction of the action is pending, which
// can result in a lot of memory pressure if a lot of actions are pending.
stateMap = Maps.newConcurrentMap();
@@ -952,7 +956,7 @@
retrievedMetadata = nonMandatoryDiscovered.get(Artifact.key(input)).get();
} catch (SourceArtifactException e) {
if (!input.isSourceArtifact()) {
- BugReport.sendBugReport(
+ bugReporter.sendBugReport(
new IllegalStateException(
"Non-source artifact had SourceArtifactException" + input, e));
}
@@ -1230,14 +1234,14 @@
value = valueOrException.get();
} catch (SourceArtifactException e) {
if (!input.isSourceArtifact()) {
- BugReport.sendBugReport(
+ bugReporter.sendBugReport(
new IllegalStateException(
"Non-source artifact had SourceArtifactException" + input, e));
}
if (mandatory) {
sourceArtifactErrorCauses.add(
createLabelCauseNullOwnerOk(
- input, e.getDetailedExitCode(), action.getOwner().getLabel()));
+ input, e.getDetailedExitCode(), action.getOwner().getLabel(), bugReporter));
continue;
}
} catch (ActionExecutionException e) {
@@ -1265,7 +1269,8 @@
createLabelCause(
input,
((MissingArtifactValue) value).getDetailedExitCode(),
- action.getOwner().getLabel()));
+ action.getOwner().getLabel(),
+ bugReporter));
continue;
} else {
value = FileArtifactValue.MISSING_FILE_MARKER;
@@ -1428,21 +1433,27 @@
}
static LabelCause createLabelCause(
- Artifact input, DetailedExitCode detailedExitCode, Label labelInCaseOfBug) {
+ Artifact input,
+ DetailedExitCode detailedExitCode,
+ Label labelInCaseOfBug,
+ BugReporter bugReporter) {
if (input.getOwner() == null) {
- BugReport.sendBugReport(
+ bugReporter.sendBugReport(
new IllegalStateException(
String.format(
"Mandatory artifact %s with exit code %s should have owner (%s)",
input, detailedExitCode, labelInCaseOfBug)));
}
- return createLabelCauseNullOwnerOk(input, detailedExitCode, labelInCaseOfBug);
+ return createLabelCauseNullOwnerOk(input, detailedExitCode, labelInCaseOfBug, bugReporter);
}
private static LabelCause createLabelCauseNullOwnerOk(
- Artifact input, DetailedExitCode detailedExitCode, Label actionLabel) {
+ Artifact input,
+ DetailedExitCode detailedExitCode,
+ Label actionLabel,
+ BugReporter bugReporter) {
if (!input.isSourceArtifact()) {
- BugReport.sendBugReport(
+ bugReporter.sendBugReport(
new IllegalStateException(
String.format(
"Unexpected exit code %s for generated artifact %s (%s)",
@@ -1699,7 +1710,7 @@
private void handleSourceArtifactExceptionFromSkykey(SkyKey key, SourceArtifactException e) {
if (!(key instanceof Artifact) || !((Artifact) key).isSourceArtifact()) {
- BugReport.sendBugReport(
+ bugReporter.sendBugReport(
new IllegalStateException(
"Unexpected SourceArtifactException for key: " + key + ", " + action, e));
missingArtifactCauses.add(
@@ -1710,13 +1721,17 @@
if (isMandatory((Artifact) key)) {
missingArtifactCauses.add(
createLabelCauseNullOwnerOk(
- (Artifact) key, e.getDetailedExitCode(), action.getOwner().getLabel()));
+ (Artifact) key,
+ e.getDetailedExitCode(),
+ action.getOwner().getLabel(),
+ bugReporter));
}
}
void accumulateMissingFileArtifactValue(Artifact input, MissingArtifactValue value) {
missingArtifactCauses.add(
- createLabelCause(input, value.getDetailedExitCode(), action.getOwner().getLabel()));
+ createLabelCause(
+ input, value.getDetailedExitCode(), action.getOwner().getLabel(), bugReporter));
}
/** @throws ActionExecutionException if there is any accumulated exception from the inputs. */
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java
index 3bf7c52..1262936 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java
@@ -20,6 +20,7 @@
import com.google.devtools.build.lib.analysis.AspectValue;
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup;
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsToBuild;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.buildeventstream.BuildEventIdUtil;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId;
import com.google.devtools.build.lib.causes.Cause;
@@ -41,12 +42,14 @@
static SkyFunction aspectCompletionFunction(
PathResolverFactory pathResolverFactory,
SkyframeActionExecutor skyframeActionExecutor,
- MetadataConsumerForMetrics.FilesMetricConsumer topLevelArtifactsMetric) {
+ MetadataConsumerForMetrics.FilesMetricConsumer topLevelArtifactsMetric,
+ BugReporter bugReporter) {
return new CompletionFunction<>(
pathResolverFactory,
new AspectCompletor(),
skyframeActionExecutor,
- topLevelArtifactsMetric);
+ topLevelArtifactsMetric,
+ bugReporter);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java
index 7da4e7f..9361a3c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java
@@ -35,7 +35,7 @@
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup;
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsToBuild;
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.SuccessfulArtifactFilter;
-import com.google.devtools.build.lib.bugreport.BugReport;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.causes.Cause;
import com.google.devtools.build.lib.causes.LabelCause;
import com.google.devtools.build.lib.cmdline.Label;
@@ -133,16 +133,19 @@
private final Completor<ValueT, ResultT, KeyT, FailureT> completor;
private final SkyframeActionExecutor skyframeActionExecutor;
private final FilesMetricConsumer topLevelArtifactsMetric;
+ private final BugReporter bugReporter;
CompletionFunction(
PathResolverFactory pathResolverFactory,
Completor<ValueT, ResultT, KeyT, FailureT> completor,
SkyframeActionExecutor skyframeActionExecutor,
- FilesMetricConsumer topLevelArtifactsMetric) {
+ FilesMetricConsumer topLevelArtifactsMetric,
+ BugReporter bugReporter) {
this.pathResolverFactory = pathResolverFactory;
this.completor = completor;
this.skyframeActionExecutor = skyframeActionExecutor;
this.topLevelArtifactsMetric = topLevelArtifactsMetric;
+ this.bugReporter = bugReporter;
}
@SuppressWarnings("unchecked") // Cast to KeyT
@@ -218,7 +221,7 @@
}
} catch (SourceArtifactException e) {
if (!input.isSourceArtifact()) {
- BugReport.sendBugReport(
+ bugReporter.sendBugReport(
new IllegalStateException(
"Non-source artifact had SourceArtifactException: " + input, e));
}
@@ -305,7 +308,7 @@
throws InterruptedException {
LabelCause cause =
ActionExecutionFunction.createLabelCause(
- input, detailedExitCode, key.actionLookupKey().getLabel());
+ input, detailedExitCode, key.actionLookupKey().getLabel(), bugReporter);
rootCausesBuilder.add(cause);
env.getListener().handle(completor.getRootCauseError(value, key, cause, env));
skyframeActionExecutor.recordExecutionError();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index 8d0e08b..8e29c08 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -38,6 +38,7 @@
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
import com.google.devtools.build.lib.cmdline.LabelConstants;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -173,7 +174,8 @@
ExternalPackageHelper externalPackageHelper,
ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile,
BuildOptions defaultBuildOptions,
- @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
+ @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ BugReporter bugReporter) {
super(
skyframeExecutorConsumerOnInit,
evaluatorSupplier,
@@ -195,7 +197,8 @@
new PackageProgressReceiver(),
new ConfiguredTargetProgressReceiver(),
/*nonexistentFileReceiver=*/ null,
- managedDirectoriesKnowledge);
+ managedDirectoriesKnowledge,
+ bugReporter);
this.diffAwarenessManager = new DiffAwarenessManager(diffAwarenessFactories);
this.customDirtinessCheckers = customDirtinessCheckers;
this.managedDirectoriesKnowledge = managedDirectoriesKnowledge;
@@ -1050,6 +1053,7 @@
private Iterable<SkyValueDirtinessChecker> customDirtinessCheckers = ImmutableList.of();
private Consumer<SkyframeExecutor> skyframeExecutorConsumerOnInit = skyframeExecutor -> {};
private SkyFunction ignoredPackagePrefixesFunction;
+ private BugReporter bugReporter = BugReporter.defaultInstance();
private Builder() {}
@@ -1084,7 +1088,8 @@
externalPackageHelper,
actionOnIOExceptionReadingBuildFile,
defaultBuildOptions,
- managedDirectoriesKnowledge);
+ managedDirectoriesKnowledge,
+ bugReporter);
skyframeExecutor.init();
return skyframeExecutor;
}
@@ -1119,6 +1124,11 @@
return this;
}
+ public Builder setBugReporter(BugReporter bugReporter) {
+ this.bugReporter = bugReporter;
+ return this;
+ }
+
public Builder setExtraSkyFunctions(
ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions) {
this.extraSkyFunctions = extraSkyFunctions;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
index ac31891..568583a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
@@ -18,6 +18,7 @@
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.skyframe.SkyFunction;
@@ -45,7 +46,8 @@
Iterable<? extends DiffAwareness.Factory> diffAwarenessFactories,
ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
- @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
+ @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ BugReporter bugReporter) {
return BazelSkyframeExecutorConstants.newBazelSkyframeExecutorBuilder()
.setPkgFactory(pkgFactory)
.setFileSystem(fileSystem)
@@ -57,6 +59,7 @@
.setExtraSkyFunctions(extraSkyFunctions)
.setCustomDirtinessCheckers(customDirtinessCheckers)
.setManagedDirectoriesKnowledge(managedDirectoriesKnowledge)
+ .setBugReporter(bugReporter)
.build();
}
}
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 73aa6c7..d6f8d29 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
@@ -100,6 +100,7 @@
import com.google.devtools.build.lib.analysis.configuredtargets.MergedConfiguredTarget;
import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition;
import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition.TransitionException;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -255,6 +256,8 @@
protected final BlazeDirectories directories;
protected final ExternalFilesHelper externalFilesHelper;
private final GraphInconsistencyReceiver graphInconsistencyReceiver;
+ private final BugReporter bugReporter;
+
/**
* Measures source artifacts read this build. Does not include cached artifacts, so is less useful
* on incremental builds.
@@ -422,7 +425,8 @@
@Nullable PackageProgressReceiver packageProgress,
@Nullable ConfiguredTargetProgressReceiver configuredTargetProgress,
@Nullable NonexistentFileReceiver nonexistentFileReceiver,
- @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
+ @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ BugReporter bugReporter) {
// Strictly speaking, these arguments are not required for initialization, but all current
// callsites have them at hand, so we might as well set them during construction.
this.skyframeExecutorConsumerOnInit = skyframeExecutorConsumerOnInit;
@@ -431,6 +435,7 @@
this.shouldUnblockCpuWorkWhenFetchingDeps = shouldUnblockCpuWorkWhenFetchingDeps;
this.graphInconsistencyReceiver = graphInconsistencyReceiver;
this.nonexistentFileReceiver = nonexistentFileReceiver;
+ this.bugReporter = bugReporter;
this.pkgFactory.setSyscalls(syscalls);
this.workspaceStatusActionFactory = workspaceStatusActionFactory;
this.packageManager =
@@ -601,11 +606,11 @@
map.put(
SkyFunctions.TARGET_COMPLETION,
TargetCompletor.targetCompletionFunction(
- pathResolverFactory, skyframeActionExecutor, topLevelArtifactsMetric));
+ pathResolverFactory, skyframeActionExecutor, topLevelArtifactsMetric, bugReporter));
map.put(
SkyFunctions.ASPECT_COMPLETION,
AspectCompletor.aspectCompletionFunction(
- pathResolverFactory, skyframeActionExecutor, topLevelArtifactsMetric));
+ pathResolverFactory, skyframeActionExecutor, topLevelArtifactsMetric, bugReporter));
map.put(SkyFunctions.TEST_COMPLETION, new TestCompletionFunction());
map.put(
Artifact.ARTIFACT,
@@ -618,7 +623,7 @@
map.put(SkyFunctions.BUILD_INFO, new WorkspaceStatusFunction(this::makeWorkspaceStatusAction));
map.put(SkyFunctions.COVERAGE_REPORT, new CoverageReportFunction(actionKeyContext));
ActionExecutionFunction actionExecutionFunction =
- new ActionExecutionFunction(skyframeActionExecutor, directories, tsgm);
+ new ActionExecutionFunction(skyframeActionExecutor, directories, tsgm, bugReporter);
map.put(SkyFunctions.ACTION_EXECUTION, actionExecutionFunction);
this.actionExecutionFunction = actionExecutionFunction;
map.put(SkyFunctions.ACTION_SKETCH, new ActionSketchFunction(actionKeyContext));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
index 18fc008..dbc0e33 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
@@ -17,6 +17,7 @@
import com.google.devtools.build.lib.actions.ActionKeyContext;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.util.AbruptExitException;
import com.google.devtools.build.lib.vfs.FileSystem;
@@ -35,6 +36,7 @@
* @param fileSystem the Blaze file system
* @param directories Blaze directories
* @param workspaceStatusActionFactory a factory for creating WorkspaceStatusAction objects
+ * @param bugReporter BugReporter: always BugReporter.defaultInstance() outside of Java tests
* @return an instance of the SkyframeExecutor
* @throws AbruptExitException if the executor cannot be created
*/
@@ -47,6 +49,7 @@
Iterable<? extends DiffAwareness.Factory> diffAwarenessFactories,
ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
- ManagedDirectoriesKnowledge managedDirectoriesKnowledge)
+ ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ BugReporter bugReporter)
throws AbruptExitException;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletor.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletor.java
index daf7e63..ca5132d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletor.java
@@ -21,6 +21,7 @@
import com.google.devtools.build.lib.analysis.TargetCompleteEvent;
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup;
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsToBuild;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.causes.Cause;
import com.google.devtools.build.lib.causes.LabelCause;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -46,12 +47,14 @@
static SkyFunction targetCompletionFunction(
PathResolverFactory pathResolverFactory,
SkyframeActionExecutor skyframeActionExecutor,
- MetadataConsumerForMetrics.FilesMetricConsumer topLevelArtifactsMetric) {
+ MetadataConsumerForMetrics.FilesMetricConsumer topLevelArtifactsMetric,
+ BugReporter bugReporter) {
return new CompletionFunction<>(
pathResolverFactory,
new TargetCompletor(skyframeActionExecutor),
skyframeActionExecutor,
- topLevelArtifactsMetric);
+ topLevelArtifactsMetric,
+ bugReporter);
}
private TargetCompletor(SkyframeActionExecutor announceTargetSummaries) {
diff --git a/src/test/java/com/google/devtools/build/lib/buildtool/BUILD b/src/test/java/com/google/devtools/build/lib/buildtool/BUILD
index 7e35691..7dd46cf 100644
--- a/src/test/java/com/google/devtools/build/lib/buildtool/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/buildtool/BUILD
@@ -201,6 +201,7 @@
deps = [
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/skyframe:detailed_exceptions",
+ "//src/main/java/com/google/devtools/build/lib/util/io",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/protobuf:failure_details_java_proto",
@@ -604,6 +605,7 @@
"//src/main/java/com/google/devtools/build/lib/skyframe:detailed_exceptions",
"//src/main/java/com/google/devtools/build/lib/unix",
"//src/main/java/com/google/devtools/build/lib/util:exit_code",
+ "//src/main/java/com/google/devtools/build/lib/util/io",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/protobuf:failure_details_java_proto",
diff --git a/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java
index 0f1ac98..84d31cb 100644
--- a/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java
@@ -31,6 +31,7 @@
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.unix.UnixFileSystem;
import com.google.devtools.build.lib.util.ExitCode;
+import com.google.devtools.build.lib.util.io.RecordingOutErr;
import com.google.devtools.build.lib.vfs.DigestHashFunction;
import com.google.devtools.build.lib.vfs.Dirent;
import com.google.devtools.build.lib.vfs.FileStatus;
@@ -150,6 +151,7 @@
public void incrementalNonMandatoryInputIOException(
@TestParameter boolean keepGoing, @TestParameter({"0", "1"}) int nestedSetOnSkyframe)
throws Exception {
+ RecordingBugReporter bugReporter = recordBugReportsAndReinitialize();
addOptions("--features=cc_include_scanning");
addOptions("--keep_going=" + keepGoing);
addOptions("--experimental_nested_set_as_skykey_threshold=" + nestedSetOnSkyframe);
@@ -157,18 +159,28 @@
write("foo/foo.cc", "#include \"foo/foo.h\"");
Path fooHFile = write("foo/foo.h", "//thisisacomment");
buildTarget("//foo");
+ bugReporter.assertNoExceptions();
+
write("foo/foo.cc", "//no include anymore");
customFileSystem.alwaysError(fooHFile);
if (keepGoing) {
buildTarget("//foo");
+ bugReporter.assertNoExceptions();
} else {
- // TODO(b/166268889): fix this: this really crashes, not just a bug report!
- assertThrows(RuntimeException.class, () -> buildTarget("//foo"));
+ RecordingOutErr outErr = new RecordingOutErr();
+ this.outErr = outErr;
+ BuildFailedException e = assertThrows(BuildFailedException.class, () -> buildTarget("//foo"));
+ assertDetailedExitCodeIsSourceIOFailure(e);
+ Throwable cause = bugReporter.getFirstCause();
+ assertThat(cause).hasMessageThat().isEqualTo("error reading file 'foo/foo.h': nope");
+ assertDetailedExitCodeIsSourceIOFailure(cause);
+ assertThat(outErr.errAsLatin1()).contains("error reading file 'foo/foo.h': nope");
}
}
@Test
public void unusedInputIOExceptionIncremental(@TestParameter boolean keepGoing) throws Exception {
+ RecordingBugReporter bugReporter = recordBugReportsAndReinitialize();
addOptions("--keep_going=" + keepGoing);
write(
"foo/pruning.bzl",
@@ -201,28 +213,39 @@
"build_rule(name = 'prune', inputs = ':unused.txt', executable = ':all_unused.sh')");
Path unusedPath = write("foo/unused.txt");
buildTarget("//foo:prune");
+ bugReporter.assertNoExceptions();
+
customFileSystem.alwaysError(unusedPath);
if (keepGoing) {
buildTarget("//foo:prune");
+ bugReporter.assertNoExceptions();
} else {
- // TODO(b/166268889): fix.
- RuntimeException e = assertThrows(RuntimeException.class, () -> buildTarget("//foo:prune"));
- assertThat(e).hasCauseThat().isInstanceOf(DetailedException.class);
- assertThat(e)
- .hasCauseThat()
- .hasMessageThat()
- .isEqualTo("error reading file '//foo:unused.txt': nope");
- assertThat(((DetailedException) e.getCause()).getDetailedExitCode().getFailureDetail())
- .comparingExpectedFieldsOnly()
- .isEqualTo(
- FailureDetails.FailureDetail.newBuilder()
- .setExecution(
- FailureDetails.Execution.newBuilder()
- .setCode(FailureDetails.Execution.Code.SOURCE_INPUT_IO_EXCEPTION))
- .build());
+ RecordingOutErr outErr = new RecordingOutErr();
+ this.outErr = outErr;
+ BuildFailedException e =
+ assertThrows(BuildFailedException.class, () -> buildTarget("//foo:prune"));
+ assertDetailedExitCodeIsSourceIOFailure(e);
+ Throwable cause = bugReporter.getFirstCause();
+ assertThat(cause).hasMessageThat().isEqualTo("error reading file '//foo:unused.txt': nope");
+ assertDetailedExitCodeIsSourceIOFailure(cause);
+ assertThat(outErr.errAsLatin1()).contains("error reading file '//foo:unused.txt': nope");
}
}
+ private static final FailureDetails.FailureDetail SOURCE_IO_FAILURE =
+ FailureDetails.FailureDetail.newBuilder()
+ .setExecution(
+ FailureDetails.Execution.newBuilder()
+ .setCode(FailureDetails.Execution.Code.SOURCE_INPUT_IO_EXCEPTION))
+ .build();
+
+ private static void assertDetailedExitCodeIsSourceIOFailure(Throwable exception) {
+ assertThat(exception).isInstanceOf(DetailedException.class);
+ assertThat(((DetailedException) exception).getDetailedExitCode().getFailureDetail())
+ .comparingExpectedFieldsOnly()
+ .isEqualTo(SOURCE_IO_FAILURE);
+ }
+
/** Tests that IOExceptions encountered when not all discovered deps are done are handled. */
@Test
public void testIOException_missingNonMandatoryInput() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/buildtool/UnusedInputsFailureIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/buildtool/UnusedInputsFailureIntegrationTest.java
index 3373cd4..9fb1c96 100644
--- a/src/test/java/com/google/devtools/build/lib/buildtool/UnusedInputsFailureIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/buildtool/UnusedInputsFailureIntegrationTest.java
@@ -21,6 +21,7 @@
import com.google.devtools.build.lib.buildtool.util.BuildIntegrationTestCase;
import com.google.devtools.build.lib.server.FailureDetails;
import com.google.devtools.build.lib.skyframe.DetailedException;
+import com.google.devtools.build.lib.util.io.RecordingOutErr;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.testing.junit.testparameterinjector.TestParameter;
@@ -45,6 +46,7 @@
@Test
public void incrementalFailureOnUnusedInput() throws Exception {
+ RecordingBugReporter bugReporter = recordBugReportsAndReinitialize();
write(
"foo/pruning.bzl",
"def _impl(ctx):",
@@ -80,24 +82,51 @@
"genrule(name = 'gen', outs = ['in'], tools = [':gen_run.sh'], cmd = '$(location"
+ " :gen_run.sh) && touch $@')");
buildTarget("//foo:foo");
+ bugReporter.assertNoExceptions();
+
write("foo/gen_run.sh", "false");
if (keepGoing) {
buildTarget("//foo:foo");
+ bugReporter.assertNoExceptions();
} else if (nestedSetOnSkyframe == 0) {
+ RecordingOutErr outErr = new RecordingOutErr();
+ this.outErr = outErr;
// Not great, but what to do.
- assertThrows(BuildFailedException.class, () -> buildTarget("//foo:foo"));
+ BuildFailedException e =
+ assertThrows(BuildFailedException.class, () -> buildTarget("//foo:foo"));
+ assertThat(e.getDetailedExitCode().getFailureDetail())
+ .comparingExpectedFieldsOnly()
+ .isEqualTo(
+ FailureDetails.FailureDetail.newBuilder()
+ .setSpawn(
+ FailureDetails.Spawn.newBuilder()
+ .setCode(FailureDetails.Spawn.Code.NON_ZERO_EXIT))
+ .build());
+ assertThat(outErr.errAsLatin1()).contains("Executing genrule //foo:gen failed");
+ bugReporter.assertNoExceptions();
} else {
- // TODO(b/159596514): fix.
- RuntimeException e = assertThrows(RuntimeException.class, () -> buildTarget("//foo:foo"));
- assertThat(e)
- .hasCauseThat()
- .hasMessageThat()
- .contains("Error evaluating artifact nested set");
+ RecordingOutErr outErr = new RecordingOutErr();
+ this.outErr = outErr;
+ BuildFailedException e = assertThrows(BuildFailedException.class, () -> buildTarget("//foo"));
+ assertThat(e.getDetailedExitCode().getFailureDetail())
+ .comparingExpectedFieldsOnly()
+ .isEqualTo(
+ FailureDetails.FailureDetail.newBuilder()
+ .setExecution(
+ FailureDetails.Execution.newBuilder()
+ .setCode(FailureDetails.Execution.Code.UNEXPECTED_EXCEPTION)
+ .build())
+ .build());
+ assertThat(outErr.errAsLatin1()).contains("Executing genrule //foo:gen failed");
+ Throwable cause = bugReporter.getFirstCause();
+ assertThat(cause).hasMessageThat().contains("Error evaluating artifact nested set");
+ assertThat(cause).hasMessageThat().contains("foo/gen_run.sh");
}
}
@Test
public void incrementalUnusedSymlinkCycle() throws Exception {
+ RecordingBugReporter bugReporter = recordBugReportsAndReinitialize();
write(
"foo/pruning.bzl",
"def _impl(ctx):",
@@ -132,25 +161,40 @@
"load('//foo:pruning.bzl', 'build_rule')",
"build_rule(name = 'prune', inputs = ':in', executable = ':all_unused.sh')");
buildTarget("//foo:prune");
+ bugReporter.assertNoExceptions();
+
inPath.delete();
inPath.createSymbolicLink(PathFragment.create("in"));
if (keepGoing) {
buildTarget("//foo:prune");
+ bugReporter.assertNoExceptions();
} else {
- // TODO(b/159596514): fix.
- RuntimeException e = assertThrows(RuntimeException.class, () -> buildTarget("//foo:prune"));
- assertThat(e).hasCauseThat().isInstanceOf(DetailedException.class);
- assertThat(((DetailedException) e.getCause()).getDetailedExitCode().getFailureDetail())
- .comparingExpectedFieldsOnly()
- .isEqualTo(
- FailureDetails.FailureDetail.newBuilder()
- .setExecution(
- FailureDetails.Execution.newBuilder()
- .setCode(FailureDetails.Execution.Code.SOURCE_INPUT_IO_EXCEPTION))
- .build());
+ RecordingOutErr outErr = new RecordingOutErr();
+ this.outErr = outErr;
+ BuildFailedException e =
+ assertThrows(BuildFailedException.class, () -> buildTarget("//foo:prune"));
+ assertDetailedExitCodeIsSourceIOFailure(e);
+ Throwable cause = bugReporter.getFirstCause();
+ assertDetailedExitCodeIsSourceIOFailure(cause);
+ assertThat(cause).hasMessageThat().isEqualTo("error reading file '//foo:in': Symlink cycle");
+ assertThat(outErr.errAsLatin1()).contains("error reading file '//foo:in': Symlink cycle");
}
}
+ private static final FailureDetails.FailureDetail SOURCE_IO_FAILURE =
+ FailureDetails.FailureDetail.newBuilder()
+ .setExecution(
+ FailureDetails.Execution.newBuilder()
+ .setCode(FailureDetails.Execution.Code.SOURCE_INPUT_IO_EXCEPTION))
+ .build();
+
+ private static void assertDetailedExitCodeIsSourceIOFailure(Throwable exception) {
+ assertThat(exception).isInstanceOf(DetailedException.class);
+ assertThat(((DetailedException) exception).getDetailedExitCode().getFailureDetail())
+ .comparingExpectedFieldsOnly()
+ .isEqualTo(SOURCE_IO_FAILURE);
+ }
+
@Test
public void incrementalUnusedDanglingSymlink() throws Exception {
write(
diff --git a/src/test/java/com/google/devtools/build/lib/buildtool/util/BuildIntegrationTestCase.java b/src/test/java/com/google/devtools/build/lib/buildtool/util/BuildIntegrationTestCase.java
index 65dfd1a..dea2b7e 100644
--- a/src/test/java/com/google/devtools/build/lib/buildtool/util/BuildIntegrationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/buildtool/util/BuildIntegrationTestCase.java
@@ -14,9 +14,11 @@
package com.google.devtools.build.lib.buildtool.util;
+import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Throwables.throwIfUnchecked;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assert.fail;
@@ -47,6 +49,10 @@
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.analysis.util.AnalysisTestUtil;
import com.google.devtools.build.lib.analysis.util.AnalysisTestUtil.DummyWorkspaceStatusActionContext;
+import com.google.devtools.build.lib.bugreport.BugReport;
+import com.google.devtools.build.lib.bugreport.BugReporter;
+import com.google.devtools.build.lib.bugreport.Crash;
+import com.google.devtools.build.lib.bugreport.CrashContext;
import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.buildtool.BuildResult;
import com.google.devtools.build.lib.buildtool.BuildTool;
@@ -107,11 +113,13 @@
import com.google.devtools.common.options.OptionsBase;
import com.google.devtools.common.options.OptionsParser;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import javax.annotation.concurrent.GuardedBy;
import org.junit.After;
import org.junit.Before;
@@ -151,6 +159,7 @@
protected BlazeDirectories directories;
protected MockToolsConfig mockToolsConfig;
protected BinTools binTools;
+ private BugReporter bugReporter = BugReporter.defaultInstance();
protected BlazeRuntimeWrapper runtimeWrapper;
protected Path outputBase;
@@ -217,6 +226,35 @@
setupOptions();
}
+ /**
+ * Configures the server to record bug reports using the returned {@link RecordingBugReporter}.
+ *
+ * <p>The server is reinitialized so that this change is picked up.
+ */
+ protected final RecordingBugReporter recordBugReportsAndReinitialize() throws Exception {
+ RecordingBugReporter recordingBugReporter = new RecordingBugReporter();
+ setCustomBugReporterAndReinitialize(recordingBugReporter);
+ return recordingBugReporter;
+ }
+
+ /**
+ * Configures the server to record bug reports using the given {@link BugReporter}.
+ *
+ * <p>The server is reinitialized so that this change is picked up.
+ */
+ protected final void setCustomBugReporterAndReinitialize(BugReporter bugReporter)
+ throws Exception {
+ this.bugReporter = checkNotNull(bugReporter);
+ reinitializeAndPreserveOptions();
+ }
+
+ protected final void reinitializeAndPreserveOptions() throws Exception {
+ List<String> options = runtimeWrapper.getOptions();
+ createFilesAndMocks();
+ runtimeWrapper.resetOptions();
+ runtimeWrapper.addOptions(options);
+ }
+
protected void runPriorToBeforeMethods() throws Exception {
// Allows tests such as SkyframeIntegrationInvalidationTest to execute code before all @Before
// methods are being run.
@@ -370,6 +408,7 @@
return new BlazeRuntime.Builder()
.setFileSystem(fileSystem)
.setProductName(TestConstants.PRODUCT_NAME)
+ .setBugReporter(bugReporter)
.setStartupOptionsProvider(startupOptionsParser)
.addBlazeModule(connectivityModule)
.addBlazeModule(getNoResolvedFileModule())
@@ -818,4 +857,41 @@
}
fail("didn't find expected error: \"" + expectedError + "\"");
}
+
+ /** {@link BugReporter} that stores bug reports for later inspection. */
+ protected static final class RecordingBugReporter implements BugReporter {
+ @GuardedBy("this")
+ private final List<Throwable> exceptions = new ArrayList<>();
+
+ @Override
+ public synchronized void sendBugReport(
+ Throwable exception, List<String> args, String... values) {
+ exceptions.add(exception);
+ }
+
+ @Override
+ public void handleCrash(Crash crash, CrashContext ctx) {
+ // Unexpected: try to crash JVM.
+ BugReport.handleCrash(crash, ctx);
+ }
+
+ public synchronized ImmutableList<Throwable> getExceptions() {
+ return ImmutableList.copyOf(exceptions);
+ }
+
+ public synchronized Throwable getFirstCause() {
+ assertThat(exceptions).isNotEmpty();
+ Throwable first = exceptions.get(0);
+ assertThat(first).hasCauseThat().isNotNull();
+ return first.getCause();
+ }
+
+ public synchronized void assertNoExceptions() {
+ assertThat(exceptions).isEmpty();
+ }
+
+ public synchronized void clear() {
+ exceptions.clear();
+ }
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java
index 11d5aaa..d388908 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ServerDirectories;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.clock.BlazeClock;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.events.EventCollector;
@@ -293,7 +294,8 @@
/*diffAwarenessFactories=*/ ImmutableList.of(),
getExtraSkyFunctions(),
/*customDirtinessCheckers=*/ ImmutableList.of(),
- /*managedDirectoriesKnowledge=*/ null);
+ /*managedDirectoriesKnowledge=*/ null,
+ BugReporter.defaultInstance());
skyframeExecutor.injectExtraPrecomputedValues(
ImmutableList.of(
PrecomputedValue.injected(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index ce3e83c..b0b3396 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -148,6 +148,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
"//src/main/java/com/google/devtools/build/lib/bazel:main",
"//src/main/java/com/google/devtools/build/lib/bazel/rules",
+ "//src/main/java/com/google/devtools/build/lib/bugreport",
"//src/main/java/com/google/devtools/build/lib/causes",
"//src/main/java/com/google/devtools/build/lib/clock",
"//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index 6b07373..0ad0a5e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -79,6 +79,7 @@
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.config.CoreOptions;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
import com.google.devtools.build.lib.buildtool.SkyframeBuilder;
import com.google.devtools.build.lib.clock.BlazeClock;
@@ -1590,7 +1591,8 @@
null,
ModifiedFileSet.EVERYTHING_MODIFIED,
/* fileCache= */ null,
- ActionInputPrefetcher.NONE);
+ ActionInputPrefetcher.NONE,
+ BugReporter.defaultInstance());
Set<ConfiguredTargetKey> builtTargets = new HashSet<>();
Set<AspectKey> builtAspects = new HashSet<>();
// Note that since ImmutableSet iterates through its elements in the order they are passed in
@@ -1727,7 +1729,8 @@
null,
ModifiedFileSet.EVERYTHING_MODIFIED,
/*fileCache=*/ null,
- ActionInputPrefetcher.NONE);
+ ActionInputPrefetcher.NONE,
+ BugReporter.defaultInstance());
Set<ConfiguredTargetKey> builtTargets = new HashSet<>();
Set<AspectKey> builtAspects = new HashSet<>();
Set<Artifact> normalArtifacts = ImmutableSet.of(topArtifact);
@@ -1853,7 +1856,8 @@
null,
ModifiedFileSet.EVERYTHING_MODIFIED,
/*fileCache=*/ null,
- ActionInputPrefetcher.NONE);
+ ActionInputPrefetcher.NONE,
+ BugReporter.defaultInstance());
Set<ConfiguredTargetKey> builtTargets = new HashSet<>();
Set<AspectKey> builtAspects = new HashSet<>();
BuildFailedException e =
@@ -1968,7 +1972,8 @@
null,
ModifiedFileSet.EVERYTHING_MODIFIED,
/* fileCache= */ null,
- ActionInputPrefetcher.NONE);
+ ActionInputPrefetcher.NONE,
+ BugReporter.defaultInstance());
Set<ConfiguredTargetKey> builtTargets = new HashSet<>();
Set<AspectKey> builtAspects = new HashSet<>();
// Note that since ImmutableSet iterates through its elements in the order they are passed in
@@ -2076,7 +2081,8 @@
null,
ModifiedFileSet.EVERYTHING_MODIFIED,
/* fileCache= */ null,
- ActionInputPrefetcher.NONE);
+ ActionInputPrefetcher.NONE,
+ BugReporter.defaultInstance());
Set<ConfiguredTargetKey> builtTargets = new HashSet<>();
Set<AspectKey> builtAspects = new HashSet<>();
Set<Artifact> normalArtifacts = ImmutableSet.of(succeededOutput, failedOutput);
@@ -2174,7 +2180,8 @@
null,
ModifiedFileSet.EVERYTHING_MODIFIED,
/* fileCache= */ null,
- ActionInputPrefetcher.NONE);
+ ActionInputPrefetcher.NONE,
+ BugReporter.defaultInstance());
Set<ConfiguredTargetKey> builtTargets = new HashSet<>();
Set<AspectKey> builtAspects = new HashSet<>();
Set<Artifact> normalArtifacts = ImmutableSet.of(failedOutput1, failedOutput2);
@@ -2257,7 +2264,8 @@
null,
ModifiedFileSet.EVERYTHING_MODIFIED,
/*fileCache=*/ null,
- ActionInputPrefetcher.NONE);
+ ActionInputPrefetcher.NONE,
+ BugReporter.defaultInstance());
builder.buildArtifacts(
reporter,
ImmutableSet.of(topOutput),
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 9898eda..71e5434 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -60,6 +60,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.ServerDirectories;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
+import com.google.devtools.build.lib.bugreport.BugReporter;
import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
import com.google.devtools.build.lib.buildtool.SkyframeBuilder;
import com.google.devtools.build.lib.clock.BlazeClock;
@@ -270,7 +271,11 @@
new ArtifactFunction(() -> true, MetadataConsumerForMetrics.NO_OP))
.put(
SkyFunctions.ACTION_EXECUTION,
- new ActionExecutionFunction(skyframeActionExecutor, directories, tsgmRef))
+ new ActionExecutionFunction(
+ skyframeActionExecutor,
+ directories,
+ tsgmRef,
+ BugReporter.defaultInstance()))
.put(
SkyFunctions.PACKAGE,
new PackageFunction(null, null, null, null, null, null, null))
@@ -395,7 +400,9 @@
throw new BuildFailedException(
null, createDetailedExitCode(Code.NON_ACTION_EXECUTION_FAILURE));
} else {
- SkyframeBuilder.rethrow(Preconditions.checkNotNull(result.getError().getException()));
+ SkyframeBuilder.rethrow(
+ Preconditions.checkNotNull(result.getError().getException()),
+ BugReporter.defaultInstance());
}
}
}