Skip to content

Make a GracefulShutdown helper in hyper-util #2862

Closed
hyperium/hyper-util
#127
@seanmonstar

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);

                if let Err(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