RELNOTES: Add ExecutionInfo to aquery output for ExecutionInfoSpecifier actions.
ExecutionInfo is a significant, although typically empty, part of the cache key for ExecutionInfoSpecifier actions.
This CL will support integration tests for flags which modify execution info.
PiperOrigin-RevId: 210394235
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
index 23be8bd..2f8772d 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
@@ -22,6 +22,7 @@
import com.google.devtools.build.lib.actions.ActionKeyContext;
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.CommandLineExpansionException;
+import com.google.devtools.build.lib.actions.ExecutionInfoSpecifier;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.buildeventstream.BuildEvent;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
@@ -32,10 +33,12 @@
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import com.google.devtools.build.lib.util.CommandDescriptionForm;
import com.google.devtools.build.lib.util.CommandFailureUtils;
+import com.google.devtools.build.lib.util.ShellEscaper;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
/** Output callback for aquery, prints human readable output. */
@@ -148,6 +151,23 @@
.append("\n");
}
+ if (action instanceof ExecutionInfoSpecifier) {
+ ExecutionInfoSpecifier executionInfoSpecifier = (ExecutionInfoSpecifier) action;
+ stringBuilder
+ .append(" ExecutionInfo: {")
+ .append(
+ executionInfoSpecifier.getExecutionInfo().entrySet().stream()
+ .sorted(Map.Entry.comparingByKey())
+ .map(
+ e ->
+ String.format(
+ "%s: %s",
+ ShellEscaper.escapeString(e.getKey()),
+ ShellEscaper.escapeString(e.getValue())))
+ .collect(Collectors.joining(", ")))
+ .append("}\n");
+ }
+
stringBuilder.append('\n');
printStream.write(stringBuilder.toString().getBytes(UTF_8));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
index 5ade7a9..3c966b2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
@@ -25,6 +25,7 @@
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.CommandLineExpansionException;
+import com.google.devtools.build.lib.actions.ExecutionInfoSpecifier;
import com.google.devtools.build.lib.analysis.AnalysisProtos;
import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
@@ -125,6 +126,16 @@
}
}
+ if (action instanceof ExecutionInfoSpecifier) {
+ ExecutionInfoSpecifier executionInfoSpecifier = (ExecutionInfoSpecifier) action;
+ for (Map.Entry<String, String> info : executionInfoSpecifier.getExecutionInfo().entrySet()) {
+ actionBuilder.addExecutionInfo(
+ AnalysisProtos.KeyValuePair.newBuilder()
+ .setKey(info.getKey())
+ .setValue(info.getValue()));
+ }
+ }
+
ActionOwner actionOwner = action.getOwner();
if (actionOwner != null) {
BuildEvent event = actionOwner.getConfiguration();
diff --git a/src/main/protobuf/analysis.proto b/src/main/protobuf/analysis.proto
index 017df32..4884eb5 100644
--- a/src/main/protobuf/analysis.proto
+++ b/src/main/protobuf/analysis.proto
@@ -84,6 +84,11 @@
// True iff the action does input discovery during execution.
bool discovers_inputs = 10;
+
+ // Execution info for the action. Remote execution services may use this
+ // information to modify the execution environment, but actions will
+ // generally not be aware of it.
+ repeated KeyValuePair execution_info = 11;
}
// Represents a single target (without configuration information) that is