diff --git a/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java b/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java index 8c0c6ec6512..23a3b94dee8 100644 --- a/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java +++ b/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java @@ -124,7 +124,12 @@ public void finest(String str, Object... params) { transportState.runOnTransportThread( () -> { transportState.complete(); - asyncContext.complete(); + try { + asyncContext.complete(); + } catch (IllegalStateException ignored) { + // Tomcat can throw: + // Calling [asyncComplete()] is not valid for a request with Async state [COMPLETING] + } log.fine("call completed"); }); }; @@ -254,7 +259,7 @@ interface ActionItem { @VisibleForTesting // Lincheck test can not run with java.util.logging dependency. interface Log { default boolean isLoggable(Level level) { - return false; + return false; } default void fine(String str, Object...params) {} diff --git a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java index 5d11abf0f90..00674097cf8 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java @@ -300,7 +300,12 @@ public void cancel(Status status) { close(Status.CANCELLED.withCause(status.asRuntimeException()), new Metadata()); CountDownLatch countDownLatch = new CountDownLatch(1); transportState.runOnTransportThread(() -> { - asyncCtx.complete(); + try { + asyncCtx.complete(); + } catch (IllegalStateException ignored) { + // Tomcat can throw: + // Calling [asyncComplete()] is not valid for a request with Async state [COMPLETING] + } countDownLatch.countDown(); }); try {