diff options
author | 2018-03-05 07:41:37 -0800 | |
---|---|---|
committer | 2018-03-05 07:43:50 -0800 | |
commit | 88c3b85bbfa840200ec5d483dc791cefbb20f73a (patch) | |
tree | 236199b432753f20f9d5b53374bcb2142570dacf /src/main | |
parent | 3bcad502164dd169e5bb0af88f406dea86e24109 (diff) |
Move action graph dump methods into the ActionGraphDump class.
RELNOTES: None
PiperOrigin-RevId: 187865083
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/ActionGraphDump.java | 130 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java | 140 |
2 files changed, 130 insertions, 140 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(); + } } 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 4b7cfe3d6b..48827ed498 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 @@ -27,35 +27,21 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Range; import com.google.common.collect.Sets; -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; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.BuildView; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory; -import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; -import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; import com.google.devtools.build.lib.buildtool.BuildRequestOptions; -import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; -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.concurrent.Uninterruptibles; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.packages.AspectClass; -import com.google.devtools.build.lib.packages.AspectDescriptor; import com.google.devtools.build.lib.packages.BuildFileName; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; @@ -111,7 +97,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; @@ -776,18 +761,9 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { return new ArrayList<>(ruleStats.values()); } - private static boolean includeInActionGraph(String labelString, List<String> actionGraphTargets) { - if (actionGraphTargets.size() == 1 - && Iterables.getOnlyElement(actionGraphTargets).equals("...")) { - return true; - } - return actionGraphTargets.contains(labelString); - } - @Override public ActionGraphContainer getActionGraphContainer(List<String> actionGraphTargets) { - ActionGraphContainer.Builder actionGraphBuilder = ActionGraphContainer.newBuilder(); - ActionGraphDump actionGraphDump = new ActionGraphDump(actionGraphBuilder); + ActionGraphDump actionGraphDump = new ActionGraphDump(actionGraphTargets); for (Map.Entry<SkyKey, ? extends NodeEntry> skyKeyAndNodeEntry : memoizingEvaluator.getGraphMap().entrySet()) { NodeEntry entry = skyKeyAndNodeEntry.getValue(); @@ -795,121 +771,23 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { SkyFunctionName functionName = key.functionName(); try { if (functionName.equals(SkyFunctions.CONFIGURED_TARGET)) { - dumpConfiguredTarget(actionGraphBuilder, actionGraphDump, entry, actionGraphTargets); + actionGraphDump.dumpConfiguredTarget((ConfiguredTargetValue) entry.getValue()); } else if (functionName.equals(SkyFunctions.ASPECT)) { - dumpAspect(actionGraphBuilder, actionGraphDump, entry, actionGraphTargets); + AspectValue aspectValue = (AspectValue) entry.getValue(); + AspectKey aspectKey = aspectValue.getKey(); + ConfiguredTargetValue configuredTargetValue = + (ConfiguredTargetValue) + memoizingEvaluator.getExistingValue(aspectKey.getBaseConfiguredTargetKey()); + actionGraphDump.dumpAspect(aspectValue, configuredTargetValue); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IllegalStateException("No interruption in sequenced evaluation", e); } } - return actionGraphBuilder.build(); - } - - private void dumpAspect( - ActionGraphContainer.Builder actionGraphBuilder, - ActionGraphDump actionGraphDump, - NodeEntry entry, - List<String> actionGraphTargets) - throws InterruptedException { - AspectValue aspectValue = (AspectValue) entry.getValue(); - AspectKey aspectKey = aspectValue.getKey(); - ConfiguredTargetValue value = - (ConfiguredTargetValue) - memoizingEvaluator.getExistingValue(aspectKey.getBaseConfiguredTargetKey()); - ConfiguredTarget configuredTarget = value.getConfiguredTarget(); - if (!includeInActionGraph(configuredTarget.getLabel().toString(), actionGraphTargets)) { - return; - } - for (int i = 0; i < aspectValue.getNumActions(); i++) { - Action action = aspectValue.getAction(i); - dumpSingleAction(actionGraphDump, actionGraphBuilder, configuredTarget, action); - } - } - - private void dumpConfiguredTarget( - ActionGraphContainer.Builder actionGraphBuilder, - ActionGraphDump actionGraphDump, - NodeEntry entry, - List<String> actionGraphTargets) - throws InterruptedException { - ConfiguredTargetValue ctValue = (ConfiguredTargetValue) entry.getValue(); - ConfiguredTarget configuredTarget = ctValue.getConfiguredTarget(); - if (!includeInActionGraph(configuredTarget.getLabel().toString(), actionGraphTargets)) { - return; - } - List<ActionAnalysisMetadata> actions = ctValue.getActions(); - for (ActionAnalysisMetadata action : actions) { - dumpSingleAction(actionGraphDump, actionGraphBuilder, configuredTarget, action); - } + return actionGraphDump.build(); } - private void dumpSingleAction( - ActionGraphDump actionGraphDump, - ActionGraphContainer.Builder actionGraphBuilder, - 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(actionGraphDump.targetToId(label, ruleClassString)); - - if (action instanceof ActionExecutionMetadata) { - ActionExecutionMetadata actionExecutionMetadata = (ActionExecutionMetadata) action; - actionBuilder - .setActionKey(actionExecutionMetadata.getKey(actionGraphDump.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(actionGraphDump.configurationToId(buildConfiguration)); - - // store aspect - for (AspectDescriptor aspectDescriptor : actionOwner.getAspectDescriptors()) { - actionBuilder.addAspectDescriptorIds( - actionGraphDump.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(actionGraphDump.depSetToId(nestedSetView)); - } - - // store outputs - for (Artifact artifact : action.getOutputs()) { - actionBuilder.addOutputIds(actionGraphDump.artifactToId(artifact)); - } - - actionGraphBuilder.addActions(actionBuilder.build()); - } /** * In addition to calling the superclass method, deletes all ConfiguredTarget values from the |