vert-x3 / vertx-grpc

gRPC for Vert.x
78 stars 49 forks source link

VertxServer shutdown cause java.lang.IndexOutOfBoundsException. #115

Open coding4m opened 2 years ago

coding4m commented 2 years ago

Version

vertx 4.2.5 grpc-java 1.44.1

Context

exception stack trace:

2022-03-09T15:16:02,302 WARN  io.netty.util.concurrent.DefaultPromise - An exception was thrown by io.grpc.netty.NettyServerHandler$5.operationComplete()
Mar 09 15:16:02 start[18365]: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
Mar 09 15:16:02 start[18365]: at java.util.ArrayList.rangeCheck(ArrayList.java:659) ~[?:1.8.0_301]
Mar 09 15:16:02 start[18365]: at java.util.ArrayList.get(ArrayList.java:435) ~[?:1.8.0_301]
Mar 09 15:16:02 start[18365]: at io.vertx.grpc.VertxServer$ActualServer.lambda$new$1(VertxServer.java:91) ~[io.vertx.vertx-grpc-4.2.5.jar:4.2.5]
Mar 09 15:16:02 start[18365]: at io.grpc.internal.SerializingExecutor.schedule(SerializingExecutor.java:102) ~[io.grpc.grpc-core-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.internal.SerializingExecutor.execute(SerializingExecutor.java:95) ~[io.grpc.grpc-core-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener.closedInternal(ServerImpl.java:920) ~[io.grpc.grpc-core-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener.closed(ServerImpl.java:887) ~[io.grpc.grpc-core-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.internal.AbstractServerStream$TransportState.closeListener(AbstractServerStream.java:332) ~[io.grpc.grpc-core-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.internal.AbstractServerStream$TransportState.complete(AbstractServerStream.java:298) ~[io.grpc.grpc-core-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.netty.NettyServerStream$TransportState.complete(NettyServerStream.java:168) ~[io.grpc.grpc-netty-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.netty.NettyServerHandler$5.operationComplete(NettyServerHandler.java:682) ~[io.grpc.grpc-netty-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.grpc.netty.NettyServerHandler$5.operationComplete(NettyServerHandler.java:679) ~[io.grpc.grpc-netty-1.44.1.jar:1.44.1]
Mar 09 15:16:02 start[18365]: at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) ~[io.netty.netty-common-4.1.74.Final.jar:4.1.74.Final]
Mar 09 15:16:02 start[18365]: at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) ~[io.netty.netty-common-4.1.74.Final.jar:4.1.74.Final]
Mar 09 15:16:02 start[18365]: at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) ~[io.netty.netty-common-4.1.74.Final.jar:4.1.74.Final]

maybe call contextLocal.get().remove(context) after server.shutdown()

    void stop(ContextInternal context, Promise<Void> promise) {
      boolean shutdown = count.decrementAndGet() == 0;
      context.runOnContext(v -> {
        group.removeWorker(context.nettyEventLoop());
        **contextLocal.get().remove(context);**
        if (shutdown) {
          map.remove(id);
          context.executeBlocking(p -> {
            server.shutdown();
            p.complete();
          }, promise);
        } else {
          promise.complete();
        }
      });
    }
vietj commented 2 years ago

do you have a reproducer ?

liangyuanpeng commented 2 years ago

Have some reproduce step or code would be great.