diff options
author | 2018-02-23 07:46:54 -0800 | |
---|---|---|
committer | 2018-02-23 07:48:26 -0800 | |
commit | 246f0aa048aeb3f456c89565e1e3021957b6cef4 (patch) | |
tree | fbc8d8d8d81df14587a377b3b9b897382c88c1d9 /src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java | |
parent | f0c7c4650d874d31a4ef97df191a743445c0463d (diff) |
Automated rollback of commit 7fe59b98eefc96a6310f0b0221d4e0f18e2a9000.
*** Reason for rollback ***
Fixed bug due to TransitiveTargetFunction requesting multiple Package dependencies when computing its aspect deps by only applying the optimization to TransitiveTraversalFunction.
*** Original change description ***
Automated rollback of commit cce164aed44aba1de244f0d764cd33a5cc6980b2.
PiperOrigin-RevId: 186766812
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java index a5373783f7..eb7bd63320 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java @@ -26,10 +26,14 @@ import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.NoSuchThingException; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.skyframe.TransitiveTraversalFunction.FirstErrorMessageAccumulator; +import com.google.devtools.build.lib.util.GroupedList; +import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import com.google.devtools.build.skyframe.ValueOrException2; import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; import javax.annotation.Nullable; @@ -130,6 +134,63 @@ public class TransitiveTraversalFunction return TargetMarkerFunction.computeTargetMarkerValue(targetMarkerKey, env); } + @Override + Collection<SkyKey> getLabelDepKeys( + SkyFunction.Environment env, TargetAndErrorIfAny targetAndErrorIfAny) + throws InterruptedException { + // As a performance optimization we may already know the deps we are about to request from + // last time #compute was called. By requesting these from the environment, we can avoid + // repeating the label visitation step. For TransitiveTraversalFunction#compute, the label deps + // dependency group is requested immediately after the package. + // + // IMPORTANT: No other package values should be requested inside + // TransitiveTraversalFunction#compute from this point forward. + Collection<SkyKey> oldDepKeys = getDepsAfterLastPackageDep(env, /*offset=*/ 1); + return oldDepKeys == null ? super.getLabelDepKeys(env, targetAndErrorIfAny) : oldDepKeys; + } + + @Override + Iterable<SkyKey> getStrictLabelAspectDepKeys( + SkyFunction.Environment env, + Map<SkyKey, ValueOrException2<NoSuchPackageException, NoSuchTargetException>> depMap, + TargetAndErrorIfAny targetAndErrorIfAny) + throws InterruptedException { + // As a performance optimization we may already know the deps we are about to request from + // last time #compute was called. By requesting these from the environment, we can avoid + // repeating the label visitation step. For TransitiveTraversalFunction#compute, the label + // aspect deps dependency group is requested two groups after the package. + Collection<SkyKey> oldAspectDepKeys = getDepsAfterLastPackageDep(env, /*offset=*/ 2); + return oldAspectDepKeys == null + ? super.getStrictLabelAspectDepKeys(env, depMap, targetAndErrorIfAny) + : oldAspectDepKeys; + } + + @Nullable + private static Collection<SkyKey> getDepsAfterLastPackageDep( + SkyFunction.Environment env, int offset) { + GroupedList<SkyKey> temporaryDirectDeps = env.getTemporaryDirectDeps(); + if (temporaryDirectDeps == null) { + return null; + } + int lastPackageDepIndex = getLastPackageValueIndex(temporaryDirectDeps); + if (lastPackageDepIndex == -1 + || temporaryDirectDeps.listSize() <= lastPackageDepIndex + offset) { + return null; + } + return temporaryDirectDeps.get(lastPackageDepIndex + offset); + } + + private static int getLastPackageValueIndex(GroupedList<SkyKey> directDeps) { + int directDepsNumGroups = directDeps.listSize(); + for (int i = directDepsNumGroups - 1; i >= 0; i--) { + List<SkyKey> depGroup = directDeps.get(i); + if (depGroup.size() == 1 && depGroup.get(0).functionName().equals(SkyFunctions.PACKAGE)) { + return i; + } + } + return -1; + } + /** * Keeps track of the first error message encountered while traversing itself and its * dependencies. |