risingwavelabs/risingwave · error · ConnectorError

`debug_splits` is not allowed in release mode

Error message

`debug_splits` is not allowed in release mode

What it means

extract_prop_from_new_source strips the `debug_splits` property from source with_properties; in release builds (cfg(not(debug_assertions))) supplying it is a hard error. `debug_splits` is a developer-only knob to force specific splits in debug testing.

Solutions

  1. Remove the `debug_splits` property from the source's WITH options
  2. Use a debug build (debug_assertions enabled) if you genuinely need forced splits
  3. ALTER the source to drop the property, then retry the operation

Example fix

-- before
CREATE SOURCE s (...) WITH (connector = 'kafka', debug_splits = '...');
-- after
CREATE SOURCE s (...) WITH (connector = 'kafka');
Defensive patterns

Strategy: validation

Validate before calling

-- check the WITH clause before creating a source in release mode
SELECT * FROM rw_catalog.rw_sources WHERE name = 's'; -- inspect properties for debug_splits

Try / catch

match create_source(...) {
    Err(e) if e.to_string().contains("debug_splits") => {
        // strip the property and retry
    }
    r => r?,
}

Prevention

When it happens

Trigger: CREATE SOURCE ... WITH (debug_splits = '...') (or ALTER SOURCE adding it) against a release-mode RisingWave binary.

Common situations: Copying a WITH clause from a dev/nightly test setup into a production release deployment; reproducing a split assignment bug on prod by accident.

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/ea2ce01a14254893. Report an issue: GitHub.

Appendix: source

Thrown at src/meta/src/stream/source_manager/worker.rs:101

}

fn extract_prop_from_existing_source(source: &Source) -> ConnectorResult<ConnectorProperties> {
    let options_with_secret =
        WithOptionsSecResolved::new(source.with_properties.clone(), source.secret_refs.clone());
    let mut properties = ConnectorProperties::extract(options_with_secret, false)?;
    properties.init_from_pb_source(source);
    Ok(properties)
}
fn extract_prop_from_new_source(source: &Source) -> ConnectorResult<ConnectorProperties> {
    let options_with_secret = WithOptionsSecResolved::new(
        {
            let mut with_properties = source.with_properties.clone();
            let _removed = with_properties.remove(DEBUG_SPLITS_KEY);

            #[cfg(not(debug_assertions))]
            {
                if _removed.is_some() {
                    return Err(ConnectorError::from(anyhow::anyhow!(
                        "`debug_splits` is not allowed in release mode"
                    )));
                }
            }

            with_properties
        },
        source.secret_refs.clone(),
    );
    let mut properties = ConnectorProperties::extract(options_with_secret, true)?;
    properties.init_from_pb_source(source);
    Ok(properties)
}

/// Used to create a new [`ConnectorSourceWorkerHandle`] for a new source.
///
/// It will call [`ConnectorSourceWorker::tick()`] to fetch split metadata once before returning.
pub async fn create_source_worker(

View on GitHub (pinned to 6469eb736d)