{"record":{"id":"4750b38197544939","repo":"risingwavelabs/risingwave","slug":"source-backfill-fragment-s-upstream-fragment-shoul-4750b3","errorCode":null,"errorMessage":"source backfill fragment's upstream fragment should have one-on-one no_shuffle mapping, fragment_id: {fragment_id}, upstream_fragment_id: {upstream_source_fragment_id}, upstream_actor: {upstream_actor}, source_new_no_shuffle: {source_new_no_shuffle:?}","messagePattern":"source backfill fragment's upstream fragment should have one-on-one no_shuffle mapping, fragment_id: (.+?), upstream_fragment_id: (.+?), upstream_actor: (.+?), source_new_no_shuffle: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/meta/src/stream/source_manager/split_assignment.rs","lineNumber":312,"sourceCode":"\n                let mut backfill_actors = vec![];\n                let Some(source_new_no_shuffle) = actor_no_shuffle\n                    .get(&upstream_source_fragment_id)\n                    .and_then(|source_upstream_actor_no_shuffle| {\n                        source_upstream_actor_no_shuffle.get(&fragment_id)\n                    })\n                else {\n                    return Err(anyhow::anyhow!(\n                            \"source backfill fragment's upstream fragment should have one-on-one no_shuffle mapping, fragment_id: {fragment_id}, upstream_fragment_id: {upstream_source_fragment_id}, actor_no_shuffle: {actor_no_shuffle:?}\",\n                            fragment_id = fragment_id,\n                            upstream_source_fragment_id = upstream_source_fragment_id,\n                            actor_no_shuffle = actor_no_shuffle,\n                        ).into());\n                };\n                for upstream_actor in &upstream_actors {\n                    let Some(no_shuffle_backfill_actor) = source_new_no_shuffle.get(upstream_actor)\n                    else {\n                        return Err(anyhow::anyhow!(\n                            \"source backfill fragment's upstream fragment should have one-on-one no_shuffle mapping, fragment_id: {fragment_id}, upstream_fragment_id: {upstream_source_fragment_id}, upstream_actor: {upstream_actor}, source_new_no_shuffle: {source_new_no_shuffle:?}\",\n                            fragment_id = fragment_id,\n                            upstream_source_fragment_id = upstream_source_fragment_id,\n                            upstream_actor = upstream_actor,\n                            source_new_no_shuffle = source_new_no_shuffle\n                        ).into());\n                    };\n                    backfill_actors.push((*no_shuffle_backfill_actor, *upstream_actor));\n                }\n                assigned.insert(\n                    fragment_id,\n                    align_splits(\n                        backfill_actors,\n                        |actor_id| get_upstream_actor_splits(upstream_source_fragment_id, actor_id),\n                        fragment_id,\n                        upstream_source_fragment_id,\n                    )?,\n                );","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/meta/src/stream/source_manager/split_assignment.rs#L294-L330","documentation":"Companion check to the fragment-level one: for each upstream actor in the no_shuffle mapping there must be a corresponding downstream backfill actor in `source_new_no_shuffle`. This error names the specific upstream_actor whose 1:1 counterpart is missing.","triggerScenarios":"resolve_backfill_splits iterates upstream actors and one upstream actor has no entry in the downstream no_shuffle map — actor counts differ between upstream and downstream fragments (not strictly 1:1).","commonSituations":"Parallelism mismatch between upstream fragment and backfill fragment; a partial actor rewrite during source replacement or rescale leaving upstream/downstream actor sets unaligned.","solutions":["Check parallelism of upstream vs backfill fragments matches for no_shuffle edges","Retry the operation after any in-flight rescale completes","Inspect source_new_no_shuffle in logs to find the missing actor pair","Recreate the backfill MV to restore a consistent actor mapping"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// ensure upstream actor count equals downstream no_shuffle actor count\nassert_eq!(upstream_actors.len(), source_new_no_shuffle.len());","typeGuard":null,"tryCatchPattern":"if let Err(e) = resolve_backfill_splits(...) {\n    if e.to_string().contains(\"upstream_actor\") && e.to_string().contains(\"no_shuffle\") {\n        // actor mapping misaligned: recreate backfill MV\n    }\n}","preventionTips":["Keep parallelism equal across no_shuffle-connected fragments","Finish rescales before source replacement/backfill migration"],"tags":["rust","meta","source-backfill","actor-mapping"],"backgroundTag":"internal-invariant-violation","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}