Update error handling for absolute symlink violations when evaluating a fileset. PiperOrigin-RevId: 687311869 Change-Id: I2f481f7a702494691093bf91905fbb28f309a482
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java index d703084..8a24daf 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
@@ -375,6 +375,12 @@ String.format( "Generated conflict in source tree: %s %s %s", artifact, fileValue, request), e); + // TODO: b/7075837 - This code path is possible when BAZEL_TRACK_SOURCE_DIRECTORIES is set. + case DETAILED_IO_EXCEPTION: + throw new IllegalStateException( + String.format( + "%s: %s %s %s", e.getCause().getMessage(), artifact, fileValue, request), + e); } throw new IllegalStateException("Can't get here", e); }
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 6aec2b6..1a8cd4e 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
@@ -47,6 +47,7 @@ import com.google.devtools.build.lib.skyframe.serialization.VisibleForSerialization; import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant; import com.google.devtools.build.lib.util.Fingerprint; +import com.google.devtools.build.lib.vfs.DetailedIOException; import com.google.devtools.build.lib.vfs.Dirent; import com.google.devtools.build.lib.vfs.FileStatus; import com.google.devtools.build.lib.vfs.Path; @@ -109,13 +110,22 @@ /** The filesystem told us inconsistent information. */ INCONSISTENT_FILESYSTEM, + + /** The filesystem threw a {@link DetailedIOException}. */ + DETAILED_IO_EXCEPTION, } private final RecursiveFilesystemTraversalException.Type type; + RecursiveFilesystemTraversalException(String message, DetailedIOException cause) { + super(message, cause); + this.type = RecursiveFilesystemTraversalException.Type.DETAILED_IO_EXCEPTION; + } + RecursiveFilesystemTraversalException( String message, RecursiveFilesystemTraversalException.Type type) { super(message); + checkArgument(type != Type.DETAILED_IO_EXCEPTION); this.type = type; } @@ -250,6 +260,12 @@ String.format( "Error while traversing directory %s: %s", traversal.root().getRelativePart(), e.getMessage()); + + if (e instanceof DetailedIOException detailedException) { + throw new RecursiveFilesystemTraversalFunctionException( + new RecursiveFilesystemTraversalException(message, detailedException)); + } + // Trying to stat the starting point of this root may have failed with a symlink cycle or // trying to get a package lookup value may have failed due to a symlink cycle. RecursiveFilesystemTraversalException.Type exceptionType =