diff --git a/core/src/main/java/io/grpc/internal/ServerImpl.java b/core/src/main/java/io/grpc/internal/ServerImpl.java index 1efa4bf78b0..113aeb3fab7 100644 --- a/core/src/main/java/io/grpc/internal/ServerImpl.java +++ b/core/src/main/java/io/grpc/internal/ServerImpl.java @@ -28,6 +28,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import io.grpc.Attributes; @@ -53,7 +54,6 @@ import io.grpc.ServerServiceDefinition; import io.grpc.ServerTransportFilter; import io.grpc.Status; -import io.grpc.StatusException; import io.perfmark.Link; import io.perfmark.PerfMark; import io.perfmark.Tag; @@ -606,17 +606,11 @@ public void runInContext() { private void runInternal() { ServerStreamListener listener = NOOP_LISTENER; - ServerCallParameters callParameters; try { if (future.isCancelled()) { return; } - if (!future.isDone() || (callParameters = future.get()) == null) { - Status status = Status.INTERNAL.withDescription( - "Unexpected failure retrieving server call parameters."); - throw new StatusException(status); - } - listener = startWrappedCall(methodName, callParameters, headers); + listener = startWrappedCall(methodName, Futures.getDone(future), headers); } catch (Throwable ex) { stream.close(Status.fromThrowable(ex), new Metadata()); context.cancel(null); diff --git a/core/src/test/java/io/grpc/internal/ServerImplTest.java b/core/src/test/java/io/grpc/internal/ServerImplTest.java index a7152919b3b..2a9dbd5a1fe 100644 --- a/core/src/test/java/io/grpc/internal/ServerImplTest.java +++ b/core/src/test/java/io/grpc/internal/ServerImplTest.java @@ -74,6 +74,7 @@ import io.grpc.ServerTransportFilter; import io.grpc.ServiceDescriptor; import io.grpc.Status; +import io.grpc.Status.Code; import io.grpc.StringMarshaller; import io.grpc.internal.ServerImpl.JumpToApplicationThreadServerStreamListener; import io.grpc.internal.ServerImplBuilder.ClientTransportServersBuilder; @@ -533,6 +534,7 @@ public ServerCall.Listener startCall( } @Test + @SuppressWarnings("CheckReturnValue") public void executorSupplierFutureNotSet() throws Exception { builder.executorSupplier = new ServerCallExecutorSupplier() { @Override @@ -575,7 +577,8 @@ public ServerCall.Listener startCall( assertThat(callReference.get()).isNull(); verify(stream, times(2)).close(statusCaptor.capture(), any(Metadata.class)); Status status = statusCaptor.getAllValues().get(1); - assertEquals(Status.Code.INTERNAL, status.getCode()); + assertEquals(Code.UNKNOWN, status.getCode()); + assertThat(status.getCause() instanceof IllegalStateException); } @Test