aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java
diff options
context:
space:
mode:
authorGravatar twerth <twerth@google.com>2018-03-05 07:41:37 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-05 07:43:50 -0800
commit88c3b85bbfa840200ec5d483dc791cefbb20f73a (patch)
tree236199b432753f20f9d5b53374bcb2142570dacf /src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java
parent3bcad502164dd169e5bb0af88f406dea86e24109 (diff)
Move action graph dump methods into the ActionGraphDump class.
RELNOTES: None PiperOrigin-RevId: 187865083
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java130
1 files changed, 121 insertions, 9 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java
index 40400d108f..0539c03fde 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java
@@ -13,7 +13,15 @@
// limitations under the License.
package com.google.devtools.build.lib.skyframe;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.ActionExecutionMetadata;
import com.google.devtools.build.lib.actions.ActionKeyContext;
+import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.AnalysisProtos;
import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer;
@@ -22,13 +30,21 @@ import com.google.devtools.build.lib.analysis.AnalysisProtos.DepSetOfFiles;
import com.google.devtools.build.lib.analysis.AnalysisProtos.KeyValuePair;
import com.google.devtools.build.lib.analysis.AnalysisProtos.RuleClass;
import com.google.devtools.build.lib.analysis.AnalysisProtos.Target;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
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.collect.nestedset.NestedSetView;
+import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.AspectDescriptor;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
/**
* Encapsulates necessary functionality to dump the current skyframe state of the action graph to
@@ -45,18 +61,27 @@ public class ActionGraphDump {
// can point to the same object.
private final Map<Object, String> knownNestedSets = new HashMap<>();
- private final ActionGraphContainer.Builder actionGraphBuilder;
+ private final ActionGraphContainer.Builder actionGraphBuilder = ActionGraphContainer.newBuilder();
private final ActionKeyContext actionKeyContext = new ActionKeyContext();
+ private final Set<String> actionGraphTargets;
- ActionGraphDump(ActionGraphContainer.Builder actionGraphBuilder) {
- this.actionGraphBuilder = actionGraphBuilder;
+ public ActionGraphDump(List<String> actionGraphTargets) {
+ this.actionGraphTargets = ImmutableSet.copyOf(actionGraphTargets);
}
public ActionKeyContext getActionKeyContext() {
return actionKeyContext;
}
- public String ruleClassStringToId(String ruleClassString) {
+ private boolean includeInActionGraph(String labelString) {
+ if (actionGraphTargets.size() == 1
+ && Iterables.getOnlyElement(actionGraphTargets).equals("...")) {
+ return true;
+ }
+ return actionGraphTargets.contains(labelString);
+ }
+
+ private String ruleClassStringToId(String ruleClassString) {
if (!knownRuleClassStrings.containsKey(ruleClassString)) {
String targetId = String.valueOf(knownRuleClassStrings.size());
knownRuleClassStrings.put(ruleClassString, targetId);
@@ -67,7 +92,7 @@ public class ActionGraphDump {
return knownRuleClassStrings.get(ruleClassString);
}
- public String targetToId(Label label, String ruleClassString) {
+ private String targetToId(Label label, String ruleClassString) {
if (!knownTargets.containsKey(label)) {
String targetId = String.valueOf(knownTargets.size());
knownTargets.put(label, targetId);
@@ -81,7 +106,7 @@ public class ActionGraphDump {
return knownTargets.get(label);
}
- public String configurationToId(BuildConfiguration buildConfiguration) {
+ private String configurationToId(BuildConfiguration buildConfiguration) {
if (!knownConfigurations.containsKey(buildConfiguration)) {
String configurationId = String.valueOf(knownConfigurations.size());
knownConfigurations.put(buildConfiguration, configurationId);
@@ -96,7 +121,7 @@ public class ActionGraphDump {
return knownConfigurations.get(buildConfiguration);
}
- public String artifactToId(Artifact artifact) {
+ private String artifactToId(Artifact artifact) {
if (!knownArtifacts.containsKey(artifact)) {
String artifactId = String.valueOf(knownArtifacts.size());
knownArtifacts.put(artifact, artifactId);
@@ -111,7 +136,7 @@ public class ActionGraphDump {
return knownArtifacts.get(artifact);
}
- public String depSetToId(NestedSetView<Artifact> nestedSetView) {
+ private String depSetToId(NestedSetView<Artifact> nestedSetView) {
if (!knownNestedSets.containsKey(nestedSetView.identifier())) {
String nestedSetId = String.valueOf(knownNestedSets.size());
knownNestedSets.put(nestedSetView.identifier(), nestedSetId);
@@ -127,7 +152,7 @@ public class ActionGraphDump {
return knownNestedSets.get(nestedSetView.identifier());
}
- public String aspectDescriptorToId(AspectDescriptor aspectDescriptor) {
+ private String aspectDescriptorToId(AspectDescriptor aspectDescriptor) {
if (!knownAspectDescriptors.containsKey(aspectDescriptor)) {
String aspectDescriptorId = String.valueOf(knownAspectDescriptors.size());
knownAspectDescriptors.put(aspectDescriptor, aspectDescriptorId);
@@ -145,4 +170,91 @@ public class ActionGraphDump {
}
return knownAspectDescriptors.get(aspectDescriptor);
}
+
+ private void dumpSingleAction(ConfiguredTarget configuredTarget, ActionAnalysisMetadata action) {
+ Preconditions.checkState(configuredTarget instanceof RuleConfiguredTarget);
+ Label label = configuredTarget.getLabel();
+ String ruleClassString = ((RuleConfiguredTarget) configuredTarget).getRuleClassString();
+ AnalysisProtos.Action.Builder actionBuilder =
+ AnalysisProtos.Action.newBuilder()
+ .setMnemonic(action.getMnemonic())
+ .setTargetId(targetToId(label, ruleClassString));
+
+ if (action instanceof ActionExecutionMetadata) {
+ ActionExecutionMetadata actionExecutionMetadata = (ActionExecutionMetadata) action;
+ actionBuilder
+ .setActionKey(actionExecutionMetadata.getKey(getActionKeyContext()))
+ .setDiscoversInputs(actionExecutionMetadata.discoversInputs());
+ }
+
+ // store environment
+ if (action instanceof SpawnAction) {
+ SpawnAction spawnAction = (SpawnAction) action;
+ // TODO(twerth): This handles the fixed environemnt. We probably want to output the inherited
+ // environment as well.
+ ImmutableMap<String, String> fixedEnvironment = spawnAction.getEnvironment();
+ for (Entry<String, String> environmentVariable : fixedEnvironment.entrySet()) {
+ AnalysisProtos.KeyValuePair.Builder keyValuePairBuilder =
+ AnalysisProtos.KeyValuePair.newBuilder();
+ keyValuePairBuilder
+ .setKey(environmentVariable.getKey())
+ .setValue(environmentVariable.getValue());
+ actionBuilder.addEnvironmentVariables(keyValuePairBuilder.build());
+ }
+ }
+
+ ActionOwner actionOwner = action.getOwner();
+ if (actionOwner != null) {
+ BuildConfiguration buildConfiguration = (BuildConfiguration) actionOwner.getConfiguration();
+ actionBuilder.setConfigurationId(configurationToId(buildConfiguration));
+
+ // store aspect
+ for (AspectDescriptor aspectDescriptor : actionOwner.getAspectDescriptors()) {
+ actionBuilder.addAspectDescriptorIds(aspectDescriptorToId(aspectDescriptor));
+ }
+ }
+
+ // store inputs
+ Iterable<Artifact> inputs = action.getInputs();
+ if (!(inputs instanceof NestedSet)) {
+ inputs = NestedSetBuilder.wrap(Order.STABLE_ORDER, inputs);
+ }
+ NestedSetView<Artifact> nestedSetView = new NestedSetView<>((NestedSet<Artifact>) inputs);
+ if (nestedSetView.directs().size() > 0 || nestedSetView.transitives().size() > 0) {
+ actionBuilder.addInputDepSetIds(depSetToId(nestedSetView));
+ }
+
+ // store outputs
+ for (Artifact artifact : action.getOutputs()) {
+ actionBuilder.addOutputIds(artifactToId(artifact));
+ }
+
+ actionGraphBuilder.addActions(actionBuilder.build());
+ }
+
+ public void dumpAspect(AspectValue aspectValue, ConfiguredTargetValue configuredTargetValue) {
+ ConfiguredTarget configuredTarget = configuredTargetValue.getConfiguredTarget();
+ if (!includeInActionGraph(configuredTarget.getLabel().toString())) {
+ return;
+ }
+ for (int i = 0; i < aspectValue.getNumActions(); i++) {
+ Action action = aspectValue.getAction(i);
+ dumpSingleAction(configuredTarget, action);
+ }
+ }
+
+ public void dumpConfiguredTarget(ConfiguredTargetValue configuredTargetValue) {
+ ConfiguredTarget configuredTarget = configuredTargetValue.getConfiguredTarget();
+ if (!includeInActionGraph(configuredTarget.getLabel().toString())) {
+ return;
+ }
+ List<ActionAnalysisMetadata> actions = configuredTargetValue.getActions();
+ for (ActionAnalysisMetadata action : actions) {
+ dumpSingleAction(configuredTarget, action);
+ }
+ }
+
+ public ActionGraphContainer build() {
+ return actionGraphBuilder.build();
+ }
}