我有一个单元测试,它试图通过向服务器发送一些 grpc 调用、关闭服务器并验证在服务器关闭之前完成的请求来验证正常的 grpc 服务器关闭。
在测试线程中,我启动了 5 个线程,每个线程执行一个客户端 rpc 调用。
在服务端,我减少一个倒计时锁存器(receivedLatch)以确保已收到呼叫,然后休眠几秒钟。
回到主测试线程,我通过调用 receivedLatch.await() 断言 receivedLatch 为 0。
此时我的理解是所有 5 个客户端调用都连接到服务器并正在处理(睡眠)。
之后我打电话:
grpcServer.shutdown()
grpcServer.awaitTermination(25000, TimeUnit.MILLISECONDS)
问题是竞争条件,有时测试成功完成,而其他时候测试线程中的 rpc 调用出现测试错误,但以下情况除外:
io.grpc.StatusRuntimeException:不可用:连接在 GOAWAY 后关闭。HTTP/2 错误代码:NO_ERROR,调试数据:app_requested
调查这个错误我发现:
- UNAVAILABLE... GOAWAY 被发送到试图连接到当前正在关闭的服务器的客户端。
- “调试数据:app_requested”来自关闭方法 NettyServerHandler.GracefulShutdown()
所以问题是:
自从我断言我的 receivedLatch 为 0 并且该锁存器的倒计时在 RPC 调用的服务方法中,客户端如何未连接。如果它被取消,它会更有意义。
为什么在我的进程内 RPC 完成之前调用 NettyServerHandler,因为我的理解是 awaitTermination 应该处理的。**
调用 grpcServer.shutdown() 时是否直接调用 NettyServiceHandler 中的关闭。如果是这样,那不总是一场比赛吗?
谢谢,