grpc / grpc-dart

The Dart language implementation of gRPC.
https://pub.dev/packages/grpc
Apache License 2.0
860 stars 271 forks source link

Server-side stream doesn't get cancelled #660

Open LowderPlay opened 1 year ago

LowderPlay commented 1 year ago

I am creating server-side stream from Flutter client to Rust server (using tonic). When I'm gracefully stopping the server, it cancels all in-progress streams. However, grpc-dart client doesn't stop the streaming call when canceled from the server, thus making the server hang during shutdown.

This is not server implementation's fault. I verified that the stream gets cancelled by making the streaming call from Postman.

grpc-dart version: 3.2.3

Repro steps

  1. Create a server with server-side streaming RPC.
  2. Connect to the server and invoke this RPC.
  3. Stop the server (or cancel the stream from the server).
  4. Observe that grpc-dart client doesn't notice the cancellation and the server hangs.

Expected result: When the call is cancelled on the server, stream should close on the client side.

Actual result: Stream doesn't close when the call is cancelled from the server.

mosuem commented 1 year ago

I am unsure if this is unexpected behavior - stopping the server just sends a GO_AWAY, see https://github.com/grpc/grpc-java/issues/8770#issuecomment-999840527.

LowderPlay commented 1 year ago

That makes sense. But I haven't found any way to detect that the server sent GO_AWAY. How could I subscribe for these events?

mosuem commented 1 year ago

This is a low-level HTTP2 event, which is not exposed in the package. The recommendation in the comment above is to wait for some amount before force-shutting down. shutdownNow is not implemented here, but I would be happy to review a PR for this feature.