Add a flag, --experimental_verbose_failures_filter, that gives finer control over failure reporting: rather than dump command lines for all failed actions, dump only for actions whose labels match a regular expression filter. The existing --verbose_failures flag is still available as an equivalent for --experimental_verbose_failures_filter=.* PiperOrigin-RevId: 312352624
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java index cc31b9e..d98bb54 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java
@@ -239,11 +239,9 @@ return pathResolver; } - /** - * Returns whether failures should have verbose error messages. - */ - public boolean getVerboseFailures() { - return executor.getVerboseFailures(); + /** Returns whether failures for {@code failedLabel} should have verbose error messages. */ + public boolean showVerboseFailures(Label failedLabel) { + return executor.getVerboseFailuresPredicate().test(failedLabel); } /**
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ExecException.java b/src/main/java/com/google/devtools/build/lib/actions/ExecException.java index a44e925..053ffe7 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ExecException.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ExecException.java
@@ -94,7 +94,8 @@ * incorporating just the termination status if available. * * @param messagePrefix describes the action type as noun - * @param verboseFailures true if user requested verbose output with flag --verbose_failures + * @param verboseFailures true if user requested verbose output with flag --verbose_failures or + * --experimental_verbose_failures_filter * @param action failed action * @return ActionExecutionException object describing the action failure */
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Executor.java b/src/main/java/com/google/devtools/build/lib/actions/Executor.java index 269e26a..d72c4a4 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Executor.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Executor.java
@@ -15,9 +15,11 @@ import com.google.devtools.build.lib.actions.ActionExecutionContext.ShowSubcommands; import com.google.devtools.build.lib.clock.Clock; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.common.options.OptionsProvider; +import java.util.function.Predicate; /** * The Executor provides the context for the execution of actions. It is only valid during the @@ -53,10 +55,8 @@ */ Clock getClock(); - /** - * Returns whether failures should have verbose error messages. - */ - boolean getVerboseFailures(); + /** Predicate for whether an action's failures should have verbose error messages. */ + Predicate<Label> getVerboseFailuresPredicate(); /** * Returns the command line options of the Blaze command being executed.
diff --git a/src/main/java/com/google/devtools/build/lib/actions/SpawnResult.java b/src/main/java/com/google/devtools/build/lib/actions/SpawnResult.java index 9ddb878..f345f71 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/SpawnResult.java +++ b/src/main/java/com/google/devtools/build/lib/actions/SpawnResult.java
@@ -374,7 +374,7 @@ TerminationStatus status = new TerminationStatus( exitCode(), status() == Status.TIMEOUT); String reason = " (" + status.toShortString() + ")"; // e.g " (Exit 1)" - // Include the command line as error message if --verbose_failures is enabled or + // Include the command line as error message if verbose_failures are enabled for this spawn or // the command line didn't exit normally. String explanation = verboseFailures || !status.exited() ? ": " + message : "";
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java index b2f14b9..a16b2bc 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java
@@ -100,9 +100,10 @@ return this; } } catch (ExecException e) { + Label label = getOwner().getLabel(); throw e.toActionExecutionException( - "Writing file for rule '" + Label.print(getOwner().getLabel()) + "'", - actionExecutionContext.getVerboseFailures(), + "Writing file for rule '" + Label.print(label) + "'", + actionExecutionContext.showVerboseFailures(label), AbstractFileWriteAction.this); } afterWrite(actionExecutionContext); @@ -110,9 +111,10 @@ } }; } catch (ExecException e) { + Label label = getOwner().getLabel(); throw e.toActionExecutionException( - "Writing file for rule '" + Label.print(getOwner().getLabel()) + "'", - actionExecutionContext.getVerboseFailures(), + "Writing file for rule '" + Label.print(label) + "'", + actionExecutionContext.showVerboseFailures(label), this); } }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java index da11379..be48eb2 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -65,6 +65,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.skylark.Args; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.exec.SpawnStrategyResolver; @@ -313,13 +314,14 @@ public final ActionContinuationOrResult beginExecution( ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { + Label label = getOwner().getLabel(); Spawn spawn; try { beforeExecute(actionExecutionContext); spawn = getSpawn(actionExecutionContext); } catch (IOException e) { throw toActionExecutionException( - new EnvironmentalExecException(e), actionExecutionContext.getVerboseFailures()); + new EnvironmentalExecException(e), actionExecutionContext.showVerboseFailures(label)); } catch (CommandLineExpansionException e) { throw new ActionExecutionException(e, this, /*catastrophe=*/ false); } @@ -327,7 +329,7 @@ actionExecutionContext .getContext(SpawnStrategyResolver.class) .beginExecution(spawn, actionExecutionContext); - return new SpawnActionContinuation(actionExecutionContext, spawnContinuation); + return new SpawnActionContinuation(actionExecutionContext, spawnContinuation, label); } private ActionExecutionException toActionExecutionException( @@ -1357,11 +1359,15 @@ private final class SpawnActionContinuation extends ActionContinuationOrResult { private final ActionExecutionContext actionExecutionContext; private final SpawnContinuation spawnContinuation; + private final Label label; - public SpawnActionContinuation( - ActionExecutionContext actionExecutionContext, SpawnContinuation spawnContinuation) { + SpawnActionContinuation( + ActionExecutionContext actionExecutionContext, + SpawnContinuation spawnContinuation, + Label label) { this.actionExecutionContext = actionExecutionContext; this.spawnContinuation = spawnContinuation; + this.label = label; } @Override @@ -1382,12 +1388,12 @@ afterExecute(actionExecutionContext, spawnResults); return ActionContinuationOrResult.of(ActionResult.create(nextContinuation.get())); } - return new SpawnActionContinuation(actionExecutionContext, nextContinuation); + return new SpawnActionContinuation(actionExecutionContext, nextContinuation, label); } catch (IOException e) { throw toActionExecutionException( - new EnvironmentalExecException(e), actionExecutionContext.getVerboseFailures()); + new EnvironmentalExecException(e), actionExecutionContext.showVerboseFailures(label)); } catch (ExecException e) { - throw toActionExecutionException(e, actionExecutionContext.getVerboseFailures()); + throw toActionExecutionException(e, actionExecutionContext.showVerboseFailures(label)); } } }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java index 3744a60..9b75cf5 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java
@@ -169,9 +169,10 @@ return this; } } catch (ExecException e) { + Label label = getOwner().getLabel(); throw e.toActionExecutionException( - "Error expanding template '" + Label.print(getOwner().getLabel()) + "'", - actionExecutionContext.getVerboseFailures(), + "Error expanding template '" + Label.print(label) + "'", + actionExecutionContext.showVerboseFailures(label), TemplateExpansionAction.this); } return ActionContinuationOrResult.of(ActionResult.create(nextContinuation.get()));
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/coverage/CoverageReportActionBuilder.java b/src/main/java/com/google/devtools/build/lib/bazel/coverage/CoverageReportActionBuilder.java index c154105..cb6c676 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/coverage/CoverageReportActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/coverage/CoverageReportActionBuilder.java
@@ -148,7 +148,7 @@ } catch (ExecException e) { throw e.toActionExecutionException( "Coverage report generation failed: ", - actionExecutionContext.getVerboseFailures(), + actionExecutionContext.showVerboseFailures(getOwner().getLabel()), this); } }
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java index d4a0e89..715f1bd 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java
@@ -177,7 +177,8 @@ } success = failed.isEmpty(); } - if (!success && !request.getOptions(ExecutionOptions.class).verboseFailures) { + if (!success && !request.getOptions(ExecutionOptions.class).hasSomeVerboseFailures()) { + // TODO(janakr): Show better message if --experimental_verbose_failures_filter is on. outErr.printErr("Use --verbose_failures to see the command lines of failed build steps.\n"); } }
diff --git a/src/main/java/com/google/devtools/build/lib/exec/AbstractSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/AbstractSpawnStrategy.java index c8c7a7c..9656851 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/AbstractSpawnStrategy.java +++ b/src/main/java/com/google/devtools/build/lib/exec/AbstractSpawnStrategy.java
@@ -168,7 +168,8 @@ !Strings.isNullOrEmpty(resultMessage) ? resultMessage : CommandFailureUtils.describeCommandFailure( - actionExecutionContext.getVerboseFailures(), + actionExecutionContext.showVerboseFailures( + spawn.getResourceOwner().getOwner().getLabel()), spawn.getArguments(), spawn.getEnvironment(), cwd,
diff --git a/src/main/java/com/google/devtools/build/lib/exec/BUILD b/src/main/java/com/google/devtools/build/lib/exec/BUILD index b9df475..e25903d 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/BUILD +++ b/src/main/java/com/google/devtools/build/lib/exec/BUILD
@@ -59,6 +59,7 @@ ":spawn_strategy_registry", "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/clock", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/vfs", @@ -87,6 +88,7 @@ "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity", "//src/main/java/com/google/devtools/build/lib/analysis:config/per_label_options", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/util", "//src/main/java/com/google/devtools/build/lib/util:resource_converter", "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
diff --git a/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java b/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java index 96bba6f..584cd77 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java
@@ -17,11 +17,13 @@ import com.google.devtools.build.lib.actions.ActionExecutionContext.ShowSubcommands; import com.google.devtools.build.lib.actions.Executor; import com.google.devtools.build.lib.clock.Clock; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.common.options.OptionsProvider; +import java.util.function.Predicate; import javax.annotation.Nullable; /** @@ -34,8 +36,7 @@ */ @ThreadSafe public final class BlazeExecutor implements Executor { - - private final boolean verboseFailures; + private final Predicate<Label> verboseFailures; private final ShowSubcommands showSubcommands; private final FileSystem fileSystem; private final Path execRoot; @@ -63,7 +64,7 @@ ModuleActionContextRegistry actionContextRegistry, SpawnStrategyRegistry spawnStrategyRegistry) { ExecutionOptions executionOptions = options.getOptions(ExecutionOptions.class); - this.verboseFailures = executionOptions.verboseFailures; + this.verboseFailures = executionOptions.getVerboseFailuresPredicate(); this.showSubcommands = executionOptions.showSubcommands; this.fileSystem = fileSystem; this.execRoot = execRoot; @@ -106,9 +107,8 @@ return actionContextRegistry.getContext(type); } - /** Returns true iff the --verbose_failures option was enabled. */ @Override - public boolean getVerboseFailures() { + public Predicate<Label> getVerboseFailuresPredicate() { return verboseFailures; }
diff --git a/src/main/java/com/google/devtools/build/lib/exec/ExecutionOptions.java b/src/main/java/com/google/devtools/build/lib/exec/ExecutionOptions.java index 8b589bf..28464e8 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/ExecutionOptions.java +++ b/src/main/java/com/google/devtools/build/lib/exec/ExecutionOptions.java
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.actions.LocalHostCapacity; import com.google.devtools.build.lib.actions.ResourceSet; import com.google.devtools.build.lib.analysis.config.PerLabelOptions; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.util.OptionsUtils; import com.google.devtools.build.lib.util.RegexFilter; import com.google.devtools.build.lib.util.ResourceConverter; @@ -38,6 +39,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.function.Predicate; /** * Options affecting the execution phase of a build. @@ -126,9 +128,9 @@ documentationCategory = OptionDocumentationCategory.LOGGING, effectTags = {OptionEffectTag.EXECUTION}, help = - "Writes intermediate parameter files to output tree even when using " - + "remote action execution. Useful when debugging actions. " - + "This is implied by --subcommands and --verbose_failures.") + "Writes intermediate parameter files to output tree even when using remote action" + + " execution. Useful when debugging actions. This is implied by --subcommands," + + " --verbose_failures, and --experimental_verbose_failures_filter.") public boolean materializeParamFiles; @Option( @@ -140,10 +142,13 @@ public boolean materializeParamFilesDirectly; public boolean shouldMaterializeParamFiles() { - // Implied by --subcommands and --verbose_failures + // Implied by --subcommands and verbose_failures return materializeParamFiles || showSubcommands != ActionExecutionContext.ShowSubcommands.FALSE - || verboseFailures; + // Conservatively materialize params files if any failures may be verbose. + // TODO(janakr): Could try to thread action label through to here and only materialize for + // those actions, but seems pretty gnarly. + || hasSomeVerboseFailures(); } @Option( @@ -151,10 +156,33 @@ defaultValue = "false", documentationCategory = OptionDocumentationCategory.LOGGING, effectTags = {OptionEffectTag.TERMINAL_OUTPUT}, - help = "If a command fails, print out the full command line.") + help = "If any command fails, print out the full command line.") public boolean verboseFailures; @Option( + name = "experimental_verbose_failures_filter", + defaultValue = "null", + converter = RegexFilter.RegexFilterConverter.class, + documentationCategory = OptionDocumentationCategory.LOGGING, + effectTags = {OptionEffectTag.TERMINAL_OUTPUT}, + help = + "If a command fails, print out the full command line if its label matches the given" + + " regex filter.") + public RegexFilter verboseFailuresFilter; + + public boolean hasSomeVerboseFailures() { + return verboseFailures || verboseFailuresFilter != null; + } + + public Predicate<Label> getVerboseFailuresPredicate() { + return verboseFailures + ? l -> true + : verboseFailuresFilter == null + ? l -> false + : l -> l == null || verboseFailuresFilter.isIncluded(l.getCanonicalForm()); + } + + @Option( name = "subcommands", abbrev = 's', defaultValue = "false",
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeStrategy.java index e9c3cd7..63ffb8d 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeStrategy.java +++ b/src/main/java/com/google/devtools/build/lib/exec/SymlinkTreeStrategy.java
@@ -125,7 +125,9 @@ } } catch (ExecException e) { throw e.toActionExecutionException( - action.getProgressMessage(), actionExecutionContext.getVerboseFailures(), action); + action.getProgressMessage(), + actionExecutionContext.showVerboseFailures(action.getOwner().getLabel()), + action); } } }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/BUILD b/src/main/java/com/google/devtools/build/lib/remote/BUILD index 6bf532e..87c4505 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/BUILD +++ b/src/main/java/com/google/devtools/build/lib/remote/BUILD
@@ -51,6 +51,7 @@ "//src/main/java/com/google/devtools/build/lib/authandtls", "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader", "//src/main/java/com/google/devtools/build/lib/buildeventstream", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/collect", "//src/main/java/com/google/devtools/build/lib/collect/nestedset", "//src/main/java/com/google/devtools/build/lib/concurrent",
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java index 53aa101..8b0f2e3 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
@@ -96,7 +96,8 @@ env.getExecRoot(), checkNotNull(env.getOptions().getOptions(RemoteOptions.class)), env.getOptions().getOptions(ExecutionOptions.class), - checkNotNull(env.getOptions().getOptions(ExecutionOptions.class)).verboseFailures, + checkNotNull(env.getOptions().getOptions(ExecutionOptions.class)) + .getVerboseFailuresPredicate(), env.getReporter(), env.getBuildRequestId(), env.getCommandId().toString(),
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java index bd0e378..124ed94 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java
@@ -54,6 +54,7 @@ import com.google.devtools.build.lib.actions.Spawns; import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.analysis.platform.PlatformUtils; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.Reporter; @@ -100,6 +101,7 @@ import java.util.SortedMap; import java.util.TreeSet; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Predicate; import java.util.function.Supplier; import javax.annotation.Nullable; @@ -143,7 +145,7 @@ private final Path execRoot; private final RemoteOptions remoteOptions; private final ExecutionOptions executionOptions; - private final boolean verboseFailures; + private final Predicate<Label> verboseFailures; @Nullable private final Reporter cmdlineReporter; private final RemoteExecutionCache remoteCache; @@ -167,7 +169,7 @@ Path execRoot, RemoteOptions remoteOptions, ExecutionOptions executionOptions, - boolean verboseFailures, + Predicate<Label> verboseFailures, @Nullable Reporter cmdlineReporter, String buildRequestId, String commandId, @@ -337,7 +339,8 @@ spawnMetricsAccounting(spawnMetrics, actionResult.getExecutionMetadata()); try (SilentCloseable c = prof.profile(REMOTE_DOWNLOAD, "download server logs")) { - maybeDownloadServerLogs(reply, actionKey); + maybeDownloadServerLogs( + reply, actionKey, spawn.getResourceOwner().getOwner().getLabel()); } try { @@ -500,7 +503,7 @@ } } - private void maybeDownloadServerLogs(ExecuteResponse resp, ActionKey actionKey) + private void maybeDownloadServerLogs(ExecuteResponse resp, ActionKey actionKey, Label label) throws InterruptedException { ActionResult result = resp.getResult(); if (resp.getServerLogsCount() > 0 @@ -515,11 +518,13 @@ try { getFromFuture(remoteCache.downloadFile(logPath, e.getValue().getDigest())); } catch (IOException ex) { - reportOnce(Event.warn("Failed downloading server logs from the remote cache.")); + reportOnce( + Event.warn( + "Failed downloading server logs for " + label + " from the remote cache.")); } } } - if (logCount > 0 && verboseFailures) { + if (logCount > 0 && verboseFailures.test(label)) { report( Event.info("Server logs of failing action:\n " + (logCount > 1 ? parent : logPath))); } @@ -558,11 +563,20 @@ return execLocallyAndUpload( spawn, context, inputMap, actionKey, action, command, uploadLocalResults); } - return handleError(cause, context.getFileOutErr(), actionKey, context); + return handleError( + cause, + context.getFileOutErr(), + actionKey, + context, + spawn.getResourceOwner().getOwner().getLabel()); } private SpawnResult handleError( - IOException exception, FileOutErr outErr, ActionKey actionKey, SpawnExecutionContext context) + IOException exception, + FileOutErr outErr, + ActionKey actionKey, + SpawnExecutionContext context, + Label label) throws ExecException, InterruptedException, IOException { boolean remoteCacheFailed = false; if (exception instanceof BulkTransferException) { @@ -573,7 +587,7 @@ ExecutionStatusException e = (ExecutionStatusException) exception.getCause(); if (e.getResponse() != null) { ExecuteResponse resp = e.getResponse(); - maybeDownloadServerLogs(resp, actionKey); + maybeDownloadServerLogs(resp, actionKey, label); if (resp.hasResult()) { try { // We try to download all (partial) results even on server error, for debuggability. @@ -601,10 +615,10 @@ } final String errorMessage; - if (!verboseFailures) { + if (!verboseFailures.test(label)) { errorMessage = Utils.grpcAwareErrorMessage(exception); } else { - // On --verbose_failures print the whole stack trace + // With verbose_failures print the whole stack trace errorMessage = Throwables.getStackTraceAsString(exception); } @@ -720,7 +734,7 @@ remoteCache.upload( actionKey, action, command, execRoot, outputFiles, context.getFileOutErr()); } catch (IOException e) { - if (verboseFailures) { + if (verboseFailures.test(spawn.getResourceOwner().getOwner().getLabel())) { report(Event.debug("Upload to remote cache failed: " + e.getMessage())); } else { reportOnce(Event.warn("Some artifacts failed be uploaded to the remote cache."));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index 08e93a9..b55046d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
@@ -57,6 +57,7 @@ import com.google.devtools.build.lib.actions.extra.ExtraActionInfo; import com.google.devtools.build.lib.analysis.skylark.Args; import com.google.devtools.build.lib.bugreport.BugReport; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.collect.CollectionUtils; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -434,9 +435,10 @@ throw new IllegalStateException(e.getCause()); } } catch (ExecException e) { + Label label = getOwner().getLabel(); throw e.toActionExecutionException( - "Include scanning of rule '" + getOwner().getLabel() + "'", - actionExecutionContext.getVerboseFailures(), + "Include scanning of rule '" + label + "'", + actionExecutionContext.showVerboseFailures(label), this); } } @@ -1811,9 +1813,10 @@ dotDContents = getDotDContents(spawnResults.get(0)); } catch (ExecException e) { copyTempOutErrToActionOutErr(); + Label label = getOwner().getLabel(); throw e.toActionExecutionException( - "C++ compilation of rule '" + getOwner().getLabel() + "'", - actionExecutionContext.getVerboseFailures(), + "C++ compilation of rule '" + label + "'", + actionExecutionContext.showVerboseFailures(label), CppCompileAction.this); } catch (InterruptedException e) { copyTempOutErrToActionOutErr(); @@ -1904,7 +1907,7 @@ throw new EnvironmentalExecException(e) .toActionExecutionException( getRawProgressMessage(), - actionExecutionContext.getVerboseFailures(), + actionExecutionContext.showVerboseFailures(getOwner().getLabel()), CppCompileAction.this); } }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java index 3ae5e3d..47918a8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
@@ -48,6 +48,7 @@ import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.skylark.Args; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.collect.CollectionUtils; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -567,9 +568,10 @@ } return ActionContinuationOrResult.of(ActionResult.create(nextContinuation.get())); } catch (ExecException e) { + Label label = getOwner().getLabel(); throw e.toActionExecutionException( - "Linking of rule '" + getOwner().getLabel() + "'", - actionExecutionContext.getVerboseFailures(), + "Linking of rule '" + label + "'", + actionExecutionContext.showVerboseFailures(label), CppLinkAction.this); } }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java index cd236be..88ba5a1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java
@@ -33,6 +33,7 @@ import com.google.devtools.build.lib.actions.ResourceSet; import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnResult; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; @@ -143,9 +144,10 @@ // The SpawnActionContext guarantees that the first list entry is the successful one. dotDContents = getDotDContents(spawnResults.get(0)); } catch (ExecException e) { + Label label = getOwner().getLabel(); throw e.toActionExecutionException( - "C++ compilation of rule '" + getOwner().getLabel() + "'", - actionExecutionContext.getVerboseFailures(), + "C++ compilation of rule '" + label + "'", + actionExecutionContext.showVerboseFailures(label), this); } finally { clearAdditionalInputs();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java index eb88793..4aaa692 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -544,7 +544,8 @@ return Deps.Dependencies.parseFrom(input); } catch (IOException e) { throw toActionExecutionException( - new EnvironmentalExecException(e), actionExecutionContext.getVerboseFailures()); + new EnvironmentalExecException(e), + actionExecutionContext.showVerboseFailures(getOwner().getLabel())); } } @@ -610,9 +611,11 @@ actionExecutionContext, results, fallbackContinuation); } catch (IOException e) { throw toActionExecutionException( - new EnvironmentalExecException(e), actionExecutionContext.getVerboseFailures()); + new EnvironmentalExecException(e), + actionExecutionContext.showVerboseFailures(getOwner().getLabel())); } catch (ExecException e) { - throw toActionExecutionException(e, actionExecutionContext.getVerboseFailures()); + throw toActionExecutionException( + e, actionExecutionContext.showVerboseFailures(getOwner().getLabel())); } } } @@ -656,7 +659,8 @@ ActionResult.create( ImmutableList.copyOf(Iterables.concat(primaryResults, fallbackResults)))); } catch (ExecException e) { - throw toActionExecutionException(e, actionExecutionContext.getVerboseFailures()); + throw toActionExecutionException( + e, actionExecutionContext.showVerboseFailures(getOwner().getLabel())); } } }
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java index 8a23059..4a667a4 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.actions.SpawnResult.Status; import com.google.devtools.build.lib.actions.Spawns; import com.google.devtools.build.lib.actions.UserExecException; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.exec.BinTools; import com.google.devtools.build.lib.exec.ExecutionOptions; import com.google.devtools.build.lib.exec.SpawnRunner; @@ -47,6 +48,7 @@ import java.io.IOException; import java.time.Duration; import java.util.Map; +import java.util.function.Predicate; /** Abstract common ancestor for sandbox spawn runners implementing the common parts. */ abstract class AbstractSandboxSpawnRunner implements SpawnRunner { @@ -56,7 +58,7 @@ "\n\nUse --sandbox_debug to see verbose messages from the sandbox"; private final SandboxOptions sandboxOptions; - private final boolean verboseFailures; + private final Predicate<Label> verboseFailures; private final ImmutableSet<Path> inaccessiblePaths; protected final BinTools binTools; private final Path execRoot; @@ -64,7 +66,8 @@ public AbstractSandboxSpawnRunner(CommandEnvironment cmdEnv) { this.sandboxOptions = cmdEnv.getOptions().getOptions(SandboxOptions.class); - this.verboseFailures = cmdEnv.getOptions().getOptions(ExecutionOptions.class).verboseFailures; + this.verboseFailures = + cmdEnv.getOptions().getOptions(ExecutionOptions.class).getVerboseFailuresPredicate(); this.inaccessiblePaths = sandboxOptions.getInaccessiblePaths(cmdEnv.getRuntime().getFileSystem()); this.binTools = cmdEnv.getBlazeWorkspace().getBinTools(); @@ -144,7 +147,7 @@ null); } else { return CommandFailureUtils.describeCommandFailure( - verboseFailures, + verboseFailures.test(originalSpawn.getResourceOwner().getOwner().getLabel()), originalSpawn.getArguments(), originalSpawn.getEnvironment(), sandbox.getSandboxExecRoot().getPathString(),
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/BUILD b/src/main/java/com/google/devtools/build/lib/sandbox/BUILD index fd70d08..6745eac 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/BUILD +++ b/src/main/java/com/google/devtools/build/lib/sandbox/BUILD
@@ -21,6 +21,7 @@ "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories", "//src/main/java/com/google/devtools/build/lib/analysis:test/test_configuration", "//src/main/java/com/google/devtools/build/lib/analysis/platform:platform_utils", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/exec:abstract_spawn_strategy", "//src/main/java/com/google/devtools/build/lib/exec:bin_tools",