FuelLabs/fuel-core · critical

The state of the service is not started: {state:?}

Error message

The state of the service is not started: {state:?}

What it means

Service::from_combined_database builds a node from an existing CombinedDatabase, starts it, and awaits the state transition. If the resulting state is anything but Started (e.g. Stopped/Stopping), startup failed or a shutdown raced it, and this error is returned.

Source

Thrown at crates/fuel-core/src/service.rs:235

            Default::default(),
            Default::default(),
            #[cfg(feature = "rpc")]
            Default::default(),
        );
        Self::from_combined_database(combined_database, config).await
    }

    /// Creates and starts fuel node instance from service config and a pre-existing combined database
    pub async fn from_combined_database(
        combined_database: CombinedDatabase,
        config: Config,
    ) -> anyhow::Result<Self> {
        let mut listener = crate::ShutdownListener::spawn();
        let service = Self::new(combined_database, config, &mut listener)?;
        let state = service.start_and_await().await?;

        if !state.started() {
            return Err(anyhow::anyhow!(
                "The state of the service is not started: {state:?}"
            ));
        }
        Ok(service)
    }

    #[cfg(feature = "relayer")]
    /// Wait for the Relayer to be in sync with
    /// the data availability layer.
    ///
    /// Yields until the relayer reaches a point where it
    /// considered up to date. Note that there's no guarantee
    /// the relayer will ever catch up to the da layer and
    /// may fall behind immediately after this future completes.
    ///
    /// The only guarantee is that if this future completes then
    /// the relayer did reach consistency with the da layer for
    /// some period of time.

View on GitHub (pinned to b9d4d170da)

Solutions

  1. Check node logs for the underlying subsystem failure that preceded the shutdown — this error is only the symptom
  2. Ensure the database files are compatible with this fuel-core version and not corrupted
  3. Avoid sending shutdown signals until start has completed; sequence startup fully before teardown
  4. Use Service::new + explicit start if you need to inspect the state machine yourself

Example fix

// before
let service = Service::from_combined_database(db, config).await?; // opaque failure

// after
let mut listener = ShutdownListener::spawn();
let service = Service::new(db, config, &mut listener)?;
let state = service.start_and_await().await?;
tracing::info!(?state, "node state"); // inspect why it is not Started
if !state.started() { /* inspect logs / handle */ }
Defensive patterns

Strategy: try-catch

Validate before calling

// Rust embedder: pre-flight the pieces start() needs
fn preflight(db: &CombinedDatabase, config: &Config) -> anyhow::Result<()> {
    db.on_chain().latest_view()?; // DB readable
    ensure_free_port(&config.graphql_config.addr)?;
    Ok(())
}

Try / catch

match Service::from_combined_database(db, config).await { Err(e) if e.to_string().contains("state of the service is not started") => { /* scan logs for the failing subsystem; verify DB compatibility; do not resend shutdown early */ } r => r }

Prevention

When it happens

Trigger: Embedding fuel-core and calling from_combined_database when a subsystem fails during start (bad DB, port conflicts, misconfigured relayer) or when a shutdown signal arrives while start_and_await is pending — the service settles into a non-Started state.

Common situations: Custom node binaries reusing a database; CI tests that trigger shutdown early; a failing component (relayer, compression, gas price service) that stops the runner during boot; version mismatch between stored DB state and binary.

Related errors


AI-assisted analysis of FuelLabs/fuel-core@b9d4d170da (2026-08-16). Data as JSON: /api/errors/f80699f70f01e318. Report an issue: GitHub.