{"record":{"id":"51930898534ae1f4","repo":"risingwavelabs/risingwave","slug":"all-senders-are-dropped","errorCode":null,"errorMessage":"all senders are dropped","messagePattern":"all senders are dropped","errorType":"exception","errorClass":"ConnectorError","httpStatus":null,"severity":"error","filePath":"src/connector/src/source/cdc/source/reader.rs","lineNumber":247,"sourceCode":"            match result {\n                Ok(GetEventStreamResponse { events, .. }) => {\n                    tracing::trace!(\"receive {} cdc events \", events.len());\n                    let msgs = events.into_iter().map(SourceMessage::from).collect_vec();\n                    yield msgs;\n                }\n                Err(e) => {\n                    GLOBAL_ERROR_METRICS.user_source_error.report([\n                        \"cdc_source\".to_owned(),\n                        source_id.clone(),\n                        self.source_ctx.source_name.clone(),\n                        self.source_ctx.fragment_id.to_string(),\n                    ]);\n                    Err(e)?;\n                }\n            }\n        }\n\n        bail!(\"all senders are dropped\");\n    }\n}\n","sourceCodeStart":229,"sourceCodeEnd":250,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/source/cdc/source/reader.rs#L229-L250","documentation":"`into_data_stream` multiplexes split message streams into channel senders. If every sender (all split channels) has been dropped before completion, the select loop can never receive new messages, so it bails with \"all senders are dropped\" instead of hanging forever. This usually reflects a lifecycle bug or upstream cancellation rather than user data.","triggerScenarios":"All downstream receivers for the split streams are dropped (downstream actor failure/cancellation, barrier handler dropped channels, source executor being terminated) while `into_stream`/`into_data_stream` still waits for data.","commonSituations":"A downstream actor panicked or the stream chunk channel was closed due to backpressure/kill; cluster scale-in terminating executors; internal bug where channels are closed before the EOF sentinel is sent.","solutions":["Inspect downstream executor logs for panics or cancellation that dropped the receivers, and fix that root cause.","Restart the source/actor to rebuild channels; the error itself is unrecoverable by retry.","If it happens reproducibly, report/fix in reader.rs:247 — the loop should detect sender closure per-channel and only bail when all splits finished."],"exampleFix":"// before\nbail!(\"all senders are dropped\");\n// after\nbreak; // treat dropped senders as stream end if all splits completed normally","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match SourceReader::new(...).into_stream().await {\n    Ok(stream) => ..., // consume with backpressure-safe downstream\n    Err(e) if e.to_string().contains(\"all senders are dropped\") => {\n        tracing::error!(\"downstream channels closed; check downstream executor logs\");\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Watch for downstream actor panics/cancellations in cluster logs.","Avoid killing/scale-in of executors mid-snapshot without recovery.","Report reproducible occurrences — it usually signals an internal channel-lifecycle bug."],"tags":["cdc","channel","lifecycle","internal"],"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"}