EpicGames/lore · error
Missing composite remote store settings
Error message
Missing composite remote store settings
What it means
When building a composite immutable store, each substore is configured by mode. If a substore's mode is 'remote', CompositeSubStoreSettings.remote must be populated; otherwise the server refuses to start because there are no remote endpoint/settings to build the remote store from.
Solutions
- Add the [immutable_store.composite.<name>.remote] settings table for the substore that declares mode = "remote"
- Change the substore's mode to one whose settings you actually have (e.g. "local")
- Validate the composite settings struct before starting the server (serde default/required field checks)
Example fix
# before [[immutable_store.composite.main.stores]] mode = "remote" # after [[immutable_store.composite.main.stores]] mode = "remote" [immutable_store.composite.main.stores.remote] endpoints = ["http://remote-host:7447"]
Defensive patterns
Strategy: validation
Validate before calling
if store_mode == "remote" && composite_settings.remote.is_none() {
return Err("substore mode 'remote' requires [immutable_store.composite.<name>.remote] settings");
} Type guard
fn has_remote_settings(s: &CompositeSubStoreSettings) -> bool { s.remote.is_some() } Try / catch
match configure_composite_substore(®istry, mode, &settings, sub).await {
Err(e) if e.to_string().contains("Missing composite remote store settings") => {
eprintln!("config error: add remote settings for substore '{mode}'"); std::process::exit(2);
}
r => r?,
} Prevention
- Use serde deny_unknown_fields + explicit Option checks in a config pre-flight validator
- Lint the TOML config in CI: every substore mode must have a matching settings table
- Keep composite substore examples complete when copying between environments
When it happens
Trigger: The TOML settings define a composite store whose subs tore list includes mode = "remote", but the settings table for that substore has no [immutable_store.composite.*.remote] section, so settings.remote is None when configure_composite_substore unwraps it.
Common situations: Hand-edited config files where the remote block was deleted or mistyped (e.g. [[...stores]] entry with mode="remote" but the matching remote table missing); copying a local-only composite example and switching a substore mode to remote without adding its settings; env var templating that dropped the remote section.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- [environment.endpoint] auth_url is set but [server.auth] is…
- [environment.endpoint] auth_url and [server.auth]…
- Missing local mutable store settings
- Missing remote mutable store settings
- Missing composite replicated store settings
AI-assisted analysis of EpicGames/lore@074eb0b0d1 (2026-09-13).
Data as JSON: /api/errors/f988494c12d130f3.
Report an issue: GitHub.
Appendix: source
Thrown at lore-server/src/server.rs:1418
registry: &PluginRegistry,
mode: &str,
global_settings: &Settings,
settings: &CompositeSubStoreSettings,
) -> Result<Arc<dyn ImmutableStore>> {
match mode {
store_mode::LOCAL => {
let local_settings = settings
.local
.as_ref()
.ok_or(anyhow!("Missing composite local store settings"))?;
configure_local_immutable_store(local_settings).await
}
store_mode::REMOTE => {
let remote_settings = settings
.remote
.as_ref()
.ok_or(anyhow!("Missing composite remote store settings"))?;
configure_remote_immutable_store(remote_settings)
}
store_mode::COMPOSITE => Err(anyhow!(
"Composite store not supported as a composite substore"
)),
store_mode::REPLICATED => {
let replicated_settings = settings
.replicated
.as_ref()
.ok_or(anyhow!("Missing composite replicated store settings"))?;
configure_replicated_immutable_store(replicated_settings).await
}
_ => {
// All other modes use the plugin system
let plugin_config = resolve_plugin_config_with_fallback(
&global_settings.plugins,View on GitHub (pinned to 074eb0b0d1)