risingwavelabs/risingwave · error

streaming job {job_id} not found

Error message

streaming job {job_id} not found

What it means

After resolving the ensemble's single job_id, render_actors_with_allocator fetches the StreamingJob model from job_map. If the job_id resolved from the entry fragments is not present in the loaded job map, this error is returned with the job ID.

Source

Thrown at src/meta/src/controller/scale.rs:978

        )
        .map_err(|_| {
            anyhow!(
                "entry fragments {:?} have inconsistent parallelism settings",
                entries.iter().copied().collect_vec()
            )
        })?;

        let (job_id, distribution_type, vnode_count) = Itertools::exactly_one(
            entry_fragments
                .iter()
                .map(|f| (f.job_id, f.distribution_type, f.vnode_count))
                .dedup(),
        )
        .map_err(|_| anyhow!("Multiple jobs found in no-shuffle ensemble"))?;

        let job = job_map
            .get(&job_id)
            .ok_or_else(|| anyhow!("streaming job {job_id} not found"))?;

        let database_resource_group = streaming_job_databases
            .get(&job_id)
            .and_then(|database_id| database_map.get(database_id))
            .unwrap()
            .resource_group
            .clone();

        let source_entry_fragment = entry_fragments.iter().find(|f| {
            let mask = f.fragment_type_mask;
            if mask.contains(FragmentTypeFlag::Source) {
                assert!(!mask.contains(FragmentTypeFlag::SourceScan))
            }
            mask.contains(FragmentTypeFlag::Source) && !mask.contains(FragmentTypeFlag::Dml)
        });

        let actor_template = EnsembleActorTemplate::render_new(
            job,

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Verify the reported job_id exists in the streaming job catalog; if dropped, remove the orphaned fragments or abort the rescale.
  2. Retry after the concurrent DDL completes.
  3. Ensure load_fragment_context fetches jobs for every fragment's job_id (not just a subset).
  4. Restore from meta backup if the job should exist.
Defensive patterns

Strategy: validation

Validate before calling

for fid in ensemble.component_ids() {
    let job_id = fragments[&fid].job_id;
    assert!(ctx.job_map.contains_key(&job_id), "job {job_id} of fragment {fid} not loaded");
}

Type guard

fn job_in_context(ctx: &LoadedFragmentContext, job_id: JobId) -> bool { ctx.job_map.contains_key(&job_id) }

Try / catch

let Some(job) = ctx.job_map.get(&job_id) else {
    warn!("job {job_id} disappeared mid-rescale; aborting render");
    return Err(anyhow!("streaming job {job_id} not found"));
};

Prevention

When it happens

Trigger: An ensemble whose fragments carry a job_id that the load stage did not fetch into job_map — e.g. fragments orphaned from a dropped job inside an ensemble, or a load/dedup bug excluding the job from the StreamingJob query.

Common situations: Rescale while a job is being dropped (fragments still present); migration leaving stale fragment rows; job IDs in fragments not matching any streaming_jobs entry.

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/3be070dd15af8fdb. Report an issue: GitHub.