grpc / grpc/grpc-rust

Bidirectional stream leak

Open
#2,079 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
12.5k
Forks
1.3k
Avg merge
4d 7h
Merged PRs (30d)
24

Description

## Bug Report

### Version

`0.13.0`

### Platform

`Darwin Kernel Version 24.1.0 arm64`

### Description

Once this patch is applied to the repo, you can run `cargo run --bin streaming-server` and `cargo run --bin streaming-client`. You'll observe that the `bidirectional_streaming_echo` function continues to run even after the client drops the response.

```patch
diff --git a/examples/src/streaming/client.rs b/examples/src/streaming/client.rs
index 546f244..dc0c369 100644
--- a/examples/src/streaming/client.rs
+++ b/examples/src/streaming/client.rs
@@ -32,19 +32,24 @@ async fn streaming_echo(client: &mut EchoClient, num: usize) {
}

async fn bidirectional_streaming_echo(client: &mut EchoClient, num: usize) {
- let in_stream = echo_requests_iter().take(num);
+ let in_stream = echo_requests_iter().take(num).then(|value| async move {
+ tokio::time::sleep(Duration::from_secs(1)).await;
+ value
+ });

- let response = client
+ client
.bidirectional_streaming_echo(in_stream)
.await
.unwrap();

- let mut resp_stream = response.into_inner();
+ tokio::time::sleep(std::time::Duration::from_secs(10)).await; // the server server should be ended

- while let Some(received) = resp_stream.next().await {
- let received = received.unwrap();
- println!("\treceived message: `{}`", received.message);
- }
+ // let mut resp_stream = response.into_inner();
+
+ // while let Some(received) = resp_stream.next().await {
+ // let received = received.unwrap();
+ // println!("\treceived message: `{}`", received.message);
+ // }
}

async fn bidirectional_streaming_echo_throttle(client: &mut EchoClient, dur: Duration) {
@@ -67,9 +72,9 @@ async fn bidirectional_streaming_echo_throttle(client: &mut EchoClient,
async fn main() -> Result<(), Box> {
let mut client = EchoClient::connect("http://[::1]:50051").await.unwrap();

- println!("Streaming echo:");
- streaming_echo(&mut client, 5).await;
- tokio::time::sleep(Duration::from_secs(1)).await; //do not mess server println functions
+ // println!("Streaming echo:");
+ // streaming_echo(&mut client, 5).await;
+ // tokio::time::sleep(Duration::from_secs(1)).await; //do not mess server println functions

// Echo stream that sends 17 requests then graceful end that connection
println!("\r\nBidirectional stream echo:");
@@ -78,8 +83,8 @@ async fn main() -> Result<(), Box> {
// Echo stream that sends up to `usize::MAX` requests. One request each 2s.
// Exiting client with CTRL+C demonstrate how to distinguish broken pipe from
// graceful client disconnection (above example) on the server side.
- println!("\r\nBidirectional stream echo (kill client with CTLR+C):");
- bidirectional_streaming_echo_throttle(&mut client, Duration::from_secs(2)).await;
+ // println!("\r\nBidirectional stream echo (kill client with CTLR+C):");
+ // bidirectional_streaming_echo_throttle(&mut client, Duration::from_secs(2)).await;

Ok(())
}
```

During the tests, I got this error too:
```
EchoServer::bidirectional_streaming_echo
thread 'tokio-runtime-worker' panicked at examples/src/streaming/server.rs:111:26:
working rx: SendError { .. }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.