Avoid Skyframe restarts in transitive targets due related to conservative aspect deps.
--
MOS_MIGRATED_REVID=100960261
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 fab8842..5bb9c4f 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
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.skyframe;
import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
@@ -111,18 +112,23 @@
TargetAndErrorIfAny targetAndErrorIfAny = (TargetAndErrorIfAny) loadTargetResults;
TProcessedTargets processedTargets = processTarget(label, targetAndErrorIfAny);
- // Process deps from attributes of current target.
+ // Process deps from attributes and conservative aspects of current target.
Iterable<SkyKey> labelDepKeys = getLabelDepKeys(targetAndErrorIfAny.getTarget());
+ Iterable<SkyKey> labelAspectKeys =
+ getConservativeLabelAspectKeys(targetAndErrorIfAny.getTarget());
+ Iterable<SkyKey> depAndAspectKeys = Iterables.concat(labelDepKeys, labelAspectKeys);
+
Set<Entry<SkyKey, ValueOrException2<NoSuchPackageException, NoSuchTargetException>>>
- labelDepEntries = env.getValuesOrThrow(labelDepKeys, NoSuchPackageException.class,
- NoSuchTargetException.class).entrySet();
- processDeps(processedTargets, env.getListener(), targetAndErrorIfAny, labelDepEntries);
+ depsAndAspectEntries = env.getValuesOrThrow(depAndAspectKeys,
+ NoSuchPackageException.class, NoSuchTargetException.class).entrySet();
+ processDeps(processedTargets, env.getListener(), targetAndErrorIfAny, depsAndAspectEntries);
if (env.valuesMissing()) {
return null;
}
- // Process deps from aspects.
- Iterable<SkyKey> labelAspectKeys = getLabelAspectKeys(targetAndErrorIfAny.getTarget(), env);
+
+ // Process deps from strict aspects.
+ labelAspectKeys = getStrictLabelAspectKeys(targetAndErrorIfAny.getTarget(), env);
Set<Entry<SkyKey, ValueOrException2<NoSuchPackageException, NoSuchTargetException>>>
labelAspectEntries = env.getValuesOrThrow(labelAspectKeys, NoSuchPackageException.class,
NoSuchTargetException.class).entrySet();
@@ -142,9 +148,20 @@
/**
* Return an Iterable of SkyKeys corresponding to the Aspect-related dependencies of target.
*
+ * <p>This method may return a precise set of aspect keys, but may need to request additional
+ * dependencies from the env to do so.
+ *
+ * <p>Subclasses should implement only one of #getStrictLabelAspectKeys and
+ * @getConservativeLabelAspectKeys.
+ */
+ protected abstract Iterable<SkyKey> getStrictLabelAspectKeys(Target target, Environment env);
+
+ /**
+ * Return an Iterable of SkyKeys corresponding to the Aspect-related dependencies of target.
+ *
* <p>This method may return a conservative over-approximation of the exact set.
*/
- protected abstract Iterable<SkyKey> getLabelAspectKeys(Target target, Environment env);
+ protected abstract Iterable<SkyKey> getConservativeLabelAspectKeys(Target target);
private Iterable<SkyKey> getLabelDepKeys(Target target) {
List<SkyKey> depKeys = Lists.newArrayList();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
index 7ff7117..36d94b9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
@@ -154,7 +154,7 @@
}
@Override
- protected Iterable<SkyKey> getLabelAspectKeys(Target target, Environment env) {
+ protected Iterable<SkyKey> getStrictLabelAspectKeys(Target target, Environment env) {
List<SkyKey> depKeys = Lists.newArrayList();
if (target instanceof Rule) {
Multimap<Attribute, Label> transitions =
@@ -181,6 +181,11 @@
return depKeys;
}
+ @Override
+ protected Iterable<SkyKey> getConservativeLabelAspectKeys(Target target) {
+ return ImmutableSet.of();
+ }
+
/**
* Returns every configuration fragment known to the system.
*/
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 1be5863..7f54357 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
@@ -86,26 +86,31 @@
: TransitiveTraversalValue.unsuccessfulTransitiveTraversal(errorLoadingTarget);
}
- @Override
- protected Iterable<SkyKey> getLabelAspectKeys(Target target, Environment env) {
- if (!(target instanceof Rule)) {
- return ImmutableSet.of();
- }
- Rule rule = (Rule) target;
- Multimap<Attribute, Label> attibuteMap = LinkedHashMultimap.create();
- for (Attribute attribute : rule.getTransitions(Rule.NO_NODEP_ATTRIBUTES).keys()) {
- for (Class<? extends AspectFactory<?, ?, ?>> aspectFactory : attribute.getAspects()) {
- AspectDefinition.addAllAttributesOfAspect(rule, attibuteMap,
- AspectFactory.Util.create(aspectFactory).getDefinition(), Rule.ALL_DEPS);
- }
+ @Override
+ protected Iterable<SkyKey> getStrictLabelAspectKeys(Target target, Environment env) {
+ return ImmutableSet.of();
}
- ImmutableSet.Builder<SkyKey> depKeys = new ImmutableSet.Builder<>();
- for (Label label : attibuteMap.values()) {
- depKeys.add(getKey(label));
+ @Override
+ protected Iterable<SkyKey> getConservativeLabelAspectKeys(Target target) {
+ if (!(target instanceof Rule)) {
+ return ImmutableSet.of();
+ }
+ Rule rule = (Rule) target;
+ Multimap<Attribute, Label> attibuteMap = LinkedHashMultimap.create();
+ for (Attribute attribute : rule.getTransitions(Rule.NO_NODEP_ATTRIBUTES).keys()) {
+ for (Class<? extends AspectFactory<?, ?, ?>> aspectFactory : attribute.getAspects()) {
+ AspectDefinition.addAllAttributesOfAspect(rule, attibuteMap,
+ AspectFactory.Util.create(aspectFactory).getDefinition(), Rule.ALL_DEPS);
+ }
+ }
+
+ ImmutableSet.Builder<SkyKey> depKeys = new ImmutableSet.Builder<>();
+ for (Label label : attibuteMap.values()) {
+ depKeys.add(getKey(label));
+ }
+ return depKeys.build();
}
- return depKeys.build();
- }
/**
* Because {@link TransitiveTraversalFunction} is invoked only when its side-effects are desired,