diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD index 6b02d36fb71b2e..58588da7508421 100644 --- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD +++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD @@ -31,9 +31,11 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe/serialization", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:constants", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", + "//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/net/starlark/java/annot", "//src/main/java/net/starlark/java/eval", + "//src/main/protobuf:failure_details_java_proto", "//third_party:auto_value", "//third_party:flogger", "//third_party:guava", diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSet.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSet.java index 06ae545bf27330..7e9e9b07930b9a 100644 --- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSet.java +++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSet.java @@ -26,7 +26,11 @@ import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetStore.MissingNestedSetException; import com.google.devtools.build.lib.concurrent.MoreFutures; +import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; +import com.google.devtools.build.lib.server.FailureDetails.Interrupted; +import com.google.devtools.build.lib.server.FailureDetails.Interrupted.Code; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.util.DetailedExitCode; import com.google.devtools.build.lib.util.ExitCode; import com.google.protobuf.ByteString; import java.time.Duration; @@ -286,21 +290,25 @@ enum InterruptStrategy { PROPAGATE } - /** Implementation of {@link #getChildren} that will catch an InterruptedException and crash. */ + /** + * Implementation of {@link #getChildren} that crashes with the appropriate failure detail if it + * encounters {@link InterruptedException}. + */ private Object getChildrenUninterruptibly() { - if (children instanceof ListenableFuture) { - try { - return MoreFutures.waitForFutureAndGet((ListenableFuture) children); - } catch (InterruptedException e) { - System.err.println( - "An interrupted exception occurred during nested set deserialization, " - + "exiting abruptly."); - BugReport.handleCrash(Crash.from(e, ExitCode.INTERRUPTED), CrashContext.halt()); - throw new IllegalStateException("Should have halted", e); - } - } else { + if (!(children instanceof ListenableFuture)) { return children; } + try { + return MoreFutures.waitForFutureAndGet((ListenableFuture) children); + } catch (InterruptedException e) { + FailureDetail failureDetail = + FailureDetail.newBuilder() + .setMessage("Interrupted during NestedSet deserialization") + .setInterrupted(Interrupted.newBuilder().setCode(Code.INTERRUPTED)) + .build(); + BugReport.handleCrash(Crash.from(e, DetailedExitCode.of(failureDetail)), CrashContext.halt()); + throw new IllegalStateException("Should have halted", e); + } } /**