risingwavelabs/risingwave · error

source not found in source manager

Error message

source {} not found in source manager

What it means

reset_source_splits looks up the given source_id in the in-memory SourceManager; this error fires when the source is not currently tracked (its entry was absent when the reset branch checked). Split reset only applies to sources the manager actively manages.

Solutions

  1. Confirm the source_id exists (SELECT from rw_sources / catalog)
  2. Re-check you are connected to the correct cluster/meta node
  3. Recreate or refresh the source so the manager registers it, then reset splits
Defensive patterns

Strategy: try-catch

Validate before calling

-- verify the source exists before resetting splits
SELECT id FROM rw_catalog.rw_sources WHERE id = <source_id>;

Try / catch

match manager.reset_source_splits(source_id).await {
    Err(e) if e.to_string().contains("not found in source manager") => {
        tracing::warn!("source {} already gone; skipping reset", source_id);
    }
    r => r?,
}

Prevention

When it happens

Trigger: Calling the split-reset path (debug/internal API) for a source_id that is not registered — source already dropped, never created on this meta node, or removed during recovery.

Common situations: Operator/tooling resetting splits for a stale source id after a DROP SOURCE; pointing a test utility at the wrong meta node; source removed between lookup and reset.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/0fff1adff7836a8f. Report an issue: GitHub.

Appendix: source

Thrown at src/meta/src/stream/source_manager.rs:601

            // Force a tick to re-discover splits
            tracing::info!(
                %source_id,
                "Triggering split re-discovery via force_tick"
            );
            handle.force_tick().await.with_context(|| {
                format!(
                    "failed to force tick for source {} after split reset",
                    source_id
                )
            })?;

            tracing::info!(
                %source_id,
                "Split reset completed - new splits will be assigned on next tick"
            );
            Ok(())
        } else {
            Err(anyhow::anyhow!("source {} not found in source manager", source_id).into())
        }
    }

    /// Validate split offsets before injecting them.
    /// Returns `Ok(applied_split_ids)` if all validations pass, otherwise returns an error.
    ///
    /// Validations performed:
    /// 1. Source exists in source manager
    /// 2. All requested split IDs exist in the source's current splits (runtime assignment)
    pub async fn validate_inject_source_offsets(
        &self,
        source_id: SourceId,
        split_offsets: &HashMap<String, String>,
    ) -> MetaResult<Vec<String>> {
        let (fragment_ids, env) = {
            let core = self.core.lock().await;

            // Check if source exists

View on GitHub (pinned to 6469eb736d)