Restrict the type of exception that can be thrown during target pattern parsing (and general target-oriented graph visitation) to QueryException. In practice, this is the only exception that can be thrown, but that fact is extremely non-obvious. We make it obvious by restricting the type of Exception that can be thrown to QueryExceptionMarkerInterface, an interface that is only non-trivially implemented by QueryException. PiperOrigin-RevId: 410355114
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD index e414ea00..9861a47 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
@@ -23,7 +23,9 @@ exports = [":cmdline-primitives"], deps = [ ":LabelValidator", + ":batch_callback", ":cmdline-primitives", + ":query_exception_marker_interface", "//src/main/java/com/google/devtools/build/docgen/annot", "//src/main/java/com/google/devtools/build/lib/actions:commandline_item", "//src/main/java/com/google/devtools/build/lib/concurrent", @@ -72,6 +74,31 @@ ], ) +java_library( + name = "parallel_visitor", + srcs = ["ParallelVisitor.java"], + deps = [ + ":batch_callback", + ":query_exception_marker_interface", + "//src/main/java/com/google/devtools/build/lib/concurrent", + "//third_party:guava", + ], +) + +java_library( + name = "batch_callback", + srcs = ["BatchCallback.java"], + deps = [ + ":query_exception_marker_interface", + "//src/main/java/com/google/devtools/build/lib/concurrent:thread_safety", + ], +) + +java_library( + name = "query_exception_marker_interface", + srcs = ["QueryExceptionMarkerInterface.java"], +) + # LabelValidator provides validation of Bazel build labels. # This is a public API. # TODO(adonovan): unsplit the lib.cmdline Java package by moving this logic to a subpackage.
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/BatchCallback.java b/src/main/java/com/google/devtools/build/lib/cmdline/BatchCallback.java similarity index 71% rename from src/main/java/com/google/devtools/build/lib/concurrent/BatchCallback.java rename to src/main/java/com/google/devtools/build/lib/cmdline/BatchCallback.java index 7fdf043..1144b02 100644 --- a/src/main/java/com/google/devtools/build/lib/concurrent/BatchCallback.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BatchCallback.java
@@ -11,17 +11,17 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.concurrent; +package com.google.devtools.build.lib.cmdline; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; /** - * Callback to be invoked when part of a result has been computed. Allows a client interested in - * the result to process it as it is computed, for instance by streaming it, if it is too big to - * fit in memory. + * Callback to be invoked when part of a result has been computed. Allows a client interested in the + * result to process it as it is computed, for instance by streaming it, if it is too big to fit in + * memory. */ @ThreadSafe -public interface BatchCallback<T, E extends Exception> { +public interface BatchCallback<T, E extends Exception & QueryExceptionMarkerInterface> { /** * Called when part of a result has been computed. * @@ -33,8 +33,12 @@ */ void process(Iterable<T> partialResult) throws E, InterruptedException; - /** {@link BatchCallback} that does precisely nothing. */ - class NullCallback<T> implements BatchCallback<T, RuntimeException> { + /** {@link BatchCallback} that doesn't throw. */ + interface SafeBatchCallback<T> + extends BatchCallback<T, QueryExceptionMarkerInterface.MarkerRuntimeException> {} + + /** {@link SafeBatchCallback} that does precisely nothing. */ + class NullCallback<T> implements SafeBatchCallback<T> { private static final NullCallback<Object> INSTANCE = new NullCallback<>(); @Override
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/ParallelVisitor.java b/src/main/java/com/google/devtools/build/lib/cmdline/ParallelVisitor.java similarity index 97% rename from src/main/java/com/google/devtools/build/lib/concurrent/ParallelVisitor.java rename to src/main/java/com/google/devtools/build/lib/cmdline/ParallelVisitor.java index 64d2589..78ac151 100644 --- a/src/main/java/com/google/devtools/build/lib/concurrent/ParallelVisitor.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/ParallelVisitor.java
@@ -11,12 +11,15 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.concurrent; +package com.google.devtools.build.lib.cmdline; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.concurrent.AbstractQueueVisitor; +import com.google.devtools.build.lib.concurrent.ErrorClassifier; +import com.google.devtools.build.lib.concurrent.QuiescingExecutor; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import java.util.ArrayList; import java.util.Collection; @@ -47,7 +50,7 @@ VisitKeyT, OutputKeyT, OutputResultT, - ExceptionT extends Exception, + ExceptionT extends Exception & QueryExceptionMarkerInterface, CallbackT extends BatchCallback<OutputResultT, ExceptionT>> { protected final CallbackT callback; protected final Class<ExceptionT> exceptionClass; @@ -142,7 +145,7 @@ VisitKeyT, OutputKeyT, OutputResultT, - ExceptionT extends Exception, + ExceptionT extends Exception & QueryExceptionMarkerInterface, CallbackT extends BatchCallback<OutputResultT, ExceptionT>> { ParallelVisitor<InputT, VisitKeyT, OutputKeyT, OutputResultT, ExceptionT, CallbackT> create(); } @@ -166,12 +169,6 @@ protected abstract Iterable<OutputResultT> outputKeysToOutputValues( Iterable<OutputKeyT> targetKeys) throws ExceptionT, InterruptedException; - /** - * Suitable exception type to use with {@link ParallelVisitor} when no checked exception is - * appropriate. - */ - public static final class UnusedException extends RuntimeException {} - /** An object to hold keys to visit and keys ready for processing. */ protected final class Visit { private final Iterable<OutputKeyT> keysToUseForResult;
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/QueryExceptionMarkerInterface.java b/src/main/java/com/google/devtools/build/lib/cmdline/QueryExceptionMarkerInterface.java new file mode 100644 index 0000000..c988f14 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/cmdline/QueryExceptionMarkerInterface.java
@@ -0,0 +1,39 @@ +// Copyright 2021 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.cmdline; + +/** + * Marker interface indicating either a {@link + * com.google.devtools.build.lib.query2.engine.QueryException} or a {@link MarkerRuntimeException}. + * Used with a generic type to indicate that a method can optionally throw {@code QueryException} if + * the caller passes {@code QueryException.class} as a parameter to the method. + * + * <p>The only outside implementation of this interface is {@link + * com.google.devtools.build.lib.query2.engine.QueryException}. Do not implement or extend! + * + * <p>Used to narrow a generic type like {@code E extends Exception} to {@code E extends Exception & + * QueryExceptionMarkerInterface}, guaranteeing that the method will only throw {@link + * com.google.devtools.build.lib.query2.engine.QueryException} if any exception of type E is thrown. + * Because {@code E} will appear in the "throws" clause of a method, it must extend {@link + * Exception}. + */ +@SuppressWarnings("InterfaceWithOnlyStatics") +public interface QueryExceptionMarkerInterface { + /** + * Marker class indicating that a given method does not throw QueryException. Pass {@code + * MarkerRuntimeException.class} as a parameter. + */ + class MarkerRuntimeException extends RuntimeException implements QueryExceptionMarkerInterface {} +}
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java index 492ebad..ba41c10 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
@@ -29,7 +29,6 @@ import com.google.common.util.concurrent.ListeningExecutorService; import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException; import com.google.devtools.build.lib.cmdline.LabelValidator.PackageAndTarget; -import com.google.devtools.build.lib.concurrent.BatchCallback; import com.google.devtools.build.lib.server.FailureDetails.TargetPatterns; import com.google.devtools.build.lib.server.FailureDetails.TargetPatterns.Code; import com.google.devtools.build.lib.supplier.InterruptibleSupplier; @@ -146,7 +145,7 @@ * excludedSubdirectories} is nonempty and this pattern does not have type {@code * Type.TARGETS_BELOW_DIRECTORY}. */ - public abstract <T, E extends Exception> void eval( + public abstract <T, E extends Exception & QueryExceptionMarkerInterface> void eval( TargetPatternResolver<T> resolver, InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, ImmutableSet<PathFragment> excludedSubdirectories, @@ -162,12 +161,13 @@ * ExecutionException}, the cause will be an instance of either {@link TargetParsingException} or * the given {@code exceptionClass}. */ - public final <T, E extends Exception> ListenableFuture<Void> evalAdaptedForAsync( - TargetPatternResolver<T> resolver, - InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, - ImmutableSet<PathFragment> excludedSubdirectories, - BatchCallback<T, E> callback, - Class<E> exceptionClass) { + public final <T, E extends Exception & QueryExceptionMarkerInterface> + ListenableFuture<Void> evalAdaptedForAsync( + TargetPatternResolver<T> resolver, + InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, + ImmutableSet<PathFragment> excludedSubdirectories, + BatchCallback<T, E> callback, + Class<E> exceptionClass) { try { eval(resolver, ignoredSubdirectories, excludedSubdirectories, callback, exceptionClass); return Futures.immediateFuture(null); @@ -191,7 +191,7 @@ * ExecutionException}, the cause will be an instance of either {@link TargetParsingException} or * the given {@code exceptionClass}. */ - public <T, E extends Exception> ListenableFuture<Void> evalAsync( + public <T, E extends Exception & QueryExceptionMarkerInterface> ListenableFuture<Void> evalAsync( TargetPatternResolver<T> resolver, InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, ImmutableSet<PathFragment> excludedSubdirectories, @@ -258,7 +258,7 @@ } @Override - public <T, E extends Exception> void eval( + public <T, E extends Exception & QueryExceptionMarkerInterface> void eval( TargetPatternResolver<T> resolver, InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, ImmutableSet<PathFragment> excludedSubdirectories, @@ -320,7 +320,7 @@ } @Override - public <T, E extends Exception> void eval( + public <T, E extends Exception & QueryExceptionMarkerInterface> void eval( TargetPatternResolver<T> resolver, InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, ImmutableSet<PathFragment> excludedSubdirectories, @@ -418,7 +418,7 @@ } @Override - public <T, E extends Exception> void eval( + public <T, E extends Exception & QueryExceptionMarkerInterface> void eval( TargetPatternResolver<T> resolver, InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, ImmutableSet<PathFragment> excludedSubdirectories, @@ -544,7 +544,7 @@ } @Override - public <T, E extends Exception> void eval( + public <T, E extends Exception & QueryExceptionMarkerInterface> void eval( TargetPatternResolver<T> resolver, InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, ImmutableSet<PathFragment> excludedSubdirectories, @@ -573,13 +573,14 @@ } @Override - public <T, E extends Exception> ListenableFuture<Void> evalAsync( - TargetPatternResolver<T> resolver, - InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, - ImmutableSet<PathFragment> excludedSubdirectories, - BatchCallback<T, E> callback, - Class<E> exceptionClass, - ListeningExecutorService executor) { + public <T, E extends Exception & QueryExceptionMarkerInterface> + ListenableFuture<Void> evalAsync( + TargetPatternResolver<T> resolver, + InterruptibleSupplier<ImmutableSet<PathFragment>> ignoredSubdirectories, + ImmutableSet<PathFragment> excludedSubdirectories, + BatchCallback<T, E> callback, + Class<E> exceptionClass, + ListeningExecutorService executor) { Preconditions.checkState( !excludedSubdirectories.contains(directory.getPackageFragment()), "Fully excluded target pattern %s should have already been filtered out (%s)",
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java index 639f6b3..f1c81df 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java
@@ -14,11 +14,13 @@ package com.google.devtools.build.lib.cmdline; +import static com.google.common.util.concurrent.Futures.immediateCancelledFuture; +import static com.google.common.util.concurrent.Futures.immediateFailedFuture; +import static com.google.common.util.concurrent.Futures.immediateVoidFuture; + import com.google.common.collect.ImmutableSet; -import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.devtools.build.lib.concurrent.BatchCallback; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.Collection; @@ -88,32 +90,34 @@ * @param exceptionClass The class type of the parameterized exception. * @throws TargetParsingException under implementation-specific failure conditions */ - public abstract <E extends Exception> void findTargetsBeneathDirectory( - RepositoryName repository, - String originalPattern, - String directory, - boolean rulesOnly, - ImmutableSet<PathFragment> forbiddenSubdirectories, - ImmutableSet<PathFragment> excludedSubdirectories, - BatchCallback<T, E> callback, - Class<E> exceptionClass) - throws TargetParsingException, E, InterruptedException; + public abstract <E extends Exception & QueryExceptionMarkerInterface> + void findTargetsBeneathDirectory( + RepositoryName repository, + String originalPattern, + String directory, + boolean rulesOnly, + ImmutableSet<PathFragment> forbiddenSubdirectories, + ImmutableSet<PathFragment> excludedSubdirectories, + BatchCallback<T, E> callback, + Class<E> exceptionClass) + throws TargetParsingException, E, InterruptedException; /** * Async version of {@link #findTargetsBeneathDirectory} * * <p>Default implementation is synchronous. */ - public <E extends Exception> ListenableFuture<Void> findTargetsBeneathDirectoryAsync( - RepositoryName repository, - String originalPattern, - String directory, - boolean rulesOnly, - ImmutableSet<PathFragment> forbiddenSubdirectories, - ImmutableSet<PathFragment> excludedSubdirectories, - BatchCallback<T, E> callback, - Class<E> exceptionClass, - ListeningExecutorService executor) { + public <E extends Exception & QueryExceptionMarkerInterface> + ListenableFuture<Void> findTargetsBeneathDirectoryAsync( + RepositoryName repository, + String originalPattern, + String directory, + boolean rulesOnly, + ImmutableSet<PathFragment> forbiddenSubdirectories, + ImmutableSet<PathFragment> excludedSubdirectories, + BatchCallback<T, E> callback, + Class<E> exceptionClass, + ListeningExecutorService executor) { try { findTargetsBeneathDirectory( repository, @@ -124,14 +128,14 @@ excludedSubdirectories, callback, exceptionClass); - return Futures.immediateFuture(null); + return immediateVoidFuture(); } catch (TargetParsingException e) { - return Futures.immediateFailedFuture(e); + return immediateFailedFuture(e); } catch (InterruptedException e) { - return Futures.immediateCancelledFuture(); + return immediateCancelledFuture(); } catch (Exception e) { if (exceptionClass.isInstance(e)) { - return Futures.immediateFailedFuture(e); + return immediateFailedFuture(e); } throw new IllegalStateException(e); }
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/BUILD b/src/main/java/com/google/devtools/build/lib/concurrent/BUILD index b370069..e5a8e3a 100644 --- a/src/main/java/com/google/devtools/build/lib/concurrent/BUILD +++ b/src/main/java/com/google/devtools/build/lib/concurrent/BUILD
@@ -18,3 +18,8 @@ "//third_party:jsr305", ], ) + +java_library( + name = "thread_safety", + srcs = ["ThreadSafety.java"], +)
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/BUILD b/src/main/java/com/google/devtools/build/lib/pkgcache/BUILD index cf2dee9..37f7e7e 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/BUILD +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/BUILD
@@ -27,6 +27,7 @@ "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto", "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/cmdline:LabelValidator", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", "//src/main/java/com/google/devtools/build/lib/collect/compacthashset", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/events",
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java index 4df9df5..94de4cd 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java
@@ -14,11 +14,10 @@ package com.google.devtools.build.lib.pkgcache; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; @@ -55,7 +54,7 @@ * SkyKey}s that are created during the traversal, instead filtered out later */ void streamPackagesUnderDirectory( - BatchCallback<PackageIdentifier, UnusedException> results, + SafeBatchCallback<PackageIdentifier> results, ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, @@ -121,7 +120,7 @@ @Override public void streamPackagesUnderDirectory( - BatchCallback<PackageIdentifier, UnusedException> results, + SafeBatchCallback<PackageIdentifier> results, ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory,
diff --git a/src/main/java/com/google/devtools/build/lib/query2/AbstractSkyKeyParallelVisitor.java b/src/main/java/com/google/devtools/build/lib/query2/AbstractSkyKeyParallelVisitor.java index 5138a82..8fba9b1 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/AbstractSkyKeyParallelVisitor.java +++ b/src/main/java/com/google/devtools/build/lib/query2/AbstractSkyKeyParallelVisitor.java
@@ -13,7 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.query2; -import com.google.devtools.build.lib.concurrent.ParallelVisitor; +import com.google.devtools.build.lib.cmdline.ParallelVisitor; import com.google.devtools.build.lib.query2.ParallelVisitorUtils.ParallelQueryVisitor; import com.google.devtools.build.lib.query2.engine.Callback; import com.google.devtools.build.lib.query2.engine.QueryException;
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD index b6aa812..ceb4b39 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/BUILD +++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -55,6 +55,7 @@ "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto", "//src/main/java/com/google/devtools/build/lib/causes", "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/cmdline:parallel_visitor", "//src/main/java/com/google/devtools/build/lib/collect/compacthashset", "//src/main/java/com/google/devtools/build/lib/collect/nestedset", "//src/main/java/com/google/devtools/build/lib/concurrent",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ParallelVisitorUtils.java b/src/main/java/com/google/devtools/build/lib/query2/ParallelVisitorUtils.java index c007723..038232b 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/ParallelVisitorUtils.java +++ b/src/main/java/com/google/devtools/build/lib/query2/ParallelVisitorUtils.java
@@ -14,9 +14,9 @@ package com.google.devtools.build.lib.query2; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.devtools.build.lib.cmdline.ParallelVisitor; +import com.google.devtools.build.lib.cmdline.ParallelVisitor.Factory; import com.google.devtools.build.lib.concurrent.BlockingStack; -import com.google.devtools.build.lib.concurrent.ParallelVisitor; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.Factory; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.query2.engine.Callback; import com.google.devtools.build.lib.query2.engine.QueryException;
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 c9247a8..b706e2a 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
@@ -40,6 +40,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.cmdline.ParallelVisitor.VisitTaskStatusCallback; import com.google.devtools.build.lib.cmdline.SignedTargetPattern; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.cmdline.TargetPattern; @@ -47,7 +48,6 @@ import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet; import com.google.devtools.build.lib.concurrent.BlockingStack; import com.google.devtools.build.lib.concurrent.MultisetSemaphore; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.VisitTaskStatusCallback; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.DelegatingEventHandler; import com.google.devtools.build.lib.events.Event;
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/BUILD b/src/main/java/com/google/devtools/build/lib/query2/engine/BUILD index ce3b371..c70b8e0 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/engine/BUILD +++ b/src/main/java/com/google/devtools/build/lib/query2/engine/BUILD
@@ -13,6 +13,8 @@ srcs = glob(["*.java"]), deps = [ "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", + "//src/main/java/com/google/devtools/build/lib/cmdline:query_exception_marker_interface", "//src/main/java/com/google/devtools/build/lib/collect/compacthashset", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/graph",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/Callback.java b/src/main/java/com/google/devtools/build/lib/query2/engine/Callback.java index cf4524f..0beb457 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/engine/Callback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/engine/Callback.java
@@ -13,7 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.query2.engine; -import com.google.devtools.build.lib.concurrent.BatchCallback; +import com.google.devtools.build.lib.cmdline.BatchCallback; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; /**
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java index 162c5f1..68ffbf0 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java +++ b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java
@@ -14,13 +14,14 @@ package com.google.devtools.build.lib.query2.engine; import com.google.common.base.Preconditions; +import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; import com.google.devtools.build.lib.server.FailureDetails.ActionQuery; import com.google.devtools.build.lib.server.FailureDetails.ConfigurableQuery; import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; import com.google.devtools.build.lib.server.FailureDetails.Query; /** Exception indicating a failure in Blaze query, aquery, or cquery. */ -public class QueryException extends Exception { +public class QueryException extends Exception implements QueryExceptionMarkerInterface { /** Returns a better error message for the query. */ static String describeFailedQuery(QueryException e, QueryExpression toplevel) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD index 30cc36f..325bf53 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -286,6 +286,8 @@ "//src/main/java/com/google/devtools/build/lib/causes", "//src/main/java/com/google/devtools/build/lib/clock", "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", + "//src/main/java/com/google/devtools/build/lib/cmdline:query_exception_marker_interface", "//src/main/java/com/google/devtools/build/lib/collect/compacthashset", "//src/main/java/com/google/devtools/build/lib/collect/nestedset", "//src/main/java/com/google/devtools/build/lib/concurrent", @@ -1502,6 +1504,7 @@ ":package_value", ":root_package_extractor", "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/io:inconsistent_filesystem_exception", @@ -1685,6 +1688,7 @@ ], deps = [ "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", "//src/main/java/com/google/devtools/build/lib/concurrent", "//third_party:guava", "//third_party:jsr305", @@ -2096,6 +2100,8 @@ deps = [ ":package_identifier_batching_callback", "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", + "//src/main/java/com/google/devtools/build/lib/cmdline:query_exception_marker_interface", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/packages", @@ -2177,7 +2183,7 @@ ":recursive_pkg_value", ":root_package_extractor", "//src/main/java/com/google/devtools/build/lib/cmdline", - "//src/main/java/com/google/devtools/build/lib/concurrent", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/query2/engine", "//src/main/java/com/google/devtools/build/lib/vfs", @@ -2225,7 +2231,7 @@ srcs = ["RootPackageExtractor.java"], deps = [ "//src/main/java/com/google/devtools/build/lib/cmdline", - "//src/main/java/com/google/devtools/build/lib/concurrent", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/query2/engine", "//src/main/java/com/google/devtools/build/lib/vfs", @@ -2656,7 +2662,9 @@ ":recursive_package_provider_backed_target_pattern_resolver", ":root_package_extractor", "//src/main/java/com/google/devtools/build/lib/cmdline", - "//src/main/java/com/google/devtools/build/lib/concurrent", + "//src/main/java/com/google/devtools/build/lib/cmdline:batch_callback", + "//src/main/java/com/google/devtools/build/lib/cmdline:parallel_visitor", + "//src/main/java/com/google/devtools/build/lib/cmdline:query_exception_marker_interface", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java index 9c24dfb..cd3dcd3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
@@ -18,10 +18,9 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.io.InconsistentFilesystemException; @@ -142,7 +141,7 @@ @Override public void streamPackagesUnderDirectory( - BatchCallback<PackageIdentifier, UnusedException> results, + SafeBatchCallback<PackageIdentifier> results, ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java index fec12ce..0f9fdc1 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
@@ -22,12 +22,11 @@ import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; import com.google.common.flogger.GoogleLogger; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.cmdline.TargetPattern; import com.google.devtools.build.lib.cmdline.TargetPattern.TargetsBelowDirectory; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; @@ -59,8 +58,8 @@ * Helper interface for clients of GraphBackedRecursivePackageProvider to indicate what universe * packages should be resolved in. * - * <p>Client can either specify a fixed set of target patterns (using {@link #of()}), or specify - * that all targets are valid (using {@link #all()}). + * <p>Client can either specify a fixed set of target patterns (using {@link #of}), or specify + * that all targets are valid (using {@link #all}). */ public interface UniverseTargetPattern { ImmutableList<TargetPattern> patterns(); @@ -240,7 +239,7 @@ @Override public void streamPackagesUnderDirectory( - BatchCallback<PackageIdentifier, UnusedException> results, + SafeBatchCallback<PackageIdentifier> results, ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageIdentifierBatchingCallback.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageIdentifierBatchingCallback.java index daaac76..2bf7e9f1 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageIdentifierBatchingCallback.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageIdentifierBatchingCallback.java
@@ -13,9 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.PackageIdentifier; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; /** @@ -28,12 +27,12 @@ */ @ThreadSafe public interface PackageIdentifierBatchingCallback - extends BatchCallback<PackageIdentifier, UnusedException>, AutoCloseable { + extends SafeBatchCallback<PackageIdentifier>, AutoCloseable { void close() throws InterruptedException; /** Factory for {@link PackageIdentifierBatchingCallback}. */ interface Factory { PackageIdentifierBatchingCallback create( - BatchCallback<PackageIdentifier, UnusedException> batchResults, int maxBatchSize); + SafeBatchCallback<PackageIdentifier> batchResults, int maxBatchSize); } }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java index b72f383..be7986d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
@@ -16,15 +16,16 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.BatchCallback; +import com.google.devtools.build.lib.cmdline.BatchCallback.NullCallback; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.cmdline.ResolvedTargets; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.cmdline.TargetPattern; import com.google.devtools.build.lib.cmdline.TargetPatternResolver; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.BatchCallback.NullCallback; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; @@ -116,7 +117,7 @@ () -> repositoryIgnoredPatterns, ImmutableSet.of(), NullCallback.instance(), - RuntimeException.class); + QueryExceptionMarkerInterface.MarkerRuntimeException.class); } catch (TargetParsingException e) { throw new PrepareDepsOfPatternFunctionException(e); } catch (MissingDepException e) { @@ -249,7 +250,7 @@ } @Override - public <E extends Exception> void findTargetsBeneathDirectory( + public <E extends Exception & QueryExceptionMarkerInterface> void findTargetsBeneathDirectory( RepositoryName repository, String originalPattern, String directory,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java index 9e52de4..e9abf1b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
@@ -24,15 +24,16 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; +import com.google.devtools.build.lib.cmdline.BatchCallback; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.cmdline.ResolvedTargets; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.cmdline.TargetPatternResolver; -import com.google.devtools.build.lib.concurrent.BatchCallback; import com.google.devtools.build.lib.concurrent.MultisetSemaphore; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; @@ -178,7 +179,7 @@ } @Override - public <E extends Exception> void findTargetsBeneathDirectory( + public <E extends Exception & QueryExceptionMarkerInterface> void findTargetsBeneathDirectory( final RepositoryName repository, final String originalPattern, String directory, @@ -206,16 +207,17 @@ } @Override - public <E extends Exception> ListenableFuture<Void> findTargetsBeneathDirectoryAsync( - RepositoryName repository, - String originalPattern, - String directory, - boolean rulesOnly, - ImmutableSet<PathFragment> forbiddenSubdirectories, - ImmutableSet<PathFragment> excludedSubdirectories, - BatchCallback<Target, E> callback, - Class<E> exceptionClass, - ListeningExecutorService executor) { + public <E extends Exception & QueryExceptionMarkerInterface> + ListenableFuture<Void> findTargetsBeneathDirectoryAsync( + RepositoryName repository, + String originalPattern, + String directory, + boolean rulesOnly, + ImmutableSet<PathFragment> forbiddenSubdirectories, + ImmutableSet<PathFragment> excludedSubdirectories, + BatchCallback<Target, E> callback, + Class<E> exceptionClass, + ListeningExecutorService executor) { return findTargetsBeneathDirectoryAsyncImpl( repository, originalPattern, @@ -227,20 +229,21 @@ executor); } - private <E extends Exception> ListenableFuture<Void> findTargetsBeneathDirectoryAsyncImpl( - RepositoryName repository, - String pattern, - String directory, - boolean rulesOnly, - ImmutableSet<PathFragment> forbiddenSubdirectories, - ImmutableSet<PathFragment> excludedSubdirectories, - BatchCallback<Target, E> callback, - ListeningExecutorService executor) { + private <E extends Exception & QueryExceptionMarkerInterface> + ListenableFuture<Void> findTargetsBeneathDirectoryAsyncImpl( + RepositoryName repository, + String pattern, + String directory, + boolean rulesOnly, + ImmutableSet<PathFragment> forbiddenSubdirectories, + ImmutableSet<PathFragment> excludedSubdirectories, + BatchCallback<Target, E> callback, + ListeningExecutorService executor) { FilteringPolicy actualPolicy = rulesOnly ? FilteringPolicies.and(FilteringPolicies.RULES_ONLY, policy) : policy; ArrayList<ListenableFuture<Void>> futures = new ArrayList<>(); - BatchCallback<PackageIdentifier, UnusedException> getPackageTargetsCallback = + SafeBatchCallback<PackageIdentifier> getPackageTargetsCallback = (pkgIdBatch) -> futures.add( executor.submit( @@ -278,7 +281,8 @@ * Task to get all matching targets in the given packages, filter them, and pass them to the * target batch callback. */ - private class GetTargetsInPackagesTask<E extends Exception> implements Callable<Void> { + private class GetTargetsInPackagesTask<E extends Exception & QueryExceptionMarkerInterface> + implements Callable<Void> { private final Iterable<PackageIdentifier> packageIdentifiers; private final String originalPattern;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java index bc0e7b5..47b27ea 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
@@ -16,10 +16,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.query2.engine.QueryException; import com.google.devtools.build.lib.server.FailureDetails.Query.Code; @@ -34,7 +33,7 @@ @Override public void streamPackagesFromRoots( - BatchCallback<PackageIdentifier, UnusedException> results, + SafeBatchCallback<PackageIdentifier> results, WalkableGraph graph, List<Root> roots, ExtendedEventHandler eventHandler,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java index d77e938..758546a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java
@@ -14,10 +14,9 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.query2.engine.QueryException; import com.google.devtools.build.lib.vfs.PathFragment; @@ -46,7 +45,7 @@ * searched exhaustively */ void streamPackagesFromRoots( - BatchCallback<PackageIdentifier, UnusedException> results, + SafeBatchCallback<PackageIdentifier> results, WalkableGraph graph, List<Root> roots, ExtendedEventHandler eventHandler,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SimplePackageIdentifierBatchingCallback.java b/src/main/java/com/google/devtools/build/lib/skyframe/SimplePackageIdentifierBatchingCallback.java index 80ce116..fe93e68 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SimplePackageIdentifierBatchingCallback.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SimplePackageIdentifierBatchingCallback.java
@@ -15,8 +15,6 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.cmdline.PackageIdentifier; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import javax.annotation.concurrent.GuardedBy; /** @@ -25,7 +23,7 @@ * smaller than the others. */ public class SimplePackageIdentifierBatchingCallback implements PackageIdentifierBatchingCallback { - private final BatchCallback<PackageIdentifier, UnusedException> batchResults; + private final SafeBatchCallback<PackageIdentifier> batchResults; private final int batchSize; @GuardedBy("this") @@ -35,7 +33,7 @@ private int bufferedPackageIds; public SimplePackageIdentifierBatchingCallback( - BatchCallback<PackageIdentifier, UnusedException> batchResults, int batchSize) { + SafeBatchCallback<PackageIdentifier> batchResults, int batchSize) { this.batchResults = batchResults; this.batchSize = batchSize; reset();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java index 081dfd9..e6437fd 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
@@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; import com.google.devtools.build.lib.cmdline.ResolvedTargets; import com.google.devtools.build.lib.cmdline.SignedTargetPattern; import com.google.devtools.build.lib.cmdline.TargetParsingException; @@ -265,7 +266,7 @@ partialResult instanceof Collection ? (Collection<Target>) partialResult : ImmutableSet.copyOf(partialResult)), - TargetParsingException.class); + QueryExceptionMarkerInterface.MarkerRuntimeException.class); return result.get(); } }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java index 4a3d93e..01bd462 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
@@ -15,12 +15,12 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; import com.google.devtools.build.lib.cmdline.ResolvedTargets; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.cmdline.TargetPattern; -import com.google.devtools.build.lib.concurrent.BatchCallback; import com.google.devtools.build.lib.concurrent.MultisetSemaphore; import com.google.devtools.build.lib.packages.OutputFile; import com.google.devtools.build.lib.packages.Target; @@ -66,30 +66,26 @@ provider, env.getListener(), patternKey.getPolicy(), - MultisetSemaphore.<PackageIdentifier>unbounded(), + MultisetSemaphore.unbounded(), SimplePackageIdentifierBatchingCallback::new); ImmutableSet<PathFragment> excludedSubdirectories = patternKey.getExcludedSubdirectories(); ResolvedTargets.Builder<Target> resolvedTargetsBuilder = ResolvedTargets.builder(); - BatchCallback<Target, RuntimeException> callback = - new BatchCallback<Target, RuntimeException>() { - @Override - public void process(Iterable<Target> partialResult) { - for (Target target : partialResult) { - // TODO(b/156899726): This will go away as soon as we remove implicit outputs from - // cc_library completely. The only - // downside to doing this is that implicit outputs won't be listed when doing - // somepackage:* for the handful of cases still on the allowlist. This is only a - // google internal problem and the scale of it is acceptable in the short term - // while cleaning up the allowlist. - if (target instanceof OutputFile - && ((OutputFile) target) - .getGeneratingRule() - .getRuleClass() - .equals("cc_library")) { - continue; - } - resolvedTargetsBuilder.add(target); + SafeBatchCallback<Target> callback = + partialResult -> { + for (Target target : partialResult) { + // TODO(b/156899726): This will go away as soon as we remove implicit outputs from + // cc_library completely. The only downside to doing this is that implicit outputs + // won't be listed when doing somepackage:* for the handful of cases still on the + // allowlist. This is only a Google-internal problem and the scale of it is + // acceptable in the short term while cleaning up the allowlist. + if (target instanceof OutputFile + && ((OutputFile) target) + .getGeneratingRule() + .getRuleClass() + .equals("cc_library")) { + continue; } + resolvedTargetsBuilder.add(target); } }; parsedPattern.eval( @@ -97,9 +93,7 @@ () -> ignoredPatterns, excludedSubdirectories, callback, - // The exception type here has to match the one on the BatchCallback. Since the callback - // defined above never throws, the exact type here is not really relevant. - RuntimeException.class); + QueryExceptionMarkerInterface.MarkerRuntimeException.class); if (provider.encounteredPackageErrors()) { resolvedTargetsBuilder.setError(); }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java index 85f5d05..978a382 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java
@@ -21,11 +21,11 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.cmdline.ParallelVisitor; +import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; import com.google.devtools.build.lib.cmdline.RepositoryName; -import com.google.devtools.build.lib.concurrent.BatchCallback; -import com.google.devtools.build.lib.concurrent.ParallelVisitor; -import com.google.devtools.build.lib.concurrent.ParallelVisitor.UnusedException; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.vfs.PathFragment; @@ -53,7 +53,7 @@ @Override public void streamPackagesFromRoots( - BatchCallback<PackageIdentifier, UnusedException> results, + SafeBatchCallback<PackageIdentifier> results, WalkableGraph graph, List<Root> roots, ExtendedEventHandler eventHandler, @@ -96,15 +96,15 @@ TraversalInfo, TraversalInfo, PackageIdentifier, - UnusedException, - BatchCallback<PackageIdentifier, UnusedException>> { + QueryExceptionMarkerInterface.MarkerRuntimeException, + SafeBatchCallback<PackageIdentifier>> { private final ExtendedEventHandler eventHandler; private final RepositoryName repository; private final WalkableGraph graph; PackageCollectingParallelVisitor( - BatchCallback<PackageIdentifier, UnusedException> callback, + SafeBatchCallback<PackageIdentifier> callback, int visitBatchSize, int processResultsBatchSize, int minPendingTasks, @@ -114,7 +114,7 @@ WalkableGraph graph) { super( callback, - UnusedException.class, + QueryExceptionMarkerInterface.MarkerRuntimeException.class, visitBatchSize, processResultsBatchSize, minPendingTasks,