EpicGames/lore · error

Composite store not supported as a composite substore

Error message

Composite store not supported as a composite substore

What it means

Composite stores cannot themselves contain a composite substore; the implementation only supports local, remote, replicated, and plugin-provided modes as children. Requesting mode = "composite" for a substore is rejected outright at configuration time.

Solutions

  1. Flatten the nested composite configuration into a single-level list of local/remote/replicated subs tores
  2. Replace the nested composite substore with one of the supported modes or a plugin-provided store mode
  3. Pre-validate the substore mode list before server startup and reject 'composite' with a clearer message

Example fix

# before
[[immutable_store.composite.outer.stores]]
mode = "composite"

# after
[[immutable_store.composite.outer.stores]]
mode = "local"
[immutable_store.composite.outer.stores.local]
path = "/data/store"
Defensive patterns

Strategy: validation

Validate before calling

for store in &composite.stores {
    if store.mode == "composite" {
        return Err("nested composite subs tores are not supported; flatten the configuration");
    }
}

Type guard

fn is_nestable_mode(mode: &str) -> bool {
    matches!(mode, "local" | "remote" | "replicated")
}

Try / catch

match configure_composite_substore(&registry, mode, &settings, sub).await {
    Err(e) if e.to_string().contains("not supported as a composite substore") => {
        eprintln!("flatten nested composite config for '{mode}'"); std::process::exit(2);
    }
    r => r?,
}

Prevention

When it happens

Trigger: A composite store's substore list contains an entry with mode = "composite"; configure_composite_substore hits the store_mode::COMPOSITE match arm and returns this error unconditionally, before touching any settings.

Common situations: Recursive config authoring mistake: nesting a composite block inside another composite's stores list expecting recursive composition; copy-paste of the outer store block into the subs tore list.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

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

) -> 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,
                mode,
                "immutable_store",
            )
            .unwrap_or_else(|| toml::Value::Table(toml::map::Map::new()));

View on GitHub (pinned to 074eb0b0d1)