Populate DetailedExitCode for BuildFileNotFoundException errors in PackageLookupFunction. Also switch the exit code for some package loading codes to "environmental error" since they come from disk problems/concurrent changes, not source state.
PiperOrigin-RevId: 363720546
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 2136d58..3e49f95 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -1795,11 +1795,13 @@
"//src/main/java/com/google/devtools/build/lib/pkgcache",
"//src/main/java/com/google/devtools/build/lib/repository:external_package_helper",
"//src/main/java/com/google/devtools/build/lib/rules:repository/repository_directory_value",
+ "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/net/starlark/java/eval",
+ "//src/main/protobuf:failure_details_java_proto",
"//third_party:guava",
"//third_party:jsr305",
],
@@ -2143,6 +2145,7 @@
],
deps = [
":action_execution_value",
+ ":detailed_exceptions",
":directory_listing_value",
":file_symlink_exception",
":file_symlink_infinite_expansion_exception",
@@ -2164,6 +2167,7 @@
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+ "//src/main/protobuf:failure_details_java_proto",
"//third_party:guava",
"//third_party:jsr305",
],
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
index 14c8347..ec22abe 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
@@ -31,6 +31,8 @@
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.repository.ExternalPackageHelper;
import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
+import com.google.devtools.build.lib.server.FailureDetails;
+import com.google.devtools.build.lib.util.DetailedExitCode;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.RootedPath;
@@ -183,26 +185,52 @@
throws PackageLookupFunctionException, InterruptedException {
String basename = fileRootedPath.asPath().getBaseName();
SkyKey fileSkyKey = FileValue.key(fileRootedPath);
- FileValue fileValue = null;
+ FileValue fileValue;
try {
fileValue = (FileValue) env.getValueOrThrow(fileSkyKey, IOException.class);
} catch (InconsistentFilesystemException e) {
// This error is not transient from the perspective of the PackageLookupFunction.
throw new PackageLookupFunctionException(e, Transience.PERSISTENT);
} catch (FileSymlinkException e) {
+ String message =
+ e.getMessage()
+ + " detected while trying to find "
+ + basename
+ + " file "
+ + fileRootedPath.asPath();
throw new PackageLookupFunctionException(
new BuildFileNotFoundException(
packageIdentifier,
- "Symlink cycle detected while trying to find "
- + basename
- + " file "
- + fileRootedPath.asPath(),
- e),
+ message,
+ DetailedExitCode.of(
+ FailureDetails.FailureDetail.newBuilder()
+ .setMessage(message)
+ .setPackageLoading(
+ FailureDetails.PackageLoading.newBuilder()
+ .setCode(
+ FailureDetails.PackageLoading.Code
+ .SYMLINK_CYCLE_OR_INFINITE_EXPANSION))
+ .build())),
Transience.PERSISTENT);
} catch (IOException e) {
- throw new PackageLookupFunctionException(new BuildFileNotFoundException(packageIdentifier,
- "IO errors while looking for " + basename + " file reading "
- + fileRootedPath.asPath() + ": " + e.getMessage(), e),
+ String message =
+ "IO errors while looking for "
+ + basename
+ + " file reading "
+ + fileRootedPath.asPath()
+ + ": "
+ + e.getMessage();
+ throw new PackageLookupFunctionException(
+ new BuildFileNotFoundException(
+ packageIdentifier,
+ message,
+ DetailedExitCode.of(
+ FailureDetails.FailureDetail.newBuilder()
+ .setMessage(message)
+ .setPackageLoading(
+ FailureDetails.PackageLoading.newBuilder()
+ .setCode(FailureDetails.PackageLoading.Code.OTHER_IO_EXCEPTION))
+ .build())),
Transience.PERSISTENT);
}
return fileValue;
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 8cfda43..457394e 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
@@ -36,6 +36,7 @@
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
import com.google.devtools.build.lib.profiler.SilentCloseable;
+import com.google.devtools.build.lib.server.FailureDetails;
import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.FileType;
import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile;
import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFileFactory;
@@ -233,14 +234,28 @@
String.format(
"Error while traversing directory %s: %s",
traversal.root.getRelativePart(), e.getMessage());
+ // 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 =
+ RecursiveFilesystemTraversalException.Type.FILE_OPERATION_FAILURE;
+ if (e instanceof FileSymlinkException) {
+ exceptionType =
+ RecursiveFilesystemTraversalException.Type.SYMLINK_CYCLE_OR_INFINITE_EXPANSION;
+ }
+ if (e instanceof DetailedException) {
+ FailureDetails.PackageLoading.Code code =
+ ((DetailedException) e)
+ .getDetailedExitCode()
+ .getFailureDetail()
+ .getPackageLoading()
+ .getCode();
+ if (code == FailureDetails.PackageLoading.Code.SYMLINK_CYCLE_OR_INFINITE_EXPANSION) {
+ exceptionType =
+ RecursiveFilesystemTraversalException.Type.SYMLINK_CYCLE_OR_INFINITE_EXPANSION;
+ }
+ }
throw new RecursiveFilesystemTraversalFunctionException(
- new RecursiveFilesystemTraversalException(
- message,
- // 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.
- e instanceof FileSymlinkException || e.getCause() instanceof FileSymlinkException
- ? RecursiveFilesystemTraversalException.Type.SYMLINK_CYCLE_OR_INFINITE_EXPANSION
- : RecursiveFilesystemTraversalException.Type.FILE_OPERATION_FAILURE));
+ new RecursiveFilesystemTraversalException(message, exceptionType));
}
}