{"record":{"id":"0266e8ae4d1661e9","repo":"risingwavelabs/risingwave","slug":"feature-feature-is-not-available-based-on-your","errorCode":null,"errorMessage":"feature {feature:?} is not available based on your license\n\nHint: You may want to set a license key with `ALTER SYSTEM SET license_key = '...';` command. For more information, visit https://go.risingwave.com/premium.","messagePattern":"feature (.+?) is not available based on your license\n\nHint: You may want to set a license key with `ALTER SYSTEM SET license_key = '\\.\\.\\.';` command\\. For more information, visit https://go\\.risingwave\\.com/premium\\.","errorType":"validation","errorClass":"FeatureNotAvailable","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/elasticsearch_opensearch/opensearch.rs","lineNumber":78,"sourceCode":"            pk_indices,\n            is_append_only: param.sink_type.is_append_only(),\n        })\n    }\n}\n\nimpl Sink for OpenSearchSink {\n    type LogSinker = AsyncTruncateLogSinkerOf<ElasticSearchOpenSearchSinkWriter>;\n\n    const SINK_NAME: &'static str = OPENSEARCH_SINK;\n\n    fn validate_unknown_fields(&self) -> Result<()> {\n        crate::sink::validate_sink_unknown_fields(&self.config)\n    }\n\n    async fn validate(&self) -> Result<()> {\n        risingwave_common::license::Feature::OpenSearchSink\n            .check_available()\n            .map_err(|e| anyhow::anyhow!(e))?;\n        self.config.validate_config(&self.schema)?;\n        let client = self.config.build_client(Self::SINK_NAME)?;\n        client.ping().await?;\n        Ok(())\n    }\n\n    fn validate_alter_config(config: &BTreeMap<String, String>) -> Result<()> {\n        OpenSearchConfig::from_btreemap(config.clone())?;\n        Ok(())\n    }\n\n    async fn new_log_sinker(&self, _writer_param: SinkWriterParam) -> Result<Self::LogSinker> {\n        Ok(ElasticSearchOpenSearchSinkWriter::new(\n            self.config.clone(),\n            self.schema.clone(),\n            self.pk_indices.clone(),\n            Self::SINK_NAME,\n            self.is_append_only,","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/elasticsearch_opensearch/opensearch.rs#L60-L96","documentation":"The OpenSearch sink requires the licensed Feature::OpenSearchSink, and check_available() failed — either no license key is set or the license does not cover the OpenSearch sink feature. validate() is called when creating or running the sink and rejects the sink before any data is written. The hint directs users to set a license key via ALTER SYSTEM SET license_key.","triggerScenarios":"Creating or validating an OpenSearch sink (`connector='opensearch'`) on a deployment whose license doesn't include Feature::OpenSearchSink, or without any license key.","commonSituations":"Running the free/community edition of RisingWave and attempting the premium OpenSearch sink; expired or downgraded license; Elasticsearch sinks work but OpenSearch is gated.","solutions":["Set a license key covering OpenSearch sink: ALTER SYSTEM SET license_key = '<key>';","Obtain a RisingWave premium license (see https://go.risingwave.com/premium).","Use the Elasticsearch sink (Feature::ElasticSearchSink) if your license covers it but not OpenSearch."],"exampleFix":"// before (fails)\nCREATE SINK s FROM mv WITH (connector='opensearch', ...);\n-- after: activate license first\nALTER SYSTEM SET license_key = 'eyJ...';\nCREATE SINK s FROM mv WITH (connector='opensearch', ...);","handlingStrategy":"try-catch","validationCode":"-- check the license feature is active before creating the sink\nSELECT * FROM rw_catalog.rw_license; -- verify key present and features cover opensearch_sink","typeGuard":null,"tryCatchPattern":"match err { SinkError::PermissionDenied(m) if m.contains(\"not available based on your license\") => prompt_for_license_key(), other => return Err(other) }","preventionTips":["Verify license coverage for premium features before designing sinks.","Set license_key via ALTER SYSTEM as part of cluster provisioning.","Monitor license expiry to avoid runtime failures."],"tags":["license","opensearch","sink","feature-gating"],"backgroundTag":"feature-not-enabled","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"}