{"record":{"id":"dd98264f1d55bb78","repo":"risingwavelabs/risingwave","slug":"turbopuffer-sink-can-only-be-created-with-sink-dec","errorCode":null,"errorMessage":"Turbopuffer sink can only be created with sink_decouple enabled","messagePattern":"Turbopuffer sink can only be created with sink_decouple enabled","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/turbopuffer.rs","lineNumber":279,"sourceCode":"        })\n    }\n}\n\nimpl Sink for TurbopufferSink {\n    type LogSinker = TurbopufferLogSinker;\n\n    const SINK_NAME: &'static str = TURBOPUFFER_SINK;\n\n    crate::impl_validate_sink_unknown_fields!();\n\n    async fn validate(&self) -> Result<()> {\n        Ok(())\n    }\n\n    fn is_sink_decouple(user_specified: &SinkDecouple) -> Result<bool> {\n        match user_specified {\n            SinkDecouple::Default | SinkDecouple::Enable => Ok(true),\n            SinkDecouple::Disable => Err(SinkError::Config(anyhow!(\n                \"Turbopuffer sink can only be created with sink_decouple enabled\"\n            ))),\n        }\n    }\n\n    async fn new_log_sinker(&self, writer_param: SinkWriterParam) -> Result<Self::LogSinker> {\n        let write_batch_size = self.config.write_batch_size;\n        let max_linger = Duration::from_secs(self.config.max_linger_second);\n        let writer = TurbopufferSinkWriter::new(\n            self.config.clone(),\n            self.schema.clone(),\n            self.pk_index,\n            self.namespace.clone(),\n            self.attribute_indices.clone(),\n            self.generated_schema.clone(),\n            write_batch_size,\n            max_linger,\n        )?;","sourceCodeStart":261,"sourceCodeEnd":297,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/turbopuffer.rs#L261-L297","documentation":"The Turbopuffer connector only implements an async (decoupled) log sinker, so it can only run with sink decoupling enabled. In `is_sink_decouple`, `sink_decouple = false` (SinkDecouple::Disable) returns a config error instead of falling back to a sync path that does not exist.","triggerScenarios":"Creating a Turbopuffer sink with `WITH (sink_decouple = false)` or `sink_decouple = 'disable'`.","commonSituations":"Users disabling decouple to try to lower end-to-end latency or for debugging, copying sink templates that set sink_decouple = false, environments where decouple was globally defaulted off and the user pinned it off.","solutions":["Remove the `sink_decouple` option entirely so the default (enabled) applies.","Explicitly set `sink_decouple = true` in the WITH options.","Check cluster-level sink decouple defaults if you expected it to be on."],"exampleFix":"// before\nWITH (connector='turbopuffer', namespace='docs', sink_decouple=false);\n\n// after\nWITH (connector='turbopuffer', namespace='docs', sink_decouple=true);","handlingStrategy":"validation","validationCode":"if (withClause.sink_decouple === false || withClause.sink_decouple === 'disable') {\n  throw new Error('turbopuffer sink requires sink_decouple enabled');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not copy sink_decouple=false from other connector templates","Leave sink_decouple unset to accept the connector's default"],"tags":["sink","turbopuffer","config","decouple"],"backgroundTag":"invalid-config-value","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"}