grpc-dart
grpc-dart copied to clipboard
Server-side stream doesn't get cancelled
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
- Create a server with server-side streaming RPC.
- Connect to the server and invoke this RPC.
- Stop the server (or cancel the stream from the server).
- 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.
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.
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?
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.