risingwavelabs/risingwave · warning

Cannot alter the job {} because its creating backfill contai

Error message

Cannot alter the job {} because its creating backfill contains a scan type that does not support online rescheduling

What it means

During online rescheduling of a creating backfill job's parallelism, the meta node checks collect_online_unreschedulable_backfill_jobs for scan-type backfills that do not support online rescheduling (e.g. certain scan-based backfill strategies). If the job appears there, the parallelism change is rejected.

Source

Thrown at src/meta/src/stream/stream_manager.rs:978

    pub(crate) async fn reschedule_streaming_job_backfill_parallelism(
        &self,
        job_id: JobId,
        parallelism: Option<ParallelismPolicy>,
        deferred: bool,
    ) -> MetaResult<()> {
        let _reschedule_job_lock = self.reschedule_lock_write_guard().await;

        if !deferred {
            let creating_jobs = self.metadata_manager.list_creating_jobs().await?;

            if !creating_jobs.is_empty() {
                let jobs_with_unreschedulable_scan = self
                    .metadata_manager
                    .collect_online_unreschedulable_backfill_jobs(&creating_jobs)
                    .await?;

                if jobs_with_unreschedulable_scan.contains(&job_id) {
                    bail!(
                        "Cannot alter the job {} because its creating backfill contains a scan type that does not support online rescheduling",
                        job_id,
                    );
                }
            }
        }

        let commands = self
            .scale_controller
            .reschedule_backfill_parallelism_inplace(HashMap::from([(job_id, parallelism)]))
            .await?;

        if !deferred {
            let _source_pause_guard = self.source_manager.pause_tick().await;

            for (database_id, command) in commands {
                self.barrier_scheduler
                    .run_command(database_id, command)

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Wait for the backfill to complete, then change parallelism normally.
  2. Recreate the job with the target parallelism so no online reschedule is needed.
  3. Use a backfill mode that supports online rescheduling if mid-creation scaling is a requirement.

Example fix

// before: ALTER ... SET PARALLELISM while scan-type backfill is creating -> error
// after
-- wait until backfill done, then:
ALTER MATERIALIZED VIEW mv SET PARALLELISM = 8;
Defensive patterns

Strategy: try-catch

Validate before calling

-- avoid altering parallelism while a scan-type backfill is still creating
SELECT state FROM rw_streaming_jobs WHERE job_id = <id> AND state = 'Created';

Try / catch

match alter_parallelism(id, n).await {
    Err(e) if e.to_string().contains("does not support online rescheduling") => {
        // defer until backfill completes
        on_backfill_complete(id, move || alter_parallelism(id, n)).await
    }
    other => other,
}

Prevention

When it happens

Trigger: Calling reschedule_streaming_job_backfill_parallelism on a CREATING job whose backfill performs a scan type flagged as not online-reschedulable; the job_id is found in jobs_with_unreschedulable_scan.

Common situations: Altering parallelism of a MV/backfill using a scan-based backfill (e.g. table scan backfill without online reschedule support); scheduler/autoscaler adjusting worker counts while such backfills run; version-dependent behavior where older backfill plans lack reschedule metadata.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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