Refactor `getValues` in `skyframe` directory to only provide the necessary methods for Skyframe evaluation. It will help create less garbage.
PiperOrigin-RevId: 438056310
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java
index b723829..df82357 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java
@@ -18,9 +18,7 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
-import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact;
import com.google.devtools.build.lib.actions.FileArtifactValue;
@@ -60,10 +58,10 @@
import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
+import com.google.devtools.build.skyframe.SkyframeIterableResult;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -230,7 +228,7 @@
}
// We are free to traverse this directory.
- Collection<RecursiveFilesystemTraversalValue> subdirTraversals =
+ ImmutableList<RecursiveFilesystemTraversalValue> subdirTraversals =
traverseChildren(env, traversal);
if (subdirTraversals == null) {
return null;
@@ -595,7 +593,7 @@
private static RecursiveFilesystemTraversalValue resultForDirectory(
TraversalRequest traversal,
FileInfo rootInfo,
- Collection<RecursiveFilesystemTraversalValue> subdirTraversals) {
+ ImmutableList<RecursiveFilesystemTraversalValue> subdirTraversals) {
// Collect transitive closure of files in subdirectories.
NestedSetBuilder<ResolvedFile> paths = NestedSetBuilder.stableOrder();
for (RecursiveFilesystemTraversalValue child : subdirTraversals) {
@@ -635,7 +633,7 @@
/** Requests Skyframe to compute the dependent values and returns them. */
@Nullable
- private Collection<RecursiveFilesystemTraversalValue> traverseChildren(
+ private ImmutableList<RecursiveFilesystemTraversalValue> traverseChildren(
Environment env, TraversalRequest traversal)
throws InterruptedException, RecursiveFilesystemTraversalFunctionException, IOException {
// Use the traversal's path, even if it's a symlink. The contents of the directory, as listed
@@ -677,21 +675,33 @@
if (keys == null) {
return null;
}
- Map<SkyKey, SkyValue> values = Maps.newHashMapWithExpectedSize(keys.size());
+ ImmutableList.Builder<RecursiveFilesystemTraversalValue> values =
+ ImmutableList.builderWithExpectedSize(keys.size());
if (traversal.isRootGenerated) {
// Don't create Skyframe nodes for a recursive traversal over the output tree.
// Instead, inline the recursion in the top-level request.
for (TraversalRequest traversalRequest : keys) {
- values.put(traversalRequest, compute(traversalRequest, env));
+ SkyValue computeValue = compute(traversalRequest, env);
+ if (computeValue == null) {
+ continue;
+ }
+ values.add((RecursiveFilesystemTraversalValue) computeValue);
}
} else {
- values = env.getValues(keys);
+ SkyframeIterableResult result = env.getOrderedValuesAndExceptions(keys);
+ while (result.hasNext()) {
+ var iterateValue = (RecursiveFilesystemTraversalValue) result.next();
+ if (iterateValue == null) {
+ break;
+ }
+ values.add(iterateValue);
+ }
}
if (env.valuesMissing()) {
return null;
}
- return Collections2.transform(values.values(), RecursiveFilesystemTraversalValue.class::cast);
+ return values.build();
}
}