Allows QueryableGraph.prefetchDeps to make decisions about how to handle
excluded keys.

PiperOrigin-RevId: 215217354
diff --git a/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java b/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java
index e196d0c..b08a499 100644
--- a/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java
+++ b/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java
@@ -13,9 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Map;
+import java.util.Set;
 import javax.annotation.Nullable;
 
 /**
@@ -60,10 +63,20 @@
     return InterruptibleSupplier.Memoize.of(() -> getBatch(requestor, reason, keys));
   }
 
-  /** Optimistically prefetches dependencies. */
-  default void prefetchDeps(@Nullable SkyKey requestor, Iterable<? extends SkyKey> depKeys)
+  /**
+   * Optimistically prefetches dependencies.
+   *
+   * @param excludedKeys keys that could overlap with {@code depKeys}. {@code prefetchDeps} is
+   *     usually called together with an actual fetch, and the keys actually fetched should be
+   *     excluded from the prefetch.
+   */
+  default void prefetchDeps(
+      @Nullable SkyKey requestor, Iterable<? extends SkyKey> depKeys, Set<SkyKey> excludedKeys)
       throws InterruptedException {
-    getBatchAsync(requestor, Reason.PREFETCH, depKeys);
+    getBatchAsync(
+        requestor,
+        Reason.PREFETCH,
+        Iterables.filter(depKeys, Predicates.not(Predicates.in(excludedKeys))));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
index d7a086a..7fbe29b 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -210,10 +209,7 @@
         // we may as well use it for the call to evaluatorContext#getBatchValues since we've
         // precomputed the size.
         depKeysAsSet = depKeys.toSet();
-        evaluatorContext
-            .getGraph()
-            .prefetchDeps(
-                requestor, Iterables.filter(oldDeps, Predicates.not(Predicates.in(depKeysAsSet))));
+        evaluatorContext.getGraph().prefetchDeps(requestor, oldDeps, depKeysAsSet);
       }
     }
     Map<SkyKey, ? extends NodeEntry> batchMap =