You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The async server does not detect if a client disconnects ungracefully from a streaming API. For example, let's say a client wishes to subscribe to updates streamed from the server. The connection is established, and the server starts streaming updates to the client. If the client dies, the server does not immediately realize this and continues to send events.
For example, adapting the async-stream-server file to only read the first message from the client, then echo back an increasing sequence number forever:
asyncfnecho_stream(&self,_ctx:&::ttrpc::r#async::TtrpcContext,muts:::ttrpc::r#async::ServerStream<streaming::EchoPayload, streaming::EchoPayload>,) -> ::ttrpc::Result<()>{letmut e = s.recv().await?.unwrap();loop{
e.seq += 1;println!("Sleep 1 second to simulate waiting for an event");sleep(std::time::Duration::from_secs(1)).await;println!("sending: {}", e.seq);let result = s.send(&e).await;if result.is_err(){println!("error sending item!");}}}
With this client implementation:
asyncfnecho_stream(cli: streaming_ttrpc::StreamingClient){letmut stream = cli.echo_stream(default_ctx()).await.unwrap();let echo = streaming::EchoPayload{seq:0,msg:"Echo in a stream".to_string(),
..Default::default()};
stream.send(&echo).await.unwrap();whileletOk(resp) = stream.recv().await{println!("{}", resp);}}
Expected result
I'm not sure what would be best; some options are:
Cancel the async future the service method is executing in (like non-streaming async does if the client dies)
Propagate the write error back to the service method (so errors can be detected when calling s.send(&e).await;). While I think this makes sense to do regardless, it's a lot more convenient if the client disconnect can be detected before trying to send something to it.
Actual result
Client output:
seq: 5 msg: "Echo in a stream"
seq: 6 msg: "Echo in a stream"
^C <-- client killed
Server output:
... snip ....
Sleep 1 second to simulate waiting for an event
sending: 6
Sleep 1 second to simulate waiting for an event
sending: 7
Sleep 1 second to simulate waiting for an event
[00:00:19.969] (7ffb7073b640) ERROR write_message got error: Socket("Broken pipe (os error 32)")
sending: 8
Sleep 1 second to simulate waiting for an event
[00:00:20.970] (7ffb7073b640) ERROR write_message got error: Socket("Broken pipe (os error 32)")
The text was updated successfully, but these errors were encountered:
Description of problem
The async server does not detect if a client disconnects ungracefully from a streaming API. For example, let's say a client wishes to subscribe to updates streamed from the server. The connection is established, and the server starts streaming updates to the client. If the client dies, the server does not immediately realize this and continues to send events.
For example, adapting the
async-stream-server
file to only read the first message from the client, then echo back an increasing sequence number forever:With this client implementation:
Expected result
I'm not sure what would be best; some options are:
s.send(&e).await;
). While I think this makes sense to do regardless, it's a lot more convenient if the client disconnect can be detected before trying to send something to it.Actual result
Client output:
Server output:
The text was updated successfully, but these errors were encountered: