0

我有一个单元测试,它试图通过向服务器发送一些 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

调查这个错误我发现:

  1. UNAVAILABLE... GOAWAY 被发送到试图连接到当前正在关闭的服务器的客户端。
  2. “调试数据:app_requested”来自关闭方法 NettyServerHandler.GracefulShutdown()

所以问题是:

  1. 自从我断言我的 receivedLatch 为 0 并且该锁存器的倒计时在 RPC 调用的服务方法中,客户端如何未连接。如果它被取消,它会更有意义。

  2. 为什么在我的进程内 RPC 完成之前调用 NettyServerHandler,因为我的理解是 awaitTermination 应该处理的。**

调用 grpcServer.shutdown() 时是否直接调用 NettyServiceHandler 中的关闭。如果是这样,那不总是一场比赛吗?

谢谢,

4

0 回答 0