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,