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 {