Fix a minor bug where RRBuildFilesVisitor wasn't using an
inter-visitation-batch Uniquifier for the results.
Because SkyQueryEnvironment#BatchStreamedCallback (the [2nd-]most outer
Callback) internally uses a Uniquifier, this is merely a minor performance bug,
not a correctness bug.
RELNOTES: None
PiperOrigin-RevId: 234704160
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ParallelSkyQueryUtils.java b/src/main/java/com/google/devtools/build/lib/query2/ParallelSkyQueryUtils.java
index df706da..a9a0aca 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ParallelSkyQueryUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ParallelSkyQueryUtils.java
@@ -31,7 +31,6 @@
import com.google.devtools.build.lib.query2.engine.QueryExpressionContext;
import com.google.devtools.build.lib.query2.engine.QueryUtil;
import com.google.devtools.build.lib.query2.engine.QueryUtil.AggregateAllCallback;
-import com.google.devtools.build.lib.query2.engine.Uniquifier;
import com.google.devtools.build.lib.skyframe.SkyFunctions;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyKey;
@@ -54,7 +53,7 @@
public class ParallelSkyQueryUtils {
/** The maximum number of keys to visit at once. */
- @VisibleForTesting static final int VISIT_BATCH_SIZE = 10000;
+ @VisibleForTesting public static final int VISIT_BATCH_SIZE = 10000;
private ParallelSkyQueryUtils() {
}
@@ -167,11 +166,11 @@
Collection<PathFragment> fileIdentifiers,
QueryExpressionContext<Target> context,
Callback<Target> callback) throws QueryException, InterruptedException {
- Uniquifier<SkyKey> keyUniquifier = env.createSkyKeyUniquifier();
RBuildFilesVisitor visitor =
new RBuildFilesVisitor(
env,
- keyUniquifier,
+ /*visitUniquifier=*/ env.createSkyKeyUniquifier(),
+ /*resultUniquifier=*/ env.createSkyKeyUniquifier(),
context,
callback,
/*rdepFilter=*/ rdep ->
diff --git a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesVisitor.java b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesVisitor.java
index e1d9f87..7f89545 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesVisitor.java
@@ -39,29 +39,39 @@
private static final SkyKey EXTERNAL_PACKAGE_KEY =
PackageValue.key(LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER);
private final SkyQueryEnvironment env;
+ private final Uniquifier<SkyKey> resultUniquifier;
private final QueryExpressionContext<Target> context;
private final Function<SkyKey, Boolean> rdepFilter;
public RBuildFilesVisitor(
SkyQueryEnvironment env,
- Uniquifier<SkyKey> uniquifier,
+ Uniquifier<SkyKey> visitUniquifier,
+ Uniquifier<SkyKey> resultUniquifier,
QueryExpressionContext<Target> context,
Callback<Target> callback,
Function<SkyKey, Boolean> rdepFilter) {
- super(uniquifier, callback, ParallelSkyQueryUtils.VISIT_BATCH_SIZE, PROCESS_RESULTS_BATCH_SIZE);
+ super(
+ visitUniquifier,
+ callback,
+ ParallelSkyQueryUtils.VISIT_BATCH_SIZE,
+ PROCESS_RESULTS_BATCH_SIZE);
this.env = env;
+ this.resultUniquifier = resultUniquifier;
this.context = context;
this.rdepFilter = rdepFilter;
}
@Override
- protected Visit getVisitResult(Iterable<SkyKey> values) throws InterruptedException {
+ protected Visit getVisitResult(Iterable<SkyKey> values)
+ throws QueryException, InterruptedException {
Collection<Iterable<SkyKey>> reverseDeps = env.graph.getReverseDeps(values).values();
Set<SkyKey> keysToUseForResult = CompactHashSet.create();
Set<SkyKey> keysToVisitNext = CompactHashSet.create();
for (SkyKey rdep : Iterables.concat(reverseDeps)) {
if (rdep.functionName().equals(SkyFunctions.PACKAGE)) {
- keysToUseForResult.add(rdep);
+ if (resultUniquifier.unique(rdep)) {
+ keysToUseForResult.add(rdep);
+ }
// Every package has a dep on the external package, so we need to include those edges too.
if (rdep.equals(EXTERNAL_PACKAGE_KEY)) {
keysToVisitNext.add(rdep);