From 53fc32b0da1fbee97adc187dd6290ad4c4e4b27b Mon Sep 17 00:00:00 2001 From: Yingwen Date: Tue, 9 Sep 2025 15:39:18 +0800 Subject: [PATCH] chore: cherry pick #6461 to v0.15 (#6936) refactor: stores the http server builder in Metasrv instance (#6461) * refactor: stores the http server builder in Metasrv instance * resolve PR comments * fix ci --------- Signed-off-by: luofucong Signed-off-by: evenyag Co-authored-by: LFC <990479+MichaelScofield@users.noreply.github.com> --- Cargo.lock | 15 ++++----- Cargo.toml | 1 + src/cli/Cargo.toml | 1 - src/cmd/Cargo.toml | 1 - src/cmd/src/metasrv.rs | 4 +++ src/meta-srv/Cargo.toml | 1 + src/meta-srv/src/bootstrap.rs | 60 ++++++++++++++++++++++++----------- src/meta-srv/src/lib.rs | 1 + 8 files changed, 55 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5cd13c58f0..c52fa7acb9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1988,7 +1988,6 @@ dependencies = [ "common-version", "common-wal", "datatypes", - "either", "etcd-client", "futures", "humantime", @@ -2116,7 +2115,6 @@ dependencies = [ "common-wal", "datanode", "datatypes", - "either", "etcd-client", "file-engine", "flow", @@ -4216,9 +4214,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ "serde", ] @@ -6716,7 +6714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -7192,6 +7190,7 @@ dependencies = [ "deadpool", "deadpool-postgres", "derive_builder 0.20.1", + "either", "etcd-client", "futures", "h2 0.3.26", @@ -9596,7 +9595,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ "heck 0.5.0", - "itertools 0.11.0", + "itertools 0.14.0", "log", "multimap", "once_cell", @@ -9642,7 +9641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.100", @@ -14213,7 +14212,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 007bd61efe..a95aab2449 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -130,6 +130,7 @@ deadpool = "0.12" deadpool-postgres = "0.14" derive_builder = "0.20" dotenv = "0.15" +either = "1.15" etcd-client = "0.14" fst = "0.4.7" futures = "0.3" diff --git a/src/cli/Cargo.toml b/src/cli/Cargo.toml index 5d5fa1038b..660c996620 100644 --- a/src/cli/Cargo.toml +++ b/src/cli/Cargo.toml @@ -43,7 +43,6 @@ common-time.workspace = true common-version.workspace = true common-wal.workspace = true datatypes.workspace = true -either = "1.8" etcd-client.workspace = true futures.workspace = true humantime.workspace = true diff --git a/src/cmd/Cargo.toml b/src/cmd/Cargo.toml index 5691403973..65d916578e 100644 --- a/src/cmd/Cargo.toml +++ b/src/cmd/Cargo.toml @@ -52,7 +52,6 @@ common-version.workspace = true common-wal.workspace = true datanode.workspace = true datatypes.workspace = true -either = "1.8" etcd-client.workspace = true file-engine.workspace = true flow.workspace = true diff --git a/src/cmd/src/metasrv.rs b/src/cmd/src/metasrv.rs index ea2262e243..3399d59efa 100644 --- a/src/cmd/src/metasrv.rs +++ b/src/cmd/src/metasrv.rs @@ -54,6 +54,10 @@ impl Instance { pub fn get_inner(&self) -> &MetasrvInstance { &self.instance } + + pub fn mut_inner(&mut self) -> &mut MetasrvInstance { + &mut self.instance + } } #[async_trait] diff --git a/src/meta-srv/Cargo.toml b/src/meta-srv/Cargo.toml index 955b47f32b..f8b9dcfdc2 100644 --- a/src/meta-srv/Cargo.toml +++ b/src/meta-srv/Cargo.toml @@ -48,6 +48,7 @@ datatypes.workspace = true deadpool = { workspace = true, optional = true } deadpool-postgres = { workspace = true, optional = true } derive_builder.workspace = true +either.workspace = true etcd-client.workspace = true futures.workspace = true h2 = "0.3" diff --git a/src/meta-srv/src/bootstrap.rs b/src/meta-srv/src/bootstrap.rs index 0a042cd484..1fcd546f98 100644 --- a/src/meta-srv/src/bootstrap.rs +++ b/src/meta-srv/src/bootstrap.rs @@ -34,6 +34,7 @@ use common_meta::kv_backend::{KvBackendRef, ResettableKvBackendRef}; use common_telemetry::info; #[cfg(feature = "pg_kvbackend")] use deadpool_postgres::{Config, Runtime}; +use either::Either; use etcd_client::Client; use servers::configurator::ConfiguratorRef; use servers::export_metrics::ExportMetricsTask; @@ -77,7 +78,7 @@ use crate::{error, Result}; pub struct MetasrvInstance { metasrv: Arc, - http_server: HttpServer, + http_server: Either, HttpServer>, opts: MetasrvOptions, @@ -103,11 +104,10 @@ impl MetasrvInstance { // Wire up the admin_axum_router as an extra router let extra_routers = admin_axum_router(metasrv.clone()); - let http_server = HttpServerBuilder::new(opts.http.clone()) + let builder = HttpServerBuilder::new(opts.http.clone()) .with_metrics_handler(MetricsHandler) .with_greptime_config_options(opts.to_toml().context(error::TomlFormatSnafu)?) - .with_extra_router(extra_routers) - .build(); + .with_extra_router(extra_routers); // put metasrv into plugins for later use plugins.insert::>(metasrv.clone()); @@ -115,7 +115,7 @@ impl MetasrvInstance { .context(error::InitExportMetricsTaskSnafu)?; Ok(MetasrvInstance { metasrv, - http_server, + http_server: Either::Left(Some(builder)), opts, signal_sender: None, plugins, @@ -126,6 +126,25 @@ impl MetasrvInstance { } pub async fn start(&mut self) -> Result<()> { + if let Some(builder) = self.http_server.as_mut().left() + && let Some(builder) = builder.take() + { + let mut server = builder.build(); + + let addr = self.opts.http.addr.parse().context(error::ParseAddrSnafu { + addr: &self.opts.http.addr, + })?; + info!("starting http server at {}", addr); + server.start(addr).await.context(error::StartHttpSnafu)?; + + self.http_server = Either::Right(server); + } else { + // If the http server builder is not present, the Metasrv has to be called "start" + // already, regardless of the startup was successful or not. Return an `Ok` here for + // simplicity. + return Ok(()); + }; + self.metasrv.try_start().await?; if let Some(t) = self.export_metrics_task.as_ref() { @@ -149,14 +168,6 @@ impl MetasrvInstance { .await?; self.bind_addr = Some(socket_addr); - let addr = self.opts.http.addr.parse().context(error::ParseAddrSnafu { - addr: &self.opts.http.addr, - })?; - self.http_server - .start(addr) - .await - .context(error::StartHttpSnafu)?; - *self.serve_state.lock().await = Some(serve_state_rx); Ok(()) } @@ -174,12 +185,15 @@ impl MetasrvInstance { .context(error::SendShutdownSignalSnafu)?; } self.metasrv.shutdown().await?; - self.http_server - .shutdown() - .await - .context(error::ShutdownServerSnafu { - server: self.http_server.name(), - })?; + + if let Some(http_server) = self.http_server.as_ref().right() { + http_server + .shutdown() + .await + .context(error::ShutdownServerSnafu { + server: http_server.name(), + })?; + } Ok(()) } @@ -193,6 +207,14 @@ impl MetasrvInstance { pub fn bind_addr(&self) -> &Option { &self.bind_addr } + + pub fn mut_http_server(&mut self) -> &mut Either, HttpServer> { + &mut self.http_server + } + + pub fn http_server(&self) -> Option<&HttpServer> { + self.http_server.as_ref().right() + } } pub async fn bootstrap_metasrv_with_router( diff --git a/src/meta-srv/src/lib.rs b/src/meta-srv/src/lib.rs index 20b9285723..f0508c6bbe 100644 --- a/src/meta-srv/src/lib.rs +++ b/src/meta-srv/src/lib.rs @@ -15,6 +15,7 @@ #![feature(result_flattening)] #![feature(assert_matches)] #![feature(hash_set_entry)] +#![feature(let_chains)] pub mod bootstrap; pub mod cache_invalidator;