{"record":{"id":"2b9b701e40212096","repo":"risingwavelabs/risingwave","slug":"partial-graph-suspended","errorCode":null,"errorMessage":"partial graph suspended","messagePattern":"partial graph suspended","errorType":"exception","errorClass":"anyhow","httpStatus":null,"severity":"error","filePath":"src/stream/src/task/barrier_worker/mod.rs","lineNumber":551,"sourceCode":"                                    \"take receiver on unmatched partial graph term\"\n                                );\n                                anyhow!(\n                                    \"take receiver {:?} on unmatched partial graph term {} to current term {}\",\n                                    ids,\n                                    term_id,\n                                    graph.local_barrier_manager.term_id\n                                )\n                            } else {\n                                let (upstream_actor_id, actor_id) = ids;\n                                graph.new_actor_output_request(\n                                    actor_id,\n                                    upstream_actor_id,\n                                    request,\n                                );\n                                return;\n                            }\n                        }\n                        PartialGraphStatus::Suspended(_) => anyhow!(\"partial graph suspended\"),\n                        PartialGraphStatus::Resetting => anyhow!(\"partial graph resetting\"),\n                        PartialGraphStatus::Unspecified => unreachable!(),\n                    },\n                    Entry::Vacant(entry) => {\n                        entry.insert(PartialGraphStatus::ReceivedExchangeRequest(vec![(\n                            term_id, ids, request,\n                        )]));\n                        return;\n                    }\n                };\n                if let TakeReceiverRequest::Remote { result_sender, .. } = request {\n                    let _ = result_sender.send(Err(err.into()));\n                }\n            }\n            #[cfg(test)]\n            LocalActorOperation::GetCurrentLocalBarrierManager(sender) => {\n                let partial_graph_status = self\n                    .state","sourceCodeStart":533,"sourceCodeEnd":569,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/task/barrier_worker/mod.rs#L533-L569","documentation":"A TakeReceiver (exchange channel creation) request arrived while the target partial graph is in the Suspended state (typically after a scored stream error paused the graph pending a reset decision). The barrier worker cannot create the receiver and sends this error back to the remote requester.","triggerScenarios":"handle_actor_op matches PartialGraphStatus::Suspended(_) while processing LocalActorOperation::TakeReceiver for that partial graph id.","commonSituations":"Upstream actors keep requesting exchange channels while the downstream partial graph was suspended due to a stream error; recovery orchestration delay between suspend and reset.","solutions":["Wait for the partial graph to be reset/restarted and retry the TakeReceiver request with the new term id.","Inspect the root error that caused the suspension (reported via ResetPartialGraph response / ScoredStreamError).","Fix the underlying stream error (often a data or executor failure) that led to suspension.","Check that the meta node stops routing exchange requests to suspended graphs promptly."],"exampleFix":"// before: buffering requests into a suspended graph\nhandle_actor_op(TakeReceiver { partial_graph_id, .. });\n// after: check status first and retry after reset\nif matches!(status, PartialGraphStatus::Resetting | PartialGraphStatus::Suspended(_)) {\n    retry_after_reset(partial_graph_id, request);\n}","handlingStrategy":"retry","validationCode":"// skip sending when graph is known suspended/resetting\nif matches!(graph_status(partial_graph_id), Suspended(_) | Resetting) { defer_request(request); }","typeGuard":"fn is_suspended(err: &anyhow::Error) -> bool { err.to_string() == \"partial graph suspended\" }","tryCatchPattern":"// queue and replay after reset completes\nmatch result {\n    Err(e) if is_suspended(&e) || is_resetting(&e) => pending_queue.push(request),\n    other => other,\n}","preventionTips":["Back-pressure exchange channel creation while a graph is suspended.","Fix the root stream error that triggers suspension to shorten the suspended window.","Replay buffered requests only after ResetPartialGraph acknowledgement."],"tags":["streaming","barrier","graph-state","rpc"],"backgroundTag":"invalid-state-transition","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"}