Skip to content

Commit 590b928

Browse files
committed
chore(server): Use hyper_util::server::graceful::GracefulShutdown
1 parent 941726c commit 590b928

File tree

3 files changed

+21
-34
lines changed

3 files changed

+21
-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
"dep:tower", "tower?/util", "tower?/limit",

tonic/src/transport/server/mod.rs

Lines changed: 17 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,9 @@ 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
567+
.is_some()
568+
.then(|| hyper_util::server::graceful::GracefulShutdown::new());
569569
let mut sig = pin!(Fuse { inner: signal });
570570
let mut incoming = pin!(incoming);
571571

@@ -601,21 +601,13 @@ impl<L> Server<L> {
601601

602602
let hyper_svc = TowerToHyperService::new(req_svc);
603603

604-
serve_connection(io, hyper_svc, server.clone(), graceful.then(|| signal_rx.clone()));
604+
serve_connection(io, hyper_svc, server.clone(), graceful.clone());
605605
}
606606
}
607607
}
608608

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

621613
Ok(())
@@ -628,7 +620,7 @@ fn serve_connection<IO, S>(
628620
io: ServerIo<IO>,
629621
hyper_svc: TowerToHyperService<S>,
630622
builder: ConnectionBuilder,
631-
mut watcher: Option<tokio::sync::watch::Receiver<()>>,
623+
graceful: Option<GracefulShutdown>,
632624
) where
633625
S: Service<Request<Incoming>, Response = Response<BoxBody>> + Clone + Send + 'static,
634626
S::Future: Send + 'static,
@@ -638,28 +630,20 @@ fn serve_connection<IO, S>(
638630
{
639631
tokio::spawn(async move {
640632
{
641-
let mut sig = pin!(Fuse {
642-
inner: watcher.as_mut().map(|w| w.changed()),
643-
});
633+
let conn = builder.serve_connection(TokioIo::new(io), hyper_svc);
644634

645-
let mut conn = pin!(builder.serve_connection(TokioIo::new(io), hyper_svc));
635+
let result = if let Some(graceful) = graceful {
636+
let conn = graceful.watch(conn);
637+
conn.await
638+
} else {
639+
conn.await
640+
};
646641

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-
}
642+
if let Err(err) = result {
643+
debug!("failed serving connection: {:#}", err);
659644
}
660645
}
661646

662-
drop(watcher);
663647
trace!("connection closed");
664648
});
665649
}

0 commit comments

Comments
 (0)