{"record":{"id":"6de177b7238bc9de","repo":"risingwavelabs/risingwave","slug":"failed-to-send-the-start-response","errorCode":null,"errorMessage":"failed to send the start response","messagePattern":"failed to send the start response","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"warning","filePath":"src/meta/src/manager/sink_coordination/handle.rs","lineNumber":75,"sourceCode":"    }\n\n    pub(super) fn vnode_bitmap(&self) -> &Bitmap {\n        &self.vnode_bitmap\n    }\n\n    pub(super) fn start(\n        &mut self,\n        log_store_rewind_start_epoch: Option<u64>,\n    ) -> anyhow::Result<()> {\n        self.response_tx\n            .send(Ok(CoordinateResponse {\n                msg: Some(coordinate_response::Msg::StartResponse(\n                    StartCoordinationResponse {\n                        log_store_rewind_start_epoch,\n                    },\n                )),\n            }))\n            .map_err(|_| anyhow!(\"failed to send the start response\"))\n    }\n\n    pub(super) fn ack_aligned_initial_epoch(\n        &mut self,\n        aligned_initial_epoch: u64,\n    ) -> anyhow::Result<()> {\n        self.response_tx\n            .send(Ok(CoordinateResponse {\n                msg: Some(coordinate_response::Msg::AlignInitialEpochResponse(\n                    aligned_initial_epoch,\n                )),\n            }))\n            .map_err(|_| anyhow!(\"failed to send the start response\"))\n    }\n\n    pub(super) fn abort(self, status: Status) {\n        let _ = self.response_tx.send(Err(status));\n    }","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/meta/src/manager/sink_coordination/handle.rs#L57-L93","documentation":"`start` sends the StartCoordinationResponse over the gRPC response channel (`response_tx`) and maps a send failure to this error. A send fails only when the receiver side has been dropped — the client stream was closed/cancelled or the connection broke. Note this is a response-channel failure, not a transport send in the network sense.","triggerScenarios":"The sink writer disconnects or cancels its gRPC stream between connecting and receiving the StartCoordinationResponse; the coordinator is slow to start (e.g. blocked in init/alignment) and the client times out and closes the stream.","commonSituations":"Writer-side RPC timeouts set too low relative to coordinator startup time; network partition or writer restart right after connection; meta node overload delaying the coordinator loop.","solutions":["Retry the sink start; the writer will reconnect and receive the response.","Increase the writer's RPC/stream timeout so it does not cancel while the coordinator is still initializing.","Check meta node load and logs for delays between handle registration and `start` being called.","Treat this error as benign if the writer already aborted — the coordinator should log and drop the handle."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// writer/client side: wrap the coordination RPC with retry\nmatch client.start_coordination().await {\n    Err(e) if e.is_stream_closed() => retry_with_backoff(),\n    other => other,\n}","preventionTips":["Set writer RPC timeouts longer than worst-case coordinator startup.","Retry the coordination session on stream closure; it is safe to reconnect.","Monitor meta node load — slow coordinator loops cause client-side cancellations."],"tags":["rust","grpc","channel-closed","sink-coordination"],"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"}