From 3ac42bf4a979c96e73fd79fb8f5416ae7d7621eb Mon Sep 17 00:00:00 2001 From: Mark Schaller Date: Wed, 18 Nov 2015 23:13:48 +0000 Subject: More batching of graph lookups during evaluation -- MOS_MIGRATED_REVID=108186573 --- .../devtools/build/skyframe/ParallelEvaluator.java | 30 +++++++++++++--------- 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'src/main/java/com') diff --git a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java index 6e7ce9b9ee..7706611734 100644 --- a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java +++ b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java @@ -18,7 +18,6 @@ import static com.google.devtools.build.skyframe.SkyKeyInterner.SKY_KEY_INTERNER import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.base.Throwables; @@ -112,13 +111,6 @@ public final class ParallelEvaluator implements Evaluator { private final ProcessableGraph graph; private final Version graphVersion; - private final Predicate nodeEntryIsDone = new Predicate() { - @Override - public boolean apply(SkyKey skyKey) { - return isDoneForBuild(graph.get(skyKey)); - } - }; - private static class SkyValueSupplier implements Supplier { private final NodeEntry state; @@ -1137,12 +1129,18 @@ public final class ParallelEvaluator implements Evaluator { private void registerNewlyDiscoveredDepsForDoneEntry( SkyKey skyKey, NodeEntry entry, SkyFunctionEnvironment env) { Set unfinishedDeps = new HashSet<>(); - Iterables.addAll(unfinishedDeps, - Iterables.filter(env.newlyRequestedDeps, Predicates.not(nodeEntryIsDone))); + Map batch = graph.getBatch(env.newlyRequestedDeps); + for (SkyKey dep : env.newlyRequestedDeps) { + if (!isDoneForBuild(batch.get(dep))) { + unfinishedDeps.add(dep); + } + } env.newlyRequestedDeps.remove(unfinishedDeps); entry.addTemporaryDirectDeps(env.newlyRequestedDeps); - Map batch = graph.getBatch(env.newlyRequestedDeps); for (SkyKey newDep : env.newlyRequestedDeps) { + // Note that this depEntry can't be null. If env.newlyRequestedDeps contained a key with a + // null entry, then it would have been added to unfinishedDeps and then removed from + // env.newlyRequestedDeps just above this loop. NodeEntry depEntry = Preconditions.checkNotNull(batch.get(newDep), newDep); DependencyState triState = depEntry.addReverseDepAndCheckIfDone(skyKey); Preconditions.checkState(DependencyState.DONE == triState, @@ -1180,7 +1178,15 @@ public final class ParallelEvaluator implements Evaluator { // Optimization: if all required node values are already present in the cache, return them // directly without launching the heavy machinery, spawning threads, etc. // Inform progressReceiver that these nodes are done to be consistent with the main code path. - if (Iterables.all(skyKeySet, nodeEntryIsDone)) { + boolean allAreDone = true; + Map batch = graph.getBatch(skyKeySet); + for (SkyKey key : skyKeySet) { + if (!isDoneForBuild(batch.get(key))) { + allAreDone = false; + break; + } + } + if (allAreDone) { for (SkyKey skyKey : skyKeySet) { informProgressReceiverThatValueIsDone(skyKey); } -- cgit v1.2.3