In TransitiveBaseTraversalFunction, only process the deps once we have all the information we need. It is a waste of CPU time otherwise as we will just lose the state. Note that we don't pass the env directly into the processDeps function so this wasn't a skyframe restart optimization. Also, none of the state recorded in the processDeps for the direct label deps is used in computing the aspect deps, as we immediately call targetAndErrorIfAny#getTarget.
PiperOrigin-RevId: 186373573
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java
index 5b6e9ed..b51bab4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java
@@ -125,7 +125,6 @@
loadTargetResultsType.equals(LoadTargetResultsType.TARGET_AND_ERROR_IF_ANY),
loadTargetResultsType);
TargetAndErrorIfAny targetAndErrorIfAny = (TargetAndErrorIfAny) loadTargetResults;
- TProcessedTargets processedTargets = processTarget(label, targetAndErrorIfAny);
// Process deps from attributes.
Collection<SkyKey> labelDepKeys =
@@ -134,22 +133,23 @@
Map<SkyKey, ValueOrException2<NoSuchPackageException, NoSuchTargetException>> depMap =
env.getValuesOrThrow(labelDepKeys, NoSuchPackageException.class,
NoSuchTargetException.class);
- processDeps(processedTargets, env.getListener(), targetAndErrorIfAny, depMap.entrySet());
if (env.valuesMissing()) {
return null;
}
-
// Process deps from aspects.
Iterable<SkyKey> labelAspectKeys =
getStrictLabelAspectKeys(targetAndErrorIfAny.getTarget(), depMap, env);
Set<Entry<SkyKey, ValueOrException2<NoSuchPackageException, NoSuchTargetException>>>
labelAspectEntries = env.getValuesOrThrow(labelAspectKeys, NoSuchPackageException.class,
NoSuchTargetException.class).entrySet();
- processDeps(processedTargets, env.getListener(), targetAndErrorIfAny, labelAspectEntries);
if (env.valuesMissing()) {
return null;
}
+ TProcessedTargets processedTargets = processTarget(label, targetAndErrorIfAny);
+ processDeps(processedTargets, env.getListener(), targetAndErrorIfAny, depMap.entrySet());
+ processDeps(processedTargets, env.getListener(), targetAndErrorIfAny, labelAspectEntries);
+
return computeSkyValue(targetAndErrorIfAny, processedTargets);
}