Change WalkableGraphFactory#prepareAndGet to take multiple SkyKeys as graph roots
It also changes a few accessors of utility methods in Skyframe library. It
refactors the QueryExpressionMapper to use a general QueryExpressionVisitor.
RELNOTES: None
PiperOrigin-RevId: 165534908
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 0121e00..383a28f 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
@@ -163,7 +163,7 @@
private GraphBackedRecursivePackageProvider graphBackedRecursivePackageProvider;
private ListeningExecutorService executor;
private RecursivePackageProviderBackedTargetPatternResolver resolver;
- private final SkyKey universeKey;
+ protected final SkyKey universeKey;
private final ImmutableList<TargetPatternKey> universeTargetPatternKeys;
public SkyQueryEnvironment(
@@ -239,17 +239,27 @@
}
}
- private void beforeEvaluateQuery() throws InterruptedException {
- if (graph == null || !graphFactory.isUpToDate(universeKey)) {
+ /** Gets roots of graph which contains all nodes needed to evaluate {@code expr}. */
+ protected Set<SkyKey> getGraphRootsFromExpression(QueryExpression expr)
+ throws QueryException, InterruptedException {
+ return ImmutableSet.of(universeKey);
+ }
+
+ private void beforeEvaluateQuery(QueryExpression expr)
+ throws QueryException, InterruptedException {
+ Set<SkyKey> roots = getGraphRootsFromExpression(expr);
+ if (graph == null || !graphFactory.isUpToDate(roots)) {
// If this environment is uninitialized or the graph factory needs to evaluate, do so. We
// assume here that this environment cannot be initialized-but-stale if the factory is up
// to date.
EvaluationResult<SkyValue> result;
try (AutoProfiler p = AutoProfiler.logged("evaluation and walkable graph", LOG)) {
- result =
- graphFactory.prepareAndGet(universeKey, loadingPhaseThreads, universeEvalEventHandler);
+ result = graphFactory.prepareAndGet(roots, loadingPhaseThreads, universeEvalEventHandler);
}
- checkEvaluationResult(result);
+
+ if (roots.size() == 1 && Iterables.getOnlyElement(roots).equals(universeKey)) {
+ checkEvaluationResult(result);
+ }
packageSemaphore = makeFreshPackageMultisetSemaphore();
graph = result.getWalkableGraph();
@@ -335,7 +345,7 @@
}
@Override
- public QueryExpression map(FunctionExpression functionExpression) {
+ public QueryExpression visit(FunctionExpression functionExpression) {
if (functionExpression.getFunction().getName().equals(new RdepsFunction().getName())) {
List<Argument> args = functionExpression.getArgs();
QueryExpression universeExpression = args.get(0).getExpression();
@@ -349,14 +359,14 @@
}
}
}
- return super.map(functionExpression);
+ return super.visit(functionExpression);
}
}
@Override
public final QueryExpression transformParsedQuery(QueryExpression queryExpression) {
QueryExpressionMapper mapper = getQueryExpressionMapper();
- QueryExpression transformedQueryExpression = queryExpression.getMapped(mapper);
+ QueryExpression transformedQueryExpression = queryExpression.accept(mapper);
LOG.info(String.format(
"transformed query [%s] to [%s]",
Ascii.truncate(
@@ -406,7 +416,7 @@
public QueryEvalResult evaluateQuery(
QueryExpression expr, ThreadSafeOutputFormatterCallback<Target> callback)
throws QueryException, InterruptedException, IOException {
- beforeEvaluateQuery();
+ beforeEvaluateQuery(expr);
// SkyQueryEnvironment batches callback invocations using a BatchStreamedCallback, created here
// so that there's one per top-level evaluateQuery call. The batch size is large enough that
@@ -1153,7 +1163,7 @@
implements InterruptibleSupplier<ImmutableSet<PathFragment>> {
private final WalkableGraph graph;
- BlacklistSupplier(WalkableGraph graph) {
+ private BlacklistSupplier(WalkableGraph graph) {
this.graph = graph;
}