{"record":{"id":"ee4b02139fac70c6","repo":"risingwavelabs/risingwave","slug":"test-sink-only-support-in-test","errorCode":null,"errorMessage":"test sink only support in test","messagePattern":"test sink only support in test","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/test_sink.rs","lineNumber":52,"sourceCode":"type BuildBoxLogSinker = Box<dyn BuildBoxLogSinkerTrait>;\ntype BuildSinkCoordinator = Box<dyn BuildSinkCoordinatorTrait>;\npub const TEST_SINK_NAME: &str = \"test\";\n\n#[derive(Debug)]\npub struct TestSink {\n    param: SinkParam,\n}\n\nimpl EnforceSecret for TestSink {}\n\nimpl TryFrom<SinkParam> for TestSink {\n    type Error = SinkError;\n\n    fn try_from(param: SinkParam) -> Result<Self, Self::Error> {\n        if cfg!(any(madsim, test)) {\n            Ok(TestSink { param })\n        } else {\n            Err(SinkError::Config(anyhow!(\"test sink only support in test\")))\n        }\n    }\n}\n\nimpl Sink for TestSink {\n    type LogSinker = BoxLogSinker;\n\n    const SINK_NAME: &'static str = \"test\";\n\n    fn support_schema_change() -> bool {\n        true\n    }\n\n    async fn validate(&self) -> crate::sink::Result<()> {\n        Ok(())\n    }\n\n    async fn new_log_sinker(","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/test_sink.rs#L34-L70","documentation":"TestSink is only constructible when the binary is compiled for madsim or test (cfg! gate). Outside those builds, TryFrom<SinkParam> returns a Config error because the test sink must never run in production.","triggerScenarios":"Creating a sink with connector='test' (blackhole test sink) in a release/non-madsim build via CREATE SINK or SinkParam::try_from.","commonSituations":"Developer accidentally leaves connector='test' in a production DDL; e2e tooling referencing test sink against a release binary.","solutions":["Remove connector='test' from the sink definition and use a real sink connector","Rebuild/run with madsim only when intentionally testing in simulation","If testing, run under a test or madsim-compiled binary"],"exampleFix":"// before\nCREATE SINK s INTO test_sink WITH (connector = 'test');\n// after\nCREATE SINK s INTO kafka_sink WITH (connector = 'kafka', ...);","handlingStrategy":"validation","validationCode":"if (connector === 'test' && !isTestBuild) throw new Error('test sink only allowed in test builds')","typeGuard":null,"tryCatchPattern":"catch (SinkError::Config(e)) { reject DDL and surface message to user }","preventionTips":["Never ship connector='test' in production DDL","Review CREATE SINK statements in migrations","Use real connectors for staging/prod environments"],"tags":["config","test-only","sink"],"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-23T08:17:48.524Z"}