aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java
diff options
context:
space:
mode:
authorGravatar shreyax <shreyax@google.com>2018-02-23 07:46:54 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-23 07:48:26 -0800
commit246f0aa048aeb3f456c89565e1e3021957b6cef4 (patch)
treefbc8d8d8d81df14587a377b3b9b897382c88c1d9 /src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java
parentf0c7c4650d874d31a4ef97df191a743445c0463d (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.java61
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.