Client panic
- Dominant language
- Rust
- Stars
- 12.5k
- Forks
- 1.3k
- Avg merge
- 4d 7h
- Merged PRs (30d)
- 24
Description
## Bug Report
Hi, I experimented with writing a tonic client "by hand" i.e. without codegen in a build script.
Sadly my most basic test panics.
Am I missing something or is it a bug?
### versions
```
├── tonic v0.14.5
└── tonic-prost v0.14.5
└── tonic v0.14.5 (*)
```
### Platform
`Linux redacted 6.18.13-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 25 Feb 2026 23:12:35 +0000 x86_64 GNU/Linux`
### Description
I ran the following and it panics without reaching the server.
#### src/main.rs
```rust
use tonic::Request;
use tonic::client::Grpc;
use tonic::codegen::http::uri::PathAndQuery;
use tonic::transport::Channel;
use tonic::transport::Uri;
use tonic_prost::ProstCodec;
#[derive(prost::Message)]
struct Foo {}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let channel = Channel::builder(Uri::from_static("http://127.0.0.1:8080"))
.connect()
.await?;
Grpc::new(channel)
.unary(
Request::new(Foo {}),
PathAndQuery::from_static("/foo/bar"),
ProstCodec::::new(),
)
.await?;
Ok(())
}
```
#### Cargo.toml
```toml
[package]
name = "client"
version = "0.1.0"
edition = "2024"
publish = false
[dependencies]
tonic = { version = "~0.14", features = ["transport", "channel"] }
anyhow = { version = "~1" }
tokio = { version = "~1", features = ["full"] }
prost = { version = "~0.14", features = ["derive"] }
tonic-prost = { version = "~0.14" }
```
#### Output
```
thread 'main' (236722) panicked at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tower-0.5.3/src/buffer/service.rs:122:23:
`send_item` called without first calling `poll_reserve`
stack backtrace:
0: __rustc::rust_begin_unwind
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/panicking.rs:689:5
1: core::panicking::panic_fmt
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/panicking.rs:80:14
2: tokio_util::sync::mpsc::PollSender::send_item
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-util-0.7.18/src/sync/mpsc.rs:186:17
3: as tower_service::Service>::call
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tower-0.5.3/src/buffer/service.rs:122:23
4: >>::call
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tonic-0.14.5/src/transport/channel/mod.rs:218:21
5: >::call
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tonic-0.14.5/src/client/service.rs:48:9
6: tonic::client::grpc::Grpc::streaming::{{closure}}
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tonic-0.14.5/src/client/grpc.rs:312:14
7: tonic::client::grpc::Grpc::client_streaming::{{closure}}
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tonic-0.14.5/src/client/grpc.rs:242:50
8: tonic::client::grpc::Grpc::unary::{{closure}}
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tonic-0.14.5/src/client/grpc.rs:222:53
9: client::main::{{closure}}
at ./example/client/src/main.rs:23:10
10: as core::future::future::Future>::poll
at /home/gammelalf/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:133:9
11: tokio::runtime::park::CachedParkThread::block_on::{{closure}}
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/park.rs:284:71
12: tokio::task::coop::with_budget
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/task/coop/mod.rs:167:5
13: tokio::task::coop::budget
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/task/coop/mod.rs:133:5
14: tokio::runtime::park::CachedParkThread::block_on
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/park.rs:284:31
15: tokio::runtime::context::blocking::BlockingRegionGuard::block_on
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/context/blocking.rs:66:14
16: tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/scheduler/multi_thread/mod.rs:89:22
17: tokio::runtime::context::runtime::enter_runtime
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/context/runtime.rs:65:16
18: tokio::runtime::scheduler::multi_thread::MultiThread::block_on
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/scheduler/multi_thread/mod.rs:88:9
19: tokio::runtime::runtime::Runtime::block_on_inner
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/runtime.rs:373:50
20: tokio::runtime::runtime::Runtime::block_on
at /home/gammelalf/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.50.0/src/runtime/runtime.rs:343:18
21: client::main
at ./example/client/src/main.rs:25:7
22: core::ops::function::FnOnce::call_once
at /home/gammelalf/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
Process finished with exit code 101
```
Contributor guide
Assessment
This issue has not been assessed yet.