From 65ca4a25089b7bf03515a2e1340d955b1225fca7 Mon Sep 17 00:00:00 2001 From: Eric Fellheimer Date: Mon, 20 Jun 2016 20:59:23 +0000 Subject: Batchify child node lookups in Skyframe cycle detection. -- MOS_MIGRATED_REVID=125376554 --- .../devtools/build/skyframe/ParallelEvaluator.java | 33 ++++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java') 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 b2cbee95a1..aa3a0dc8de 100644 --- a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java +++ b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java @@ -61,6 +61,7 @@ import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ForkJoinPool; @@ -1875,8 +1876,8 @@ public final class ParallelEvaluator implements Evaluator { private List getChildrenErrorsForCycle(Iterable children) { List allErrors = new ArrayList<>(); boolean foundCycle = false; - for (SkyKey child : children) { - ErrorInfo errorInfo = getAndCheckDone(child).getErrorInfo(); + for (NodeEntry childNode : getAndCheckDoneBatch(children).values()) { + ErrorInfo errorInfo = childNode.getErrorInfo(); if (errorInfo != null) { foundCycle |= !Iterables.isEmpty(errorInfo.getCycleInfo()); allErrors.add(errorInfo); @@ -1895,8 +1896,11 @@ public final class ParallelEvaluator implements Evaluator { */ private List getChildrenErrors(Iterable children, SkyKey unfinishedChild) { List allErrors = new ArrayList<>(); - for (SkyKey child : children) { - ErrorInfo errorInfo = getErrorMaybe(child, /*allowUnfinished=*/child.equals(unfinishedChild)); + for (Entry childMapEntry : graph.getBatch(children).entrySet()) { + SkyKey childKey = childMapEntry.getKey(); + NodeEntry childNodeEntry = childMapEntry.getValue(); + ErrorInfo errorInfo = getErrorMaybe(childKey, childNodeEntry, + /*allowUnfinished=*/childKey.equals(unfinishedChild)); if (errorInfo != null) { allErrors.add(errorInfo); } @@ -1905,12 +1909,12 @@ public final class ParallelEvaluator implements Evaluator { } @Nullable - private ErrorInfo getErrorMaybe(SkyKey key, boolean allowUnfinished) { + private ErrorInfo getErrorMaybe(SkyKey key, NodeEntry childNodeEntry, boolean allowUnfinished) { + Preconditions.checkNotNull(childNodeEntry, key); if (!allowUnfinished) { - return getAndCheckDone(key).getErrorInfo(); + return checkDone(key, childNodeEntry).getErrorInfo(); } - NodeEntry entry = Preconditions.checkNotNull(graph.get(key), key); - return entry.isDone() ? entry.getErrorInfo() : null; + return childNodeEntry.isDone() ? childNodeEntry.getErrorInfo() : null; } /** @@ -1980,12 +1984,23 @@ public final class ParallelEvaluator implements Evaluator { } private NodeEntry getAndCheckDone(SkyKey key) { - NodeEntry entry = graph.get(key); + return checkDone(key, graph.get(key)); + } + + private static NodeEntry checkDone(SkyKey key, NodeEntry entry) { Preconditions.checkNotNull(entry, key); Preconditions.checkState(entry.isDone(), "%s %s", key, entry); return entry; } + private Map getAndCheckDoneBatch(Iterable keys) { + Map nodes = graph.getBatch(keys); + for (Map.Entry nodeEntryMapEntry : nodes.entrySet()) { + checkDone(nodeEntryMapEntry.getKey(), nodeEntryMapEntry.getValue()); + } + return nodes; + } + private static final SkyValue NULL_MARKER = new SkyValue() {}; private SkyValue maybeGetValueFromError( -- cgit v1.2.3