From d7311e0ddaf66857d5d7f332a6fad58e0bf7becb Mon Sep 17 00:00:00 2001 From: Mark Schaller Date: Tue, 7 Jul 2015 16:36:09 +0000 Subject: Activate interleaved package and transitive target loading Hooks up the recently introduced interleaved loading functions to normal graph loading. -- MOS_MIGRATED_REVID=97679451 --- .../build/lib/query2/SkyQueryEnvironment.java | 31 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/query2') diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java index 8a6e5dc38a..d98b93314b 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java @@ -45,11 +45,14 @@ import com.google.devtools.build.lib.query2.engine.QueryException; import com.google.devtools.build.lib.query2.engine.QueryExpression; import com.google.devtools.build.lib.skyframe.GraphBackedRecursivePackageProvider; import com.google.devtools.build.lib.skyframe.PackageValue; +import com.google.devtools.build.lib.skyframe.PrepareDepsOfPatternsValue; import com.google.devtools.build.lib.skyframe.RecursivePackageProviderBackedTargetPatternResolver; import com.google.devtools.build.lib.skyframe.SkyFunctions; import com.google.devtools.build.lib.skyframe.TargetPatternValue; +import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; import com.google.devtools.build.lib.skyframe.TransitiveTargetValue; import com.google.devtools.build.lib.syntax.Label; +import com.google.devtools.build.skyframe.EvaluationResult; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -78,6 +81,8 @@ import javax.annotation.Nullable; public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment { private WalkableGraph graph; + private ImmutableList universeTargetPatternKeys; + private final BlazeTargetAccessor accessor = new BlazeTargetAccessor(this); private final int loadingPhaseThreads; private final WalkableGraphFactory graphFactory; @@ -106,7 +111,29 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment { } private void init() throws InterruptedException { - graph = graphFactory.prepareAndGet(universeScope, loadingPhaseThreads, eventHandler); + EvaluationResult result = + graphFactory.prepareAndGet(universeScope, loadingPhaseThreads, eventHandler); + graph = result.getWalkableGraph(); + Collection values = result.values(); + + // The universe query may fail if there are errors during its evaluation, e.g. because of + // cycles in the target graph. + boolean singleValueEvaluated = values.size() == 1; + boolean foundError = !result.errorMap().isEmpty(); + boolean evaluationFoundCycle = + foundError && !Iterables.isEmpty(result.getError().getCycleInfo()); + Preconditions.checkState(singleValueEvaluated || evaluationFoundCycle, + "Universe query \"%s\" unexpectedly did not result in a single value as expected (%s" + + " values in result) and it did not fail because of a cycle.%s", + universeScope, values.size(), foundError ? " Error: " + result.getError().toString() : ""); + if (singleValueEvaluated) { + PrepareDepsOfPatternsValue prepareDepsOfPatternsValue = + (PrepareDepsOfPatternsValue) Iterables.getOnlyElement(values); + universeTargetPatternKeys = prepareDepsOfPatternsValue.getTargetPatternKeys(); + } else { + // The error is because of a cycle, so keep going with the graph we managed to load. + universeTargetPatternKeys = ImmutableList.of(); + } } @Override @@ -338,7 +365,7 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment { protected Map> preloadOrThrow(QueryExpression caller, Collection patterns) throws QueryException, TargetParsingException { GraphBackedRecursivePackageProvider provider = - new GraphBackedRecursivePackageProvider(graph); + new GraphBackedRecursivePackageProvider(graph, universeTargetPatternKeys); Map> result = Maps.newHashMapWithExpectedSize(patterns.size()); for (String pattern : patterns) { SkyKey patternKey = TargetPatternValue.key(pattern, -- cgit v1.2.3