{"record":{"id":"2a0d4be7cf0afb71","repo":"risingwavelabs/risingwave","slug":"reschedule-failed","errorCode":null,"errorMessage":"reschedule failed","messagePattern":"reschedule failed","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/ctl/src/cmd_impl/meta/reschedule.rs","lineNumber":132,"sourceCode":"            println!(\"\\tChange: {:?}\", reschedule.get_worker_actor_diff());\n        }\n\n        println!();\n    }\n\n    if !dry_run {\n        println!(\"---------------------------\");\n        let (success, revision) = meta_client\n            .reschedule(reschedules, revision, resolve_no_shuffle)\n            .await?;\n\n        if !success {\n            println!(\n                \"Reschedule failed, please check the plan or the revision, current revision is {}\",\n                revision\n            );\n\n            return Err(anyhow!(\"reschedule failed\"));\n        }\n\n        println!(\"Reschedule success, current revision is {}\", revision);\n    }\n\n    Ok(())\n}\n\n// It will match formats like `1:[1:+1,2:-1,3:1];2:[1:1,2:1]`, indicating which workers' actors need to change in quantity for each fragment.\nfn parse_plan(mut plan: String) -> Result<HashMap<u32, PbWorkerReschedule>> {\n    let mut reschedules = HashMap::new();\n    let regex = Regex::new(r\"^(\\d+):\\[((?:\\d+:[+-]?\\d+,?)+)]$\")?;\n    plan.retain(|c| !c.is_whitespace());\n\n    for fragment_reschedule_plan in plan.split(';') {\n        if fragment_reschedule_plan.is_empty() {\n            continue;\n        }","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/ctl/src/cmd_impl/meta/reschedule.rs#L114-L150","documentation":"The reschedule command submitted a fragment reschedule plan to the meta service but the reported success flag was false, so the command aborts with this error after printing the current plan revision.","triggerScenarios":"Running `risectl meta reschedule` with a plan that conflicts with the cluster's current revision, or a plan the meta service rejects (e.g. moving actors for a worker that no longer exists).","commonSituations":"Cluster topology changed between composing the plan and applying it (node failure/scale-down); stale revision from a previous reschedule; invalid worker ids in the plan.","solutions":["Re-run the reschedule with the current plan revision (fetch the latest revision first)","Adjust the plan to reference existing worker ids and valid fragment ids","Retry after the cluster stabilizes if a concurrent failover invalidated the plan"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"let latest = get_current_revision(&meta).await?;\nif plan_revision != latest {\n    return Err(anyhow!(\"stale plan revision {} != {}\", plan_revision, latest));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Fetch the latest revision immediately before rescheduling","Re-fetch worker/fragment state after cluster topology changes","Retry reschedule with a fresh plan after failures"],"tags":["rust","risingwave","reschedule","meta"],"backgroundTag":"operation-not-supported","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"}