{"record":{"id":"f10f234444d09962","repo":"EpicGames/lore","slug":"failed-to-create-mutable-store-plugin-mode-e","errorCode":null,"errorMessage":"Failed to create mutable store plugin '{mode}': {e}","messagePattern":"Failed to create mutable store plugin '(.+?)': (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lore-server/src/server.rs","lineNumber":973,"sourceCode":"                .ok_or(anyhow!(\"Missing remote mutable store settings\"))?;\n\n            configure_remote_mutable_store(remote_settings)\n        }\n        store_mode::REPLICATED => Err(anyhow!(\"replicated mutable store is not implemented\")),\n        store_mode::COMPOSITE => Err(anyhow!(\n            \"Invalid settings, cannot have composite store as mutable store\"\n        )),\n        _ => {\n            // All other modes use the plugin system\n            let plugin_config =\n                resolve_plugin_config_with_fallback(&settings.plugins, mode, \"mutable_store\")\n                    .unwrap_or_else(|| toml::Value::Table(toml::map::Map::new()));\n\n            info!(mode, \"Creating mutable store via plugin system\");\n\n            registry\n                .create_mutable_store(mode, &plugin_config, immutable_store)\n                .map_err(|e| anyhow!(\"Failed to create mutable store plugin '{mode}': {e}\"))\n        }\n    }\n}\n\nfn configure_lock_store_via_plugin(\n    registry: &PluginRegistry,\n    settings: &Settings,\n) -> Result<Option<Arc<dyn LockStore>>> {\n    if let Some(lock_settings) = &settings.lock_store {\n        let mode = &lock_settings.mode;\n\n        // The only way to opt out of a store `default.toml` sets.\n        if mode == store_mode::NONE {\n            info!(\"No lock store configured, LockService will not register\");\n            return Ok(None);\n        }\n\n        if mode == store_mode::LOCAL {","sourceCodeStart":955,"sourceCodeEnd":991,"githubUrl":"https://github.com/EpicGames/lore/blob/074eb0b0d1194c997d7cf28b55519e3e197b3e23/lore-server/src/server.rs#L955-L991","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Inspect the chained cause of the anyhow error — it carries the plugin's underlying failure; fix that first.","Confirm a plugin for this exact mode is registered (feature flag / plugin crate compiled into the binary).","Validate the `[plugins.<mode>]` config table against the plugin's documented schema.","Test connectivity/credentials of the plugin's backend service independently of lore-server."],"exampleFix":"// before (settings.toml)\n[mutable_store]\nmode = \"sqlite\"\n# no plugins config\n\n// after (settings.toml)\n[mutable_store]\nmode = \"sqlite\"\n\n[plugins.sqlite]\ndatabase_url = \"sqlite:///var/lib/lore/mutable.db\"","handlingStrategy":"try-catch","validationCode":"// Rust, before launch: confirm the plugin mode is registered\nfn plugin_mode_ready(registry: &PluginRegistry, mode: &str) -> bool {\n    registry.has_mutable_store_plugin(mode) // adapt to your registry API\n}","typeGuard":null,"tryCatchPattern":"match configure_mutable_store_via_plugin(&registry, &settings, immutable).await {\n    Ok(store) => store,\n    Err(e) => {\n        // anyhow chain carries the plugin's root cause\n        for cause in e.chain() { eprintln!(\"caused by: {cause}\"); }\n        return Err(e.context(\"mutable store plugin failed\"));\n    }\n}","preventionTips":["Verify the plugin crate/feature is compiled into the binary for every configured mode.","Validate [plugins.*] tables against each plugin's schema in CI.","Smoke-test backend connectivity (DB/S3) before starting lore-server.","Check the anyhow error chain, not just the top-level message, when debugging."],"tags":["plugin","mutable-store","configuration","startup"],"backgroundTag":"module-init-failed","analyzedSha":"074eb0b0d1194c997d7cf28b55519e3e197b3e23","analyzedAt":"2026-09-13T09:00:57.509Z","contentChangedAt":"2026-09-13T09:00:57.509Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}