{"record":{"id":"c4c3f8046fc34c96","repo":"risingwavelabs/risingwave","slug":"no-active-streaming-workers-for-reschedule","errorCode":null,"errorMessage":"no active streaming workers for reschedule","messagePattern":"no active streaming workers for reschedule","errorType":"error_code","errorClass":"MetaError","httpStatus":null,"severity":"error","filePath":"src/meta/src/barrier/worker.rs","lineNumber":263,"sourceCode":"                }\n            }\n        }\n        _ => {\n            new_barrier.command = Some((command, notifier));\n            Ok(Some(new_barrier))\n        }\n    }\n}\n\nfn build_reschedule_from_context(\n    env: &MetaSrvEnv,\n    worker_nodes: HashMap<WorkerId, WorkerNode>,\n    database_id: DatabaseId,\n    context: RescheduleContext,\n    database_info: &InflightDatabaseInfo,\n) -> MetaResult<Option<crate::barrier::ReschedulePlan>> {\n    if worker_nodes.is_empty() {\n        return Err(anyhow!(\"no active streaming workers for reschedule\").into());\n    }\n\n    if context.is_empty() {\n        return Ok(None);\n    }\n\n    // Barrier worker resolves this intent against a stable in-flight snapshot.\n    // Reuse the same fragment view for preview comparison and command building.\n    let all_prev_fragments = database_info\n        .fragment_infos()\n        .map(|fragment| (fragment.fragment_id, fragment))\n        .collect();\n\n    let previewed = preview_actor_assignments(&worker_nodes, &context.loaded)?;\n\n    if rendered_layout_matches_current(&previewed.fragments, &all_prev_fragments)? {\n        return Ok(None);\n    }","sourceCodeStart":245,"sourceCodeEnd":281,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/meta/src/barrier/worker.rs#L245-L281","documentation":"build_reschedule_from_context refuses to build a ReschedulePlan when the provided worker_nodes map is empty, returning `no active streaming workers for reschedule`. A reschedule needs live compute nodes to place fragments on; with zero candidates there is no valid plan, so the intent fails fast.","triggerScenarios":"resolve_reschedule_intent forwards an empty worker_nodes HashMap — i.e. the cluster has no active streaming worker nodes at the moment a reschedule (scale/fragment placement) is requested or a barrier triggers recomputation.","commonSituations":"All compute nodes crashed or were drained/decommissioned while streaming jobs still need placement; startup ordering where meta is up before any compute node registers; misconfigured risedev profile omitting compute nodes.","solutions":["Ensure compute nodes are running and registered: check `SHOW CLUSTERS;` / worker liveness and restart failed compute nodes.","Verify the deployment profile includes compute nodes (e.g. risedev profile with compute-node entries).","After adding nodes, trigger recovery so pending reschedule intents are retried against the new worker set.","Check meta logs for worker deregistration (heartbeat loss) that emptied the worker map."],"exampleFix":"// before: rescheduling without checking worker availability\nplan = build_reschedule_from_context(env, workers, db, ctx, info)?;\n// after: bail out with a clear precondition\nensure!(!workers.is_empty(), \"start compute nodes before requesting reschedule\");","handlingStrategy":"validation","validationCode":"// refuse to reschedule with no live workers\nlet workers = env.worker_nodes().await?;\nif workers.is_empty() {\n    return Err(anyhow!(\"start compute nodes before rescheduling\"));\n}","typeGuard":"fn has_active_workers(workers: &HashMap<WorkerId, WorkerNode>) -> bool {\n    !workers.is_empty()\n}","tryCatchPattern":"match err {\n    e if e.to_string().contains(\"no active streaming workers\") => {\n        start_compute_nodes().await?; // then trigger recovery to retry the intent\n    }\n    e => return Err(e.into()),\n}","preventionTips":["Keep at least one healthy compute node registered at all times.","Use deployment profiles that include compute nodes (verify risedev profile).","Alert on worker-count drop to zero via meta monitoring."],"tags":["meta","reschedule","workers","cluster"],"backgroundTag":"empty-result-set","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}