Skip to content

Commit 1b8ce06

Browse files
committed
chore(server): Use hyper_util::server::graceful::GracefulShutdown
1 parent 255a885 commit 1b8ce06

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

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

604-
serve_connection(hyper_io, hyper_svc, server.clone(), graceful.then(|| signal_rx.clone()));
602+
serve_connection(hyper_io, hyper_svc, server.clone(), graceful.clone());
605603
}
606604
}
607605
}
608606

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;
607+
if let Some(graceful) = graceful {
608+
graceful.shutdown().await;
619609
}
620610

621611
Ok(())
@@ -628,7 +618,7 @@ fn serve_connection<IO, S>(
628618
hyper_io: IO,
629619
hyper_svc: S,
630620
builder: ConnectionBuilder,
631-
mut watcher: Option<tokio::sync::watch::Receiver<()>>,
621+
graceful: Option<GracefulShutdown>,
632622
) where
633623
IO: hyper::rt::Read + hyper::rt::Write + Unpin + Send + 'static,
634624
S: HyperService<Request<Incoming>, Response = Response<BoxBody>> + Clone + Send + 'static,
@@ -637,28 +627,20 @@ fn serve_connection<IO, S>(
637627
{
638628
tokio::spawn(async move {
639629
{
640-
let mut sig = pin!(Fuse {
641-
inner: watcher.as_mut().map(|w| w.changed()),
642-
});
630+
let conn = builder.serve_connection(hyper_io, hyper_svc);
643631

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

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

661-
drop(watcher);
662644
trace!("connection closed");
663645
});
664646
}

0 commit comments

Comments
 (0)