EpicGames/lore · error

Invalid settings, cannot have composite store as mutable…

Error message

Invalid settings, cannot have composite store as mutable store

What it means

A composite store is only meaningful as an immutable store (it combines local and remote sub-stores). configure_mutable_store_via_plugin explicitly rejects mode = "composite" for the mutable store with this anyhow error before any store is created. The rejection is unconditional: composite mutable stores are not supported by design.

Solutions

  1. Set mutable_store.mode to "local", "remote", or a plugin mode; keep "composite" only under [immutable_store].
  2. If you need tiered mutable behavior, configure a mutable-store plugin that offers the layering instead.
  3. Audit generated/templated configs so immutable-store values are never copied into the mutable section.

Example fix

// before (settings.toml)
[mutable_store]
mode = "composite"

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

[mutable_store.remote]
url = "https://storage.example.com"
Defensive patterns

Strategy: validation

Validate before calling

// Rust
fn validate_mutable_mode(settings: &Settings) -> Result<(), String> {
    if settings.mutable_store.mode == "composite" {
        return Err("composite is only valid for immutable_store".into());
    }
    Ok(())
}

Prevention

When it happens

Trigger: Settings contain `[mutable_store] mode = "composite"`, hitting the store_mode::COMPOSITE arm which always returns Err.

Common situations: Duplicating the `[immutable_store]` block as `[mutable_store]` during setup; confusing composite (immutable-only) with replicated semantics; scripting config generation from the immutable-store template.

Related errors


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

Appendix: source

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

            let local_settings = settings
                .mutable_store
                .local
                .as_ref()
                .ok_or(anyhow!("Missing local mutable store settings"))?;

            configure_local_mutable_store(local_settings, immutable_store).await
        }
        store_mode::REMOTE => {
            let remote_settings = settings
                .mutable_store
                .remote
                .as_ref()
                .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(

View on GitHub (pinned to 074eb0b0d1)