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 <luofc@foxmail.com>
Signed-off-by: evenyag <realevenyag@gmail.com>
Co-authored-by: LFC <990479+MichaelScofield@users.noreply.github.com>
This commit is contained in:
Yingwen
2025-09-09 15:39:18 +08:00
committed by GitHub
parent 8380ae13c7
commit 53fc32b0da
8 changed files with 55 additions and 29 deletions

15
Cargo.lock generated
View File

@@ -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]]

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View File

@@ -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"

View File

@@ -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<Metasrv>,
http_server: HttpServer,
http_server: Either<Option<HttpServerBuilder>, 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::<Arc<Metasrv>>(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<SocketAddr> {
&self.bind_addr
}
pub fn mut_http_server(&mut self) -> &mut Either<Option<HttpServerBuilder>, 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(

View File

@@ -15,6 +15,7 @@
#![feature(result_flattening)]
#![feature(assert_matches)]
#![feature(hash_set_entry)]
#![feature(let_chains)]
pub mod bootstrap;
pub mod cache_invalidator;