StatusRuntimeException: UNKNOWN caused by ChannelClosedException

We are seeing these errors on the client side sporadically.

Caused by: io.grpc.StatusRuntimeException: UNKNOWN: channel closed at io.grpc.Status.asRuntimeException(Status.java:532) at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:434) at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:700) at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:398) at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:459) at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:63) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:546) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:467) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:584) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) at (ThreadPoolExecutor.java:1128) at (ThreadPoolExecutor.java:628) at (Thread.java:834) Caused by: java.nio.channels.ClosedChannelException: null at io.grpc.netty.Utils.statusFromThrowable(Utils.java:166) at io.grpc.netty.NettyClientHandler.onConnectionError(NettyClientHandler.java:474) at io.netty.handler.codec.http2.Http2ConnectionHandler.onError(Http2ConnectionHandler.java:641) at io.netty.handler.codec.http2.DefaultHttp2ConnectionEncoder.writeHeaders(DefaultHttp2ConnectionEncoder.java:225) at io.netty.handler.codec.http2.DecoratingHttp2FrameWriter.writeHeaders(DecoratingHttp2FrameWriter.java:53) at io.netty.handler.codec.http2.StreamBufferingEncoder.writeHeaders(StreamBufferingEncoder.java:157) at io.netty.handler.codec.http2.StreamBufferingEncoder.writeHeaders(StreamBufferingEncoder.java:141) at io.grpc.netty.NettyClientHandler.createStream(NettyClientHandler.java:543) at io.grpc.netty.NettyClientHandler.write(NettyClientHandler.java:312) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:716) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:708) at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:791) at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:701) at io.netty.channel.DefaultChannelPipeline.write(DefaultChannelPipeline.java:1026) at io.netty.channel.AbstractChannel.write(AbstractChannel.java:288) at io.grpc.netty.WriteQueue$AbstractQueuedCommand.run(WriteQueue.java:174) at io.grpc.netty.WriteQueue.flush(WriteQueue.java:112) at io.grpc.netty.WriteQueue.access$000(WriteQueue.java:32) at io.grpc.netty.WriteQueue$1.run(WriteQueue.java:44) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:416) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:515) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ... 1 common frames omitted Caused by: java.nio.channels.ClosedChannelException: null at io.netty.channel.AbstractChannel$AbstractUnsafe.newClosedChannelException(AbstractChannel.java:955) at io.netty.channel.AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:863) at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1378) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:716) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:708) at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:791) at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:701) at io.netty.handler.codec.http2.DefaultHttp2FrameWriter.writeHeadersInternal(DefaultHttp2FrameWriter.java:528) at io.netty.handler.codec.http2.DefaultHttp2FrameWriter.writeHeaders(DefaultHttp2FrameWriter.java:268) at io.netty.handler.codec.http2.Http2OutboundFrameLogger.writeHeaders(Http2OutboundFrameLogger.java:60) at io.netty.handler.codec.http2.DefaultHttp2ConnectionEncoder.writeHeaders(DefaultHttp2ConnectionEncoder.java:208) ... 22 common frames omitted Caused by: java.io.IOException: Connection reset by peer at (Native Method) at (SocketDispatcher.java:47) at (IOUtil.java:113) at (IOUtil.java:58) at (IOUtil.java:50) at (SocketChannelImpl.java:466) at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:405) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:928) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:356) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:895) at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1383) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:749) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:741) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:727) at io.grpc.netty.NettyClientHandler.sendPingFrame(NettyClientHandler.java:646) at io.grpc.netty.NettyClientHandler.write(NettyClientHandler.java:318) ... 17 common frames omitted 

Both the server and the client run in Kubernetes with the server being a ClusterIP service. The client's channel builder looks like this:

NettyChannelBuilder.forAddress("some-service", 8090) .nameResolverFactory(DnsNameResolverProvider.asFactory()) .defaultLoadBalancingPolicy("round_robin") .idleTimeout(60000, TimeUnit.MILLISECONDS) .usePlaintext(); 

The client sends requests in a burst of 4-5 (concurrently using project-reactor) every 5 minutes. We see failures happening once or twice a day. We have tried setting both keepAlive and idleTimeout on separate occasions but nothing seems to be working. We have retries defined for UNAVAILABLE and DEADLINE_EXCEEDED status codes but not UNKNOWN since that could mean retrying on potentially non-retriable errors. Is there a way to fix this on the client side without having to retry on UNKNOWN errors?

Client gRPC version: 1.20.0 Server gRPC version: 1.20.0 Netty Version: 4.1.39.Final

2

Related questions 1 grpc-java server shuts down immediately 1 Getting IllegalStateException when starting the grpc server 2 grpc gives "INTERNAL: Connection closed with unknown cause" Related questions 1 grpc-java server shuts down immediately 1 Getting IllegalStateException when starting the grpc server 2 grpc gives "INTERNAL: Connection closed with unknown cause" 3 Channel closed when running simple example with TLS 0 gRPC Java Client - hasNext during onNext? 2 gRPC "call is closed" exception when calling onNext on server 20 gRPC: Random CANCELLED exception on RPC calls 10 Channel ManagedChannelImpl was not shut down properly 0 Java gRPC: exception from client to server 8 gRPC client failing with "CANCELLED: io.grpc.Context was cancelled without error" Load 7 more related questions Show fewer related questions

Reset to default

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like