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);
}