Skip to content

Commit 13b4568

Browse files
committed
chore(server): Use hyper_util::server::graceful::GracefulShutdown
1 parent d041103 commit 13b4568

File tree

3 files changed

+19
-34
lines changed

3 files changed

+19
-34
lines changed

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,6 @@ members = [
2828
"tests/default_stubs",
2929
]
3030
resolver = "2"
31+
32+
[patch.crates-io]
33+
hyper-util = { git = "https://github.com/hyperium/hyper-util.git", rev = "refs/pull/136/head" }

tonic/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ server = [
3737
"dep:async-stream",
3838
"dep:h2",
3939
"dep:hyper", "hyper?/server",
40-
"dep:hyper-util", "hyper-util?/service", "hyper-util?/server-auto",
40+
"dep:hyper-util", "hyper-util?/service", "hyper-util?/server-auto", "hyper-util?/server-graceful",
4141
"dep:socket2",
4242
"dep:tokio", "tokio?/macros", "tokio?/net", "tokio?/time",
4343
"tokio-stream/net",

tonic/src/transport/server/mod.rs

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::service::Routes;
1616
pub use conn::{Connected, TcpConnectInfo};
1717
use hyper_util::{
1818
rt::{TokioExecutor, TokioIo, TokioTimer},
19+
server::graceful::GracefulShutdown,
1920
service::TowerToHyperService,
2021
};
2122
#[cfg(feature = "tls")]
@@ -561,10 +562,7 @@ impl<L> Server<L> {
561562
builder
562563
};
563564

564-
let (signal_tx, signal_rx) = tokio::sync::watch::channel(());
565-
let signal_tx = Arc::new(signal_tx);
566-
567-
let graceful = signal.is_some();
565+
let graceful = signal.is_some().then(GracefulShutdown::new);
568566
let mut sig = pin!(Fuse { inner: signal });
569567
let mut incoming = pin!(incoming);
570568

@@ -600,21 +598,13 @@ impl<L> Server<L> {
600598
let hyper_io = TokioIo::new(io);
601599
let hyper_svc = TowerToHyperService::new(req_svc.map_request(|req: Request<Incoming>| req.map(boxed)));
602600

603-
serve_connection(hyper_io, hyper_svc, server.clone(), graceful.then(|| signal_rx.clone()));
601+
serve_connection(hyper_io, hyper_svc, server.clone(), graceful.clone());
604602
}
605603
}
606604
}
607605

608-
if graceful {
609-
let _ = signal_tx.send(());
610-
drop(signal_rx);
611-
trace!(
612-
"waiting for {} connections to close",
613-
signal_tx.receiver_count()
614-
);
615-
616-
// Wait for all connections to close
617-
signal_tx.closed().await;
606+
if let Some(graceful) = graceful {
607+
graceful.shutdown().await;
618608
}
619609

620610
Ok(())
@@ -627,7 +617,7 @@ fn serve_connection<IO, S>(
627617
hyper_io: IO,
628618
hyper_svc: S,
629619
builder: ConnectionBuilder,
630-
mut watcher: Option<tokio::sync::watch::Receiver<()>>,
620+
graceful: Option<GracefulShutdown>,
631621
) where
632622
IO: hyper::rt::Read + hyper::rt::Write + Unpin + Send + 'static,
633623
S: HyperService<Request<Incoming>, Response = Response<BoxBody>> + Clone + Send + 'static,
@@ -636,28 +626,20 @@ fn serve_connection<IO, S>(
636626
{
637627
tokio::spawn(async move {
638628
{
639-
let mut sig = pin!(Fuse {
640-
inner: watcher.as_mut().map(|w| w.changed()),
641-
});
629+
let conn = builder.serve_connection(hyper_io, hyper_svc);
642630

643-
let mut conn = pin!(builder.serve_connection(hyper_io, hyper_svc));
631+
let result = if let Some(graceful) = graceful {
632+
let conn = graceful.watch(conn);
633+
conn.await
634+
} else {
635+
conn.await
636+
};
644637

645-
loop {
646-
tokio::select! {
647-
rv = &mut conn => {
648-
if let Err(err) = rv {
649-
debug!("failed serving connection: {:#}", err);
650-
}
651-
break;
652-
},
653-
_ = &mut sig => {
654-
conn.as_mut().graceful_shutdown();
655-
}
656-
}
638+
if let Err(err) = result {
639+
debug!("failed serving connection: {:#}", err);
657640
}
658641
}
659642

660-
drop(watcher);
661643
trace!("connection closed");
662644
});
663645
}

0 commit comments

Comments
 (0)