Skip to content

Commit 91086e1

Browse files
committed
chore(server): Use hyper_util::server::graceful::GracefulShutdown
1 parent b6ad603 commit 91086e1

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")]
@@ -562,10 +563,7 @@ impl<L> Server<L> {
562563
builder
563564
};
564565

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

@@ -602,21 +600,13 @@ impl<L> Server<L> {
602600
let hyper_io = TokioIo::new(io);
603601
let hyper_svc = TowerToHyperService::new(req_svc);
604602

605-
serve_connection(hyper_io, hyper_svc, server.clone(), graceful.then(|| signal_rx.clone()));
603+
serve_connection(hyper_io, hyper_svc, server.clone(), graceful.clone());
606604
}
607605
}
608606
}
609607

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

622612
Ok(())
@@ -629,7 +619,7 @@ fn serve_connection<IO, S>(
629619
hyper_io: IO,
630620
hyper_svc: S,
631621
builder: ConnectionBuilder,
632-
mut watcher: Option<tokio::sync::watch::Receiver<()>>,
622+
graceful: Option<GracefulShutdown>,
633623
) where
634624
IO: hyper::rt::Read + hyper::rt::Write + Unpin + Send + 'static,
635625
S: HyperService<Request<Incoming>, Response = Response<BoxBody>> + Clone + Send + 'static,
@@ -638,28 +628,20 @@ fn serve_connection<IO, S>(
638628
{
639629
tokio::spawn(async move {
640630
{
641-
let mut sig = pin!(Fuse {
642-
inner: watcher.as_mut().map(|w| w.changed()),
643-
});
631+
let conn = builder.serve_connection(hyper_io, hyper_svc);
644632

645-
let mut conn = pin!(builder.serve_connection(hyper_io, hyper_svc));
633+
let result = if let Some(graceful) = graceful {
634+
let conn = graceful.watch(conn);
635+
conn.await
636+
} else {
637+
conn.await
638+
};
646639

647-
loop {
648-
tokio::select! {
649-
rv = &mut conn => {
650-
if let Err(err) = rv {
651-
debug!("failed serving connection: {:#}", err);
652-
}
653-
break;
654-
},
655-
_ = &mut sig => {
656-
conn.as_mut().graceful_shutdown();
657-
}
658-
}
640+
if let Err(err) = result {
641+
debug!("failed serving connection: {:#}", err);
659642
}
660643
}
661644

662-
drop(watcher);
663645
trace!("connection closed");
664646
});
665647
}

0 commit comments

Comments
 (0)