{"record":{"id":"8e4c29e9b8a9d636","repo":"EpicGames/lore","slug":"missing-local-immutable-store-settings","errorCode":null,"errorMessage":"Missing local immutable store settings","messagePattern":"Missing local immutable store settings","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"lore-server/src/server.rs","lineNumber":887,"sourceCode":"    fn name(&self) -> &'static str {\n        \"QuicInternalStreamHandler\"\n    }\n}\n\nasync fn configure_immutable_store_via_plugin(\n    registry: &PluginRegistry,\n    settings: &Settings,\n    topology: Option<Arc<dyn Topology + Send + Sync>>,\n) -> Result<Arc<dyn ImmutableStore>> {\n    let mode = &settings.immutable_store.mode;\n\n    match mode.as_str() {\n        store_mode::LOCAL => {\n            let local_settings = settings\n                .immutable_store\n                .local\n                .as_ref()\n                .ok_or(anyhow!(\"Missing local immutable store settings\"))?;\n\n            configure_local_immutable_store(local_settings).await\n        }\n        store_mode::COMPOSITE => {\n            let composite_settings = settings\n                .immutable_store\n                .composite\n                .as_ref()\n                .ok_or(anyhow!(\"Missing composite store settings\"))?;\n\n            configure_composite_store(registry, composite_settings, settings, topology).await\n        }\n        store_mode::REPLICATED => {\n            let replicated_settings = settings\n                .immutable_store\n                .replicated\n                .as_ref()\n                .ok_or(anyhow!(\"Missing replicated store settings\"))?;","sourceCodeStart":869,"sourceCodeEnd":905,"githubUrl":"https://github.com/EpicGames/lore/blob/074eb0b0d1194c997d7cf28b55519e3e197b3e23/lore-server/src/server.rs#L869-L905","documentation":"Thrown by configure_immutable_store_via_plugin when the immutable store mode is \"local\" but settings.immutable_store.local is None. The local mode requires its dedicated settings block to construct the store; the absent section aborts configuration.","triggerScenarios":"immutable_store.mode = \"local\" in config while settings.immutable_store.local is None (no [immutable_store.local] subsection).","commonSituations":"Setting the mode to local without adding its data_dir/path options; typo in the TOML subsection name so it fails to deserialize; template config left with mode changed but subsection removed.","solutions":["Add an [immutable_store.local] section with the required local store options (e.g. path/data_dir).","Fix the subsection key spelling so it deserializes into settings.immutable_store.local.","Choose a different store mode matching the sections actually present in the config."],"exampleFix":"# before\n[immutable_store]\nmode = \"local\"\n\n# after\n[immutable_store]\nmode = \"local\"\n[immutable_store.local]\npath = \"/var/lib/lore/immutable\"","handlingStrategy":"validation","validationCode":"if settings.immutable_store.mode == \"local\" && settings.immutable_store.local.is_none() {\n    return Err(anyhow!(\"mode=local requires [immutable_store.local] settings\"));\n}","typeGuard":"fn local_store_configured(s: &ImmutableStoreSettings) -> bool {\n    s.mode != \"local\" || s.local.is_some()\n}","tryCatchPattern":null,"preventionTips":["Keep mode and its matching subsection together in config templates.","Add a CI check that every store mode has its corresponding settings block.","Watch for TOML typos in subsection keys that silently deserialize as None."],"tags":["configuration","store","startup"],"backgroundTag":"missing-required-config-field","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"}