From 2485f660776a51574cf66cf82a7102fb3812d310 Mon Sep 17 00:00:00 2001 From: discord9 <55937128+discord9@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:29:39 +0800 Subject: [PATCH] chore: graceful exit on bind fail (#4882) --- src/common/greptimedb-telemetry/src/lib.rs | 2 +- src/servers/src/error.rs | 15 ++++++++++++--- src/servers/src/http.rs | 5 +++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/common/greptimedb-telemetry/src/lib.rs b/src/common/greptimedb-telemetry/src/lib.rs index faab69f8b1..19983e71ee 100644 --- a/src/common/greptimedb-telemetry/src/lib.rs +++ b/src/common/greptimedb-telemetry/src/lib.rs @@ -325,7 +325,7 @@ mod tests { }); let addr = ([127, 0, 0, 1], port).into(); - let server = Server::bind(&addr).serve(make_svc); + let server = Server::try_bind(&addr).unwrap().serve(make_svc); let graceful = server.with_graceful_shutdown(async { rx.await.ok(); }); diff --git a/src/servers/src/error.rs b/src/servers/src/error.rs index 9e4ef0976b..e564c584be 100644 --- a/src/servers/src/error.rs +++ b/src/servers/src/error.rs @@ -36,6 +36,15 @@ use crate::http::error_result::status_code_to_http_status; #[snafu(visibility(pub))] #[stack_trace_debug] pub enum Error { + #[snafu(display("Failed to bind address: {}", addr))] + AddressBind { + addr: SocketAddr, + #[snafu(source)] + error: hyper::Error, + #[snafu(implicit)] + location: Location, + }, + #[snafu(display("Arrow error"))] Arrow { #[snafu(source)] @@ -565,9 +574,9 @@ impl ErrorExt for Error { | Arrow { .. } | FileWatch { .. } => StatusCode::Internal, - AlreadyStarted { .. } | InvalidPromRemoteReadQueryResult { .. } => { - StatusCode::IllegalState - } + AddressBind { .. } + | AlreadyStarted { .. } + | InvalidPromRemoteReadQueryResult { .. } => StatusCode::IllegalState, UnsupportedDataType { .. } => StatusCode::Unsupported, diff --git a/src/servers/src/http.rs b/src/servers/src/http.rs index b0c4843a1b..de4f2cf5ff 100644 --- a/src/servers/src/http.rs +++ b/src/servers/src/http.rs @@ -53,7 +53,7 @@ use tower_http::trace::TraceLayer; use self::authorize::AuthState; use self::table_result::TableResponse; use crate::configurator::ConfiguratorRef; -use crate::error::{AlreadyStartedSnafu, Error, HyperSnafu, Result, ToJsonSnafu}; +use crate::error::{AddressBindSnafu, AlreadyStartedSnafu, Error, HyperSnafu, Result, ToJsonSnafu}; use crate::http::arrow_result::ArrowResponse; use crate::http::csv_result::CsvResponse; use crate::http::error_result::ErrorResponse; @@ -933,7 +933,8 @@ impl Server for HttpServer { app = configurator.config_http(app); } let app = self.build(app); - let server = axum::Server::bind(&listening) + let server = axum::Server::try_bind(&listening) + .with_context(|_| AddressBindSnafu { addr: listening })? .tcp_nodelay(true) // Enable TCP keepalive to close the dangling established connections. // It's configured to let the keepalive probes first send after the connection sits