risingwavelabs/risingwave · error · FeatureNotAvailable

feature {feature:?} is not available based on your license

Error message

feature {feature:?} is not available based on your license

Hint: You may want to set a license key with `ALTER SYSTEM SET license_key = '...';` command. For more information, visit https://go.risingwave.com/premium.

What it means

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.

Source

Thrown at src/connector/src/sink/elasticsearch_opensearch/opensearch.rs:78

            pk_indices,
            is_append_only: param.sink_type.is_append_only(),
        })
    }
}

impl Sink for OpenSearchSink {
    type LogSinker = AsyncTruncateLogSinkerOf<ElasticSearchOpenSearchSinkWriter>;

    const SINK_NAME: &'static str = OPENSEARCH_SINK;

    fn validate_unknown_fields(&self) -> Result<()> {
        crate::sink::validate_sink_unknown_fields(&self.config)
    }

    async fn validate(&self) -> Result<()> {
        risingwave_common::license::Feature::OpenSearchSink
            .check_available()
            .map_err(|e| anyhow::anyhow!(e))?;
        self.config.validate_config(&self.schema)?;
        let client = self.config.build_client(Self::SINK_NAME)?;
        client.ping().await?;
        Ok(())
    }

    fn validate_alter_config(config: &BTreeMap<String, String>) -> Result<()> {
        OpenSearchConfig::from_btreemap(config.clone())?;
        Ok(())
    }

    async fn new_log_sinker(&self, _writer_param: SinkWriterParam) -> Result<Self::LogSinker> {
        Ok(ElasticSearchOpenSearchSinkWriter::new(
            self.config.clone(),
            self.schema.clone(),
            self.pk_indices.clone(),
            Self::SINK_NAME,
            self.is_append_only,

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Set a license key covering OpenSearch sink: ALTER SYSTEM SET license_key = '<key>';
  2. Obtain a RisingWave premium license (see https://go.risingwave.com/premium).
  3. Use the Elasticsearch sink (Feature::ElasticSearchSink) if your license covers it but not OpenSearch.

Example fix

// before (fails)
CREATE SINK s FROM mv WITH (connector='opensearch', ...);
-- after: activate license first
ALTER SYSTEM SET license_key = 'eyJ...';
CREATE SINK s FROM mv WITH (connector='opensearch', ...);
Defensive patterns

Strategy: try-catch

Validate before calling

-- check the license feature is active before creating the sink
SELECT * FROM rw_catalog.rw_license; -- verify key present and features cover opensearch_sink

Try / catch

match err { SinkError::PermissionDenied(m) if m.contains("not available based on your license") => prompt_for_license_key(), other => return Err(other) }

Prevention

When it happens

Trigger: Creating or validating an OpenSearch sink (`connector='opensearch'`) on a deployment whose license doesn't include Feature::OpenSearchSink, or without any license key.

Common situations: Running the free/community edition of RisingWave and attempting the premium OpenSearch sink; expired or downgraded license; Elasticsearch sinks work but OpenSearch is gated.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/0266e8ae4d1661e9. Report an issue: GitHub.