EpicGames/lore · error

Notification plugin receiver background task failed

Error message

Notification plugin receiver background task failed: {e}

What it means

Notification plugins can hand back long-lived receiver background tasks. The server spawns each one into the endpoints JoinSet; if such a task completes with an Err, the join result is mapped to this error naming the underlying failure.

Solutions

  1. Inspect the wrapped inner error ({e}) to identify the receiver's actual failure (bind error, connection error, etc.)
  2. Fix the underlying resource issue (free the port, restore connectivity, correct credentials)
  3. Check the plugin config in [plugins.<name>] and restart the server; add monitoring/restart policy for the endpoints JoinSet
Defensive patterns

Strategy: try-catch

Try / catch

lore_spawn!(endpoints, async move {
    task.await.map_err(|e| anyhow::anyhow!("Notification plugin receiver background task failed: {e}"))
});
// consume JoinSet results and restart/alert on Err:
while let Some(res) = endpoints.join_next().await {
    if let Err(e) = res? { error!("receiver failed: {e}; restarting plugin receiver"); }
}

Prevention

When it happens

Trigger: A running notification plugin receiver task (e.g. a webhook listener or queue consumer) terminates with an error at runtime — bind failure, dropped connection, handler panic captured as Err — surfacing through task.await in configure_notification's spawned wrapper.

Common situations: Port already in use for a listening receiver; upstream service (e.g. message broker) unreachable; receiver task erroring after config/network changes while the server is up.

Related errors


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

Appendix: source

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

                .unwrap_or_else(|| toml::Value::Table(toml::map::Map::new()));

            let context = NotificationPluginContext {
                environment: environment.clone(),
                immutable_store: immutable_store.cloned(),
            };

            let output = registry
                .create_notification(plugin_name, &plugin_config, &context)
                .await
                .map_err(|e| {
                    anyhow::anyhow!("Failed to create notification plugin '{plugin_name}': {e}")
                })?;

            // Spawn background tasks for the receiver tasks from the plugin
            for task in output.receivers {
                lore_spawn!(endpoints, async move {
                    task.await.map_err(|e| {
                        anyhow::anyhow!("Notification plugin receiver background task failed: {e}")
                    })
                });
            }

            Ok((output.sender, None))
        }
    }
}

#[cfg(target_os = "linux")]
async fn log_base_address() {
    use tracing::warn;

    let executable =
        match std::env::current_exe().map(|executable| executable.to_str().map(|s| s.to_owned())) {
            Ok(executable) => executable,
            Err(e) => {
                warn!("Could not get path to current executable: {e:?}");

View on GitHub (pinned to 074eb0b0d1)