grpc-rust icon indicating copy to clipboard operation
grpc-rust copied to clipboard

Canceling a streaming call from client side

Open thomasantony opened this issue 4 years ago • 2 comments

My question is similar to these: https://github.com/grpc/grpc/issues/8023 https://github.com/grpc/grpc-java/issues/3095

I have a streaming call that is being processed by a client that I want to interrupt partway through. What is the correct way to do this such that the server is notified as well?

For example, when I am processing the stream, I use StreamExt::take_until to stop it partway if a certain condition is satisfied. I then call the same streaming endpoint/function again. On testing, I have found that the server now sees two streams still "up". The stream from the server side is perpetual in this case.

I found a further post about this: https://users.rust-lang.org/t/futures-streams-grpc-rs-how-to-cancel-a-server-to-client-stream/26858

I am seeing a similar behavior. Even if I forcibly drop the client, the server keeps sending messages until the client program exits.

thomasantony avatar Sep 12 '20 01:09 thomasantony

This must be a bug. Dropping a call request or response reference should cancel the request.

stepancheg avatar Sep 14 '20 01:09 stepancheg

I have found that the only way to actually shut down the call is to call shutdown_background() on the tokio runtime used to create the client after dropping the client object. Otherwise the server keeps sending data on the "dropped" streaming call. It never detects a disconnect unless I shutdown the tokio runtime. I am testing against a Python test server right now.

thomasantony avatar Sep 14 '20 14:09 thomasantony