nautechsystems/nautilus_trader · error

LiveNodeConfig.event_store is set but no factory was registe

Error message

LiveNodeConfig.event_store is set but no factory was registered; call LiveNodeBuilder::with_event_store(...) to install one

What it means

During LiveNodeBuilder::build, the config declares an event_store but no event store factory was installed on the builder via with_event_store, so the node cannot construct its event store. The builder fails fast instead of silently dropping events.

Source

Thrown at crates/live/src/node/builder.rs:567

    /// This will:
    /// 1. Build the underlying kernel.
    /// 2. Create clients using factories.
    /// 3. Register clients with engines.
    ///
    /// # Errors
    ///
    /// Returns an error if node construction fails.
    pub fn build(mut self) -> anyhow::Result<LiveNode> {
        log::info!(
            "Building LiveNode with {} data clients and {} execution clients",
            self.data_client_factories.len(),
            self.exec_client_factories.len()
        );

        self.config.validate_runtime_support()?;

        if self.config.event_store.is_some() && self.event_store_factory.is_none() {
            anyhow::bail!(
                "LiveNodeConfig.event_store is set but no factory was registered; \
                 call LiveNodeBuilder::with_event_store(...) to install one"
            );
        }

        if self.external_msgbus_factory.is_some()
            && (self.external_msgbus_egress.is_some() || self.external_msgbus_ingress.is_some())
        {
            anyhow::bail!(
                "external message bus factory cannot be combined with injected egress or ingress"
            );
        }

        let runner = AsyncRunner::new();
        runner.bind_senders();

        let socket_registry = SocketReconnectRegistry::default();

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Call LiveNodeBuilder::with_event_store(...) with a factory before calling build().
  2. Remove the event_store entry from LiveNodeConfig if no persistence is desired.
  3. Ensure the config-loading path does not inject event_store settings unintentionally.

Example fix

// before
let node = LiveNodeBuilder::new(config)?; // config.event_store = Some(...)
    .build()?;
// after
let node = LiveNodeBuilder::new(config)?
    .with_event_store(Box::new(MyEventStoreFactory::new(store_config)))
    .build()?;
Defensive patterns

Strategy: validation

Validate before calling

assert!(config.event_store.is_none() || event_store_factory_installed, "event_store set without factory");

Try / catch

match result { Err(e) if e.to_string().contains("with_event_store") => { /* wire factory and rebuild */ }, Err(e) => return Err(e), Ok(node) => Ok(node) }

Prevention

When it happens

Trigger: Setting LiveNodeConfig.event_store = Some(...) (e.g. via a config file or Config construction) while building with a LiveNodeBuilder that never had with_event_store(...) called.

Common situations: Loading a LiveNodeConfig from TOML/JSON that enables an event store, then passing it to the builder without registering the factory; refactoring code from LiveNode::build to the builder path (or vice versa) and dropping the factory wiring.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/dacf2575457de71d. Report an issue: GitHub.