Encode SpawnLogModule failures using FailureDetails
RELNOTES: None.
PiperOrigin-RevId: 307419680
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/BUILD
index 9059749..432f262 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BUILD
@@ -74,11 +74,13 @@
"//src/main/java/com/google/devtools/build/lib/util",
"//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
"//src/main/java/com/google/devtools/build/lib/util:command",
+ "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
"//src/main/java/com/google/devtools/build/lib/util:exit_code",
"//src/main/java/com/google/devtools/build/lib/util/io",
"//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/common/options",
+ "//src/main/protobuf:failure_details_java_proto",
"//third_party:guava",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/SpawnLogModule.java b/src/main/java/com/google/devtools/build/lib/bazel/SpawnLogModule.java
index adfc0f2..bf77b79 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/SpawnLogModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/SpawnLogModule.java
@@ -23,7 +23,11 @@
import com.google.devtools.build.lib.remote.options.RemoteOptions;
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.build.lib.server.FailureDetails.Execution;
+import com.google.devtools.build.lib.server.FailureDetails.Execution.Code;
+import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
import com.google.devtools.build.lib.util.AbruptExitException;
+import com.google.devtools.build.lib.util.DetailedExitCode;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.build.lib.util.io.AsynchronousFileOutputStream;
import com.google.devtools.build.lib.util.io.MessageOutputStreamWrapper.BinaryOutputStreamWrapper;
@@ -141,7 +145,10 @@
env.getBlazeModuleEnvironment()
.exit(
new AbruptExitException(
- "Error initializing execution log", ExitCode.COMMAND_LINE_ERROR, e));
+ createDetailedExitCode(
+ "Error initializing execution log",
+ ExitCode.COMMAND_LINE_ERROR,
+ Code.EXECUTION_LOG_INITIALIZATION_FAILURE)));
}
}
@@ -158,7 +165,11 @@
}
done = true;
} catch (IOException e) {
- throw new AbruptExitException(ExitCode.LOCAL_ENVIRONMENTAL_ERROR, e);
+ String message = e.getMessage() == null ? "Error writing execution log" : e.getMessage();
+ throw new AbruptExitException(
+ createDetailedExitCode(
+ message, ExitCode.LOCAL_ENVIRONMENTAL_ERROR, Code.EXECUTION_LOG_WRITE_FAILURE),
+ e);
} finally {
if (!done && !outputStreams.isEmpty()) {
env.getReporter()
@@ -171,4 +182,14 @@
}
}
}
+
+ private static DetailedExitCode createDetailedExitCode(
+ String message, ExitCode exitCode, Code detailedCode) {
+ return DetailedExitCode.of(
+ exitCode,
+ FailureDetail.newBuilder()
+ .setMessage(message)
+ .setExecution(Execution.newBuilder().setCode(detailedCode))
+ .build());
+ }
}
diff --git a/src/main/protobuf/failure_details.proto b/src/main/protobuf/failure_details.proto
index 25f69b5..95f5fbc 100644
--- a/src/main/protobuf/failure_details.proto
+++ b/src/main/protobuf/failure_details.proto
@@ -96,6 +96,7 @@
SymlinkForest symlink_forest = 110;
PackageOptions package_options = 114;
RemoteExecution remote_execution = 115;
+ Execution execution = 116;
}
reserved 102; // For internal use
@@ -243,3 +244,13 @@
Code code = 1;
}
+
+message Execution {
+ enum Code {
+ EXECUTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
+ EXECUTION_LOG_INITIALIZATION_FAILURE = 1 [(metadata) = { exit_code: 2 }];
+ EXECUTION_LOG_WRITE_FAILURE = 2 [(metadata) = { exit_code: 36 }];
+ }
+
+ Code code = 1;
+}
\ No newline at end of file