Rephrase the ActionGraph in terms of the WalkableGraph. This should be more efficient if we need to do many ActionGraph looups.
--
MOS_MIGRATED_REVID=100060090
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index d150986..42fe145 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -32,6 +32,7 @@
import com.google.devtools.build.lib.actions.ActionGraph;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ArtifactFactory;
+import com.google.devtools.build.lib.actions.ArtifactOwner;
import com.google.devtools.build.lib.actions.PackageRootResolver;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.analysis.DependencyResolver.Dependency;
@@ -63,15 +64,18 @@
import com.google.devtools.build.lib.pkgcache.PackageManager;
import com.google.devtools.build.lib.rules.test.CoverageReportActionFactory;
import com.google.devtools.build.lib.rules.test.CoverageReportActionFactory.CoverageReportActionsWrapper;
+import com.google.devtools.build.lib.skyframe.ActionLookupValue;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
import com.google.devtools.build.lib.skyframe.CoverageReportValue;
import com.google.devtools.build.lib.skyframe.SkyframeBuildView;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.RegexFilter;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.WalkableGraph;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;
@@ -600,9 +604,12 @@
prepareToBuild(new SkyframePackageRootResolver(skyframeExecutor));
skyframeExecutor.injectWorkspaceStatusData();
Collection<ConfiguredTarget> configuredTargets;
+ WalkableGraph graph;
try {
- configuredTargets = skyframeBuildView.configureTargets(
- targetSpecs, eventBus, viewOptions.keepGoing);
+ Pair<Collection<ConfiguredTarget>, WalkableGraph> configuredTargetsResult =
+ skyframeBuildView.configureTargets(targetSpecs, eventBus, viewOptions.keepGoing);
+ configuredTargets = configuredTargetsResult.getFirst();
+ graph = configuredTargetsResult.getSecond();
} finally {
skyframeBuildView.clearInvalidatedConfiguredTargets();
}
@@ -618,14 +625,15 @@
}
AnalysisResult result = createResult(loadingResult, topLevelOptions,
- viewOptions, configuredTargets, analysisSuccessful);
+ viewOptions, configuredTargets, analysisSuccessful, graph);
LOG.info("Finished analysis");
return result;
}
private AnalysisResult createResult(LoadingResult loadingResult,
TopLevelArtifactContext topLevelOptions, BuildView.Options viewOptions,
- Collection<ConfiguredTarget> configuredTargets, boolean analysisSuccessful)
+ Collection<ConfiguredTarget> configuredTargets, boolean analysisSuccessful,
+ final WalkableGraph graph)
throws InterruptedException {
Collection<Target> testsToRun = loadingResult.getTestsToRun();
Collection<ConfiguredTarget> allTargetsToTest = null;
@@ -666,7 +674,21 @@
? null
: "execution phase succeeded, but not all targets were analyzed")
: "execution phase succeeded, but there were loading phase errors";
- return new AnalysisResult(configuredTargets, allTargetsToTest, error, getActionGraph(),
+
+ final ActionGraph actionGraph = new ActionGraph() {
+ @Nullable
+ @Override
+ public Action getGeneratingAction(Artifact artifact) {
+ ArtifactOwner artifactOwner = artifact.getArtifactOwner();
+ if (artifactOwner instanceof ActionLookupValue.ActionLookupKey) {
+ SkyKey key = ActionLookupValue.key((ActionLookupValue.ActionLookupKey) artifactOwner);
+ ActionLookupValue val = (ActionLookupValue) graph.getValue(key);
+ return val == null ? null : val.getGeneratingAction(artifact);
+ }
+ return null;
+ }
+ };
+ return new AnalysisResult(configuredTargets, allTargetsToTest, error, actionGraph,
artifactsToBuild, parallelTests, exclusiveTests, topLevelOptions);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
index 4d51cfe..37e0e49 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
@@ -57,7 +57,7 @@
this.generatingActionMap = ImmutableMap.copyOf(generatingActionMap);
}
- Action getGeneratingAction(Artifact artifact) {
+ public Action getGeneratingAction(Artifact artifact) {
return generatingActionMap.get(artifact);
}
@@ -87,7 +87,7 @@
*
* <p>The methods of this class should only be called by {@link ActionLookupValue#key}.
*/
- protected abstract static class ActionLookupKey implements ArtifactOwner {
+ public abstract static class ActionLookupKey implements ArtifactOwner {
@Override
public Label getLabel() {
return null;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index fbae0e5..3ccc363 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -52,6 +52,7 @@
import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ConflictException;
import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.CycleInfo;
import com.google.devtools.build.skyframe.ErrorInfo;
@@ -60,6 +61,7 @@
import com.google.devtools.build.skyframe.SkyFunction.Environment;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
+import com.google.devtools.build.skyframe.WalkableGraph;
import java.util.Collection;
import java.util.HashSet;
@@ -156,10 +158,10 @@
/**
* Analyzes the specified targets using Skyframe as the driving framework.
*
- * @return the configured targets that should be built
+ * @return the configured targets that should be built along with a WalkableGraph of the analysis.
*/
- public Collection<ConfiguredTarget> configureTargets(List<ConfiguredTargetKey> values,
- EventBus eventBus, boolean keepGoing)
+ public Pair<Collection<ConfiguredTarget>, WalkableGraph> configureTargets(
+ List<ConfiguredTargetKey> values, EventBus eventBus, boolean keepGoing)
throws InterruptedException, ViewCreationFailedException {
enableAnalysis(true);
EvaluationResult<ConfiguredTargetValue> result;
@@ -184,7 +186,7 @@
if (!result.hasError() && badActions.isEmpty()) {
setDeserializedArtifactOwners();
- return goodCts;
+ return Pair.of(goodCts, result.getWalkableGraph());
}
// --nokeep_going so we fail with an exception for the first error.
@@ -289,7 +291,7 @@
}
}
setDeserializedArtifactOwners();
- return goodCts;
+ return Pair.of(goodCts, result.getWalkableGraph());
}
@Nullable