{"record":{"id":"f56c0706223b4495","repo":"risingwavelabs/risingwave","slug":"partial-graph-reset","errorCode":null,"errorMessage":"partial graph reset","messagePattern":"partial graph reset","errorType":"exception","errorClass":"anyhow","httpStatus":null,"severity":"warning","filePath":"src/stream/src/task/barrier_worker/managed_state.rs","lineNumber":530,"sourceCode":"        let state = must_match!(replace(self, PartialGraphStatus::Unspecified), PartialGraphStatus::Running(state) => state);\n        *self = PartialGraphStatus::Suspended(SuspendedPartialGraphState::new(\n            state,\n            Some((failed_actor, err)),\n            completing_futures,\n        ));\n    }\n\n    pub(super) fn start_reset(\n        &mut self,\n        partial_graph_id: PartialGraphId,\n        completing_futures: Option<FuturesOrdered<AwaitEpochCompletedFuture>>,\n        table_ids_to_clear: &mut HashSet<TableId>,\n    ) -> BoxFuture<'static, ResetPartialGraphOutput> {\n        match replace(self, PartialGraphStatus::Resetting) {\n            PartialGraphStatus::ReceivedExchangeRequest(pending_requests) => {\n                for (_, _, request) in pending_requests {\n                    if let TakeReceiverRequest::Remote { result_sender, .. } = request {\n                        let _ = result_sender.send(Err(anyhow!(\"partial graph reset\").into()));\n                    }\n                }\n                async move { ResetPartialGraphOutput { root_err: None } }.boxed()\n            }\n            PartialGraphStatus::Running(state) => {\n                assert_eq!(partial_graph_id, state.partial_graph_id);\n                info!(\n                    %partial_graph_id,\n                    \"start partial graph reset from Running\"\n                );\n                table_ids_to_clear.extend(state.table_ids.iter().copied());\n                SuspendedPartialGraphState::new(state, None, completing_futures)\n                    .reset()\n                    .boxed()\n            }\n            PartialGraphStatus::Suspended(state) => {\n                assert!(\n                    completing_futures.is_none(),","sourceCodeStart":512,"sourceCodeEnd":548,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/task/barrier_worker/managed_state.rs#L512-L548","documentation":"During a partial graph reset in the stream barrier worker (`start_reset`), any pending remote exchange-take requests are answered with an error containing 'partial graph reset'. This is not a failure of user code but the controlled signal sent to remote readers whose upstream actors are being torn down as part of graph reconfiguration.","triggerScenarios":"A barrier-driven partial graph reset occurs (e.g. actor reschedule, source drop, plan change) while remote exchange requests are pending in `ReceivedExchangeRequest` state; their result senders receive this error.","commonSituations":"Actors being migrated/rescheduled by the meta node; pausing/resuming or altering MVs causing upstream graph rebuilds; consumers of remote channels seeing a channel error during these operations.","solutions":["Generally no user action needed — consumers should propagate the error and let the new graph re-establish exchange channels.","If it recurs during every barrier, check cluster stability and meta/stream logs for reset loops.","Retry the affected query/stream consumption after the barrier completes.","If the reset never completes (root_err missing), inspect actor deployment state and report with logs."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match res {\n    Err(e) if e.to_string().contains(\"partial graph reset\") => { /* transient during graph reconfig: retry / reconnect */ }\n    other => other?,\n}","preventionTips":["Treat this as transient during actor rescheduling and retry downstream operations.","Keep the cluster stable; avoid frequent pause/alter operations during heavy ingestion.","Monitor meta/stream logs if the error recurs on every barrier."],"tags":["barrier","exchange","stream-graph","internal"],"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"}