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

When a file sink targets the Snowflake engine type, the connector checks whether the `SnowflakeSink` feature is licensed and available. If the deployment lacks a valid license key covering this premium feature, `check_available()` fails and the error is surfaced (wrapped with a hint to set a license key via `ALTER SYSTEM SET license_key = '...';`). This is RisingWave's license gating, not a configuration mistake in the sink itself.

Source

Thrown at src/connector/src/sink/file_sink/opendal_sink.rs:150

        crate::sink::validate_sink_unknown_fields(&self.unknown_fields)
    }

    /// A file is committed only once the batching strategy is met, so an untruncated barrier
    /// would block the checkpoint forever on the non-decoupled in-memory log store.
    fn is_sink_decouple(user_specified: &SinkDecouple) -> Result<bool> {
        match user_specified {
            SinkDecouple::Default | SinkDecouple::Enable => Ok(true),
            SinkDecouple::Disable => Err(SinkError::Config(anyhow!(
                "File sink can only be created with sink_decouple enabled. Please run `set sink_decouple = true` first."
            ))),
        }
    }

    async fn validate(&self) -> Result<()> {
        if matches!(self.engine_type, EngineType::Snowflake) {
            risingwave_common::license::Feature::SnowflakeSink
                .check_available()
                .map_err(|e| anyhow::anyhow!(e))?;
        }
        if !self.is_append_only {
            return Err(SinkError::Config(anyhow!(
                "File sink only supports append-only mode at present. \
                    Please change the query to append-only, and specify it \
                    explicitly after the `FORMAT ... ENCODE ...` statement. \
                    For example, `FORMAT xxx ENCODE xxx(force_append_only='true')`"
            )));
        }

        if self.format_desc.encode != SinkEncode::Parquet
            && self.format_desc.encode != SinkEncode::Json
        {
            return Err(SinkError::Config(anyhow!(
                "File sink only supports `PARQUET` and `JSON` encode at present."
            )));
        }

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Set a valid license key: `ALTER SYSTEM SET license_key = '...';`
  2. Verify the license covers the Snowflake sink feature for your edition
  3. If Snowflake output is not actually needed, create the sink without the Snowflake engine type (e.g. write files to S3/GCS directly)

Example fix

-- before
CREATE SINK s FROM mv WITH (connector = 'snowflake', ...);
-- after
ALTER SYSTEM SET license_key = 'rw-...';
CREATE SINK s FROM mv WITH (connector = 'snowflake', ...);
Defensive patterns

Strategy: validation

Validate before calling

-- verify license before creating Snowflake sink
ALTER SYSTEM SET license_key = '...';
SHOW PARAMETERS; -- confirm license applied
SELECT * FROM rw_catalog.rw_license; -- check feature availability if exposed

Try / catch

match err.message().contains("not available based on your license") {
    true => eprintln!("Set a license key first: ALTER SYSTEM SET license_key = '...';"),
    false => return Err(err),
}

Prevention

When it happens

Trigger: Creating a file sink with engine_type = Snowflake (e.g. `type = 'snowflake'` / snowflake engine) on a cluster without an applicable license key or on an edition that does not include the Snowflake sink feature.

Common situations: Running community/open-source RisingWave and attempting a Snowflake sink; license key expired or not yet set; evaluating premium features without enabling the trial license.

Related errors


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