risingwavelabs/risingwave · error · SinkError

invalid commit_checkpoint_interval

Error message

invalid commit_checkpoint_interval: {e}

What it means

The OpenSearch sink's set_default_commit_checkpoint_interval parses the `commit_checkpoint_interval` sink property as u64; a non-numeric or malformed value produces SinkError::Config with the parse error embedded in "invalid commit_checkpoint_interval: {e}". This happens during sink validation/setup before data flows.

Solutions

  1. Set commit_checkpoint_interval to a plain non-negative integer (checkpoint count), e.g. commit_checkpoint_interval='10'.
  2. Remove the property to let the default logic choose a value.
  3. If you intended a time-based interval, use the appropriate time-based option instead; this option counts checkpoints.

Example fix

// before
CREATE SINK s FROM mv WITH (connector='opensearch', commit_checkpoint_interval='30s');
// after
CREATE SINK s FROM mv WITH (connector='opensearch', commit_checkpoint_interval='30');
Defensive patterns

Strategy: validation

Validate before calling

-- commit_checkpoint_interval must be a plain u64 literal
-- accept: '1', '10'; reject: '30s', '1.5', '-1'

Try / catch

match err { SinkError::Config(m) if m.contains("invalid commit_checkpoint_interval") => fix_option_to_plain_integer(), other => return Err(other) }

Prevention

When it happens

Trigger: Creating an OpenSearch sink with a `commit_checkpoint_interval` property that fails u64::parse — e.g., "5s", "five", "1.5", negative numbers, or empty string.

Common situations: Users copy interval-style config like "30s" or "100ms" from other connectors, or typo the number, or include quotes/spaces.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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

Appendix: source

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

            Self::SINK_NAME,
            self.is_append_only,
        )?
        .into_log_sinker(self.config.concurrent_requests))
    }

    fn set_default_commit_checkpoint_interval(
        desc: &mut crate::sink::catalog::desc::SinkDesc,
        user_specified: &risingwave_common::session_config::sink_decouple::SinkDecouple,
    ) -> Result<()> {
        if crate::sink::is_sink_support_commit_checkpoint_interval(Self::SINK_NAME) {
            match desc
                .properties
                .get(crate::sink::decouple_checkpoint_log_sink::COMMIT_CHECKPOINT_INTERVAL)
            {
                Some(commit_checkpoint_interval) => {
                    let commit_checkpoint_interval = commit_checkpoint_interval
                        .parse::<u64>()
                        .map_err(|e| SinkError::Config(anyhow!(e)))?;
                    if std::matches!(user_specified, SinkDecouple::Disable)
                        && commit_checkpoint_interval > 1
                    {
                        return Err(SinkError::Config(anyhow!(
                            "config conflict: `commit_checkpoint_interval` larger than 1 means that sink decouple must be enabled, but session config sink_decouple is disabled"
                        )));
                    }
                }
                None => match user_specified {
                    risingwave_common::session_config::sink_decouple::SinkDecouple::Default
                    | risingwave_common::session_config::sink_decouple::SinkDecouple::Enable => {
                        desc.properties.insert(
                            crate::sink::decouple_checkpoint_log_sink::COMMIT_CHECKPOINT_INTERVAL.to_owned(),
                            crate::sink::decouple_checkpoint_log_sink::DEFAULT_COMMIT_CHECKPOINT_INTERVAL_WITH_SINK_DECOUPLE.to_string(),
                        );
                    }
                    risingwave_common::session_config::sink_decouple::SinkDecouple::Disable => {
                        desc.properties.insert(

View on GitHub (pinned to 6469eb736d)