diff options
author | 2015-02-11 08:49:36 +0000 | |
---|---|---|
committer | 2015-02-11 08:49:36 +0000 | |
commit | 4e0f8560d754f021f784b3e48acb18a4ec99fd97 (patch) | |
tree | 09d928dc7668b118b70787b78309cf66427f1b23 /src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java | |
parent | cdc90e9279fdd127720cb0bf8548ce3e1b4f6042 (diff) |
Replace some calls to ArtifactFactory.resolveSourceArtifact(PathFragment execPath), with a skyframe native implementation ArtifactFactory.resolveSourceArtifact(Iterable<PathFragment> execPaths, PackageRootResolver resolver).
--
MOS_MIGRATED_REVID=86062289
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java index 14208602d4..ba24480456 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java @@ -26,12 +26,16 @@ import com.google.devtools.build.lib.actions.AlreadyReportedActionExecutionExcep import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.MissingInputFileException; import com.google.devtools.build.lib.actions.NotifyOnActionCacheHit; +import com.google.devtools.build.lib.actions.PackageRootResolver; +import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.actions.cache.MetadataHandler; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.packages.PackageIdentifier; import com.google.devtools.build.lib.syntax.Label; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; +import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyKey; @@ -115,6 +119,49 @@ public class ActionExecutionFunction implements SkyFunction { return result; } + + /** + * Skyframe implementation of {@link PackageRootResolver}. Should be used only from SkyFunctions, + * because it uses SkyFunction.Environment for evaluation of ContainingPackageLookupValue. + */ + private static class PackageRootResolverWithEnvironment implements PackageRootResolver { + private final Environment env; + + public PackageRootResolverWithEnvironment(Environment env) { + this.env = env; + } + + @Override + public Map<PathFragment, Root> findPackageRoots(Iterable<PathFragment> execPaths) { + Map<PathFragment, SkyKey> depKeys = new HashMap<>(); + // Create SkyKeys list based on execPaths. + for (PathFragment path : execPaths) { + depKeys.put(path, + ContainingPackageLookupValue.key(PackageIdentifier.createInDefaultRepo(path))); + } + Map<SkyKey, SkyValue> values = env.getValues(depKeys.values()); + if (env.valuesMissing()) { + // Some values are not computed yet. + return null; + } + Map<PathFragment, Root> result = new HashMap<>(); + for (PathFragment path : execPaths) { + // TODO(bazel-team): Add check for errors here, when loading phase will be removed. + // For now all possible errors that ContainingPackageLookupFunction can generate + // are caught in previous phases. + ContainingPackageLookupValue value = + (ContainingPackageLookupValue) values.get(depKeys.get(path)); + if (value.hasContainingPackage()) { + // We have found corresponding root for current execPath. + result.put(path, Root.asSourceRoot(value.getContainingPackageRoot())); + } else { + // We haven't found corresponding root for current execPath. + result.put(path, null); + } + } + return result; + } + } private ActionExecutionValue checkCacheAndExecuteIfNeeded( Action action, @@ -146,7 +193,11 @@ public class ActionExecutionFunction implements SkyFunction { tsgm); metadataHandler = skyframeActionExecutor.constructMetadataHandler(fileAndMetadataCache); - token = skyframeActionExecutor.checkActionCache(action, metadataHandler, actionStartTime); + token = skyframeActionExecutor.checkActionCache(action, metadataHandler, + new PackageRootResolverWithEnvironment(env), actionStartTime); + if (token == Token.NEED_TO_RERUN) { + return null; + } } if (token == null && inputArtifactData != null) { // We got a hit from the action cache -- no need to execute. |