From ac7f52d303f9eae53421f4834ed1a64a67a9af8f Mon Sep 17 00:00:00 2001 From: "Lei, HUANG" <6406592+v0y4g3r@users.noreply.github.com> Date: Fri, 25 Nov 2022 11:25:57 +0800 Subject: [PATCH] fix: start datanode instance before frontend services (#634) --- src/cmd/src/standalone.rs | 9 ++++++++- src/datanode/src/datanode.rs | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/cmd/src/standalone.rs b/src/cmd/src/standalone.rs index 62fbd0e82d..b3a86e3fb3 100644 --- a/src/cmd/src/standalone.rs +++ b/src/cmd/src/standalone.rs @@ -164,8 +164,15 @@ impl StartCommand { .context(StartDatanodeSnafu)?; let mut frontend = build_frontend(fe_opts, &dn_opts, datanode.get_instance()).await?; + // Start datanode instance before starting services, to avoid requests come in before internal components are started. + datanode + .start_instance() + .await + .context(StartDatanodeSnafu)?; + info!("Datanode instance started"); + try_join!( - async { datanode.start().await.context(StartDatanodeSnafu) }, + async { datanode.start_services().await.context(StartDatanodeSnafu) }, async { frontend.start().await.context(StartFrontendSnafu) } )?; diff --git a/src/datanode/src/datanode.rs b/src/datanode/src/datanode.rs index 7e1b935a00..af62014697 100644 --- a/src/datanode/src/datanode.rs +++ b/src/datanode/src/datanode.rs @@ -88,9 +88,18 @@ impl Datanode { pub async fn start(&mut self) -> Result<()> { info!("Starting datanode instance..."); - self.instance.start().await?; - self.services.start(&self.opts).await?; - Ok(()) + self.start_instance().await?; + self.start_services().await + } + + /// Start only the internal component of datanode. + pub async fn start_instance(&mut self) -> Result<()> { + self.instance.start().await + } + + /// Start services of datanode. This method call will block until services are shutdown. + pub async fn start_services(&mut self) -> Result<()> { + self.services.start(&self.opts).await } pub fn get_instance(&self) -> InstanceRef {