EpicGames/lore · error

Failed to create mutable store plugin

Error message

Failed to create mutable store plugin '{mode}': {e}

What it means

For any mutable-store mode not handled by the built-in local/remote/replicated/composite arms, the server delegates to the plugin registry: registry.create_mutable_store(mode, &plugin_config, immutable_store). If the plugin construction fails for any reason, the error is re-wrapped with context naming the mode via anyhow! at server.rs:973. The inner cause (plugin lookup failure, bad plugin config, backend connection error) is chained as the error source.

Solutions

  1. Inspect the chained cause of the anyhow error — it carries the plugin's underlying failure; fix that first.
  2. Confirm a plugin for this exact mode is registered (feature flag / plugin crate compiled into the binary).
  3. Validate the `[plugins.<mode>]` config table against the plugin's documented schema.
  4. Test connectivity/credentials of the plugin's backend service independently of lore-server.

Example fix

// before (settings.toml)
[mutable_store]
mode = "sqlite"
# no plugins config

// after (settings.toml)
[mutable_store]
mode = "sqlite"

[plugins.sqlite]
database_url = "sqlite:///var/lib/lore/mutable.db"
Defensive patterns

Strategy: try-catch

Validate before calling

// Rust, before launch: confirm the plugin mode is registered
fn plugin_mode_ready(registry: &PluginRegistry, mode: &str) -> bool {
    registry.has_mutable_store_plugin(mode) // adapt to your registry API
}

Try / catch

match configure_mutable_store_via_plugin(&registry, &settings, immutable).await {
    Ok(store) => store,
    Err(e) => {
        // anyhow chain carries the plugin's root cause
        for cause in e.chain() { eprintln!("caused by: {cause}"); }
        return Err(e.context("mutable store plugin failed"));
    }
}

Prevention

When it happens

Trigger: mutable_store.mode names a custom/plugin mode and create_mutable_store returns Err — e.g. no plugin registered for that mode, malformed `[plugins.*]` config for it, or the plugin's backend (database, S3, etc.) rejecting the configuration or connection.

Common situations: Typo in the plugin mode name so no factory matches; plugin crate/feature not compiled in; plugin config table missing required keys; the backing service is unreachable or credentials are wrong at first startup.

Related errors


AI-assisted analysis of EpicGames/lore@074eb0b0d1 (2026-09-13). Data as JSON: /api/errors/f10f234444d09962. Report an issue: GitHub.

Appendix: source

Thrown at lore-server/src/server.rs:973

                .ok_or(anyhow!("Missing remote mutable store settings"))?;

            configure_remote_mutable_store(remote_settings)
        }
        store_mode::REPLICATED => Err(anyhow!("replicated mutable store is not implemented")),
        store_mode::COMPOSITE => Err(anyhow!(
            "Invalid settings, cannot have composite store as mutable store"
        )),
        _ => {
            // All other modes use the plugin system
            let plugin_config =
                resolve_plugin_config_with_fallback(&settings.plugins, mode, "mutable_store")
                    .unwrap_or_else(|| toml::Value::Table(toml::map::Map::new()));

            info!(mode, "Creating mutable store via plugin system");

            registry
                .create_mutable_store(mode, &plugin_config, immutable_store)
                .map_err(|e| anyhow!("Failed to create mutable store plugin '{mode}': {e}"))
        }
    }
}

fn configure_lock_store_via_plugin(
    registry: &PluginRegistry,
    settings: &Settings,
) -> Result<Option<Arc<dyn LockStore>>> {
    if let Some(lock_settings) = &settings.lock_store {
        let mode = &lock_settings.mode;

        // The only way to opt out of a store `default.toml` sets.
        if mode == store_mode::NONE {
            info!("No lock store configured, LockService will not register");
            return Ok(None);
        }

        if mode == store_mode::LOCAL {

View on GitHub (pinned to 074eb0b0d1)