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
- Call LiveNodeBuilder::with_event_store(...) with a factory before calling build().
- Remove the event_store entry from LiveNodeConfig if no persistence is desired.
- 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
- Pair config fields that need factories with builder wiring in one setup function.
- Add an integration test that builds the node from the same config source used in production.
- Prefer the LiveNodeBuilder API whenever persistence is involved.
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
- LiveNodeConfig.event_store is set but LiveNode::build cannot
- Invalid NodeState value
- Binance v2 does not support instrument filter_callable {filt
- default_leverage requires spot_account_type=Margin
- Kraken Spot does not support the demo environment
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/dacf2575457de71d.
Report an issue: GitHub.