Skip to content

Make a GracefulShutdown helper in hyper-util #2862

Description

@seanmonstar

With the removal of hyper::Server, the graceful shutdown stuff would disappear. We want to continue to provide a helper to do that, in hyper-util, but make it also able to be used with timeouts. Perhaps something like this:

let listener = TcpListener::bind("0.0.0.0:0").await?;let server = Server::new();let graceful = GracefulShutdown::new();let ctrl_c = tokio::signal::ctrl_c();loop{
tokio::select! {
conn = listener.accept() => {let server = server.clone();let graceful = graceful.clone();
task::spawn(async move {// maybe TLS accept here...let conn = server.serve_connection(conn);let conn = graceful.watch(conn);ifletErr(e) = conn.await{
eprintln!("http server conn error: {}", e);}});},
_ = ctrl_c => {
eprintln!("Ctrl-C received, starting shutdown");break;}}}
tokio::select! {
_ = graceful.shutdown() => {
eprintln!("Gracefully shutdown!");},
_ = tokio::time::sleep(10.seconds()) => {
eprintln!("Waited 10 seconds for graceful shutdown, aborting...");}}

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-serverArea: server.C-featureCategory: feature. This is adding a new feature.E-mediumEffort: medium. Some knowledge of how hyper internal works would be useful.K-hyper-utilCrate: hyper-util

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions