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