{"record":{"id":"4bb7565489c3d463","repo":"risingwavelabs/risingwave","slug":"exchangechannelclosed","errorCode":null,"errorMessage":"ExchangeChannelClosed","messagePattern":"ExchangeChannelClosed","errorType":"error_code","errorClass":"StreamExecutorError","httpStatus":null,"severity":"error","filePath":"src/stream/src/executor/error.rs","lineNumber":88,"sourceCode":"    #[error(\"Sink error: sink_id={1}, error: {0}\")]\n    SinkError(\n        #[source]\n        #[backtrace]\n        SinkError,\n        SinkId,\n    ),\n\n    #[error(transparent)]\n    RpcError(\n        #[from]\n        #[backtrace]\n        RpcError,\n    ),\n\n    #[error(\"Channel closed: {0}\")]\n    ChannelClosed(String),\n\n    #[error(transparent)]\n    ExchangeChannelClosed(\n        #[from]\n        #[backtrace]\n        ExchangeChannelClosed,\n    ),\n\n    #[error(\"Failed to align barrier: expected `{0:?}` but got `{1:?}`\")]\n    AlignBarrier(Box<Barrier>, Box<Barrier>),\n\n    #[error(\"Connector error: {0}\")]\n    ConnectorError(\n        #[source]\n        #[backtrace]\n        BoxedError,\n    ),\n\n    #[error(transparent)]\n    DmlError(","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/executor/error.rs#L70-L106","documentation":"The ExchangeChannelClosed variant transparently wraps exchange::error::ExchangeChannelClosed. It is thrown when the exchange layer's data channel between actors (the network path moving stream chunks/barriers between compute nodes) is found closed. It uses #[from] so any ExchangeChannelClosed propagates automatically into StreamExecutorError.","triggerScenarios":"Produced by `?` on exchange send/recv operations in the exchange layer, wrapped here via From<ExchangeChannelClosed>. Happens when the remote endpoint of an inter-node/inter-actor exchange channel is closed.","commonSituations":"Remote compute node crashed or was killed; network disconnect during data exchange; actor terminated due to a fatal error upstream of the exchange.","solutions":["Inspect the wrapped ExchangeChannelClosed for which actor/channel closed.","Check the remote compute node's logs for the original failure (crash, panic, graceful stop).","Let the framework's failover restart affected actors and re-establish channels.","If recurring, check network stability and node resource limits between compute nodes."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// monitor exchange peer availability\nif !actor_manager.is_actor_alive(peer_actor_id) {\n    tracing::warn!(\"exchange peer actor {} not alive\", peer_actor_id);\n}","typeGuard":"fn is_exchange_closed(e: &StreamExecutorError) -> bool {\n    e.variant_name() == \"ExchangeChannelClosed\"\n}","tryCatchPattern":"match res {\n    Err(e) if e.variant_name() == \"ExchangeChannelClosed\" => {\n        // remote actor/node terminated; rely on actor restart/failover\n    }\n    other => other?,\n}","preventionTips":["Monitor compute node liveness between which exchange channels exist.","Treat any channel-closed as a symptom; find the root peer failure first.","Keep networks between compute nodes stable (no idle-connection killing LBs).","Enable structured logs on exchange send/recv failures for triage."],"tags":["exchange","network","channel","stream-executor"],"backgroundTag":"broken-pipe","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"}