mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-01-05 21:02:58 +00:00
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:
15
Cargo.lock
generated
15
Cargo.lock
generated
@@ -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]]
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#![feature(result_flattening)]
|
||||
#![feature(assert_matches)]
|
||||
#![feature(hash_set_entry)]
|
||||
#![feature(let_chains)]
|
||||
|
||||
pub mod bootstrap;
|
||||
pub mod cache_invalidator;
|
||||
|
||||
Reference in New Issue
Block a user