diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java index 180df4aa08f2d4..ad69283bb6e1d3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java @@ -381,21 +381,27 @@ private static FileInfo lookUpFileInfo( if (env.valuesMissing()) { return null; } - return toFileInfo(fileValue, env, traversal.root().asPath(), syscallCache); + return toFileInfo(fileValue, env, traversal.root().asPath(), traversal, syscallCache); } } @Nullable private static FileInfo toFileInfo( - FileValue fileValue, Environment env, Path path, SyscallCache syscallCache) + FileValue fileValue, + Environment env, + Path path, + TraversalRequest traversal, + SyscallCache syscallCache) throws IOException, InterruptedException { if (fileValue.unboundedAncestorSymlinkExpansionChain() != null) { - SkyKey uniquenessKey = - FileSymlinkInfiniteExpansionUniquenessFunction.key( - fileValue.unboundedAncestorSymlinkExpansionChain()); - env.getValue(uniquenessKey); - if (env.valuesMissing()) { - return null; + if (traversal.reportInfiniteSymlinkExpansionErrors()) { + SkyKey uniquenessKey = + FileSymlinkInfiniteExpansionUniquenessFunction.key( + fileValue.unboundedAncestorSymlinkExpansionChain()); + env.getValue(uniquenessKey); + if (env.valuesMissing()) { + return null; + } } throw new FileSymlinkInfiniteExpansionException( @@ -717,7 +723,8 @@ private ImmutableList traverseSourceChildren( if (key instanceof FileValue.Key) { FileValue.Key fileKey = (FileValue.Key) key; FileInfo fileInfo = - toFileInfo((FileValue) value, env, fileKey.argument().asPath(), syscallCache); + toFileInfo( + (FileValue) value, env, fileKey.argument().asPath(), traversal, syscallCache); if (fileInfo != null) { childValues.add(resultForFileRoot(fileKey.argument(), fileInfo)); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TraversalRequest.java b/src/main/java/com/google/devtools/build/lib/skyframe/TraversalRequest.java index 2073b72e7f00ce..78a6880c965dbe 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TraversalRequest.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TraversalRequest.java @@ -67,6 +67,15 @@ public abstract class TraversalRequest implements SkyKey { */ protected abstract String errorInfo(); + /** + * Determines whether events for {@linkplain + * com.google.devtools.build.lib.io.FileSymlinkInfiniteExpansionException infinite symlink + * expansion errors} encountered during the traversal should be emitted. + */ + protected boolean reportInfiniteSymlinkExpansionErrors() { + return true; + } + /** * Creates a new traversal request identical to this one except with the given new values for * {@link #root} and {@link #skipTestingForSubpackage}. @@ -109,6 +118,7 @@ public final String toString() { .add("strictOutputFiles", strictOutputFiles()) .add("skipTestingForSubpackage", skipTestingForSubpackage()) .add("errorInfo", errorInfo()) + .add("reportInfiniteSymlinkExpansionErrors", reportInfiniteSymlinkExpansionErrors()) .toString(); } }