risingwavelabs/risingwave · error

missing config: {}

Error message

missing config: {}

What it means

The sink executor requires a `connector` entry in the sink's user properties to select which sink implementation to build. The property is absent, so sink construction fails with a config error wrapped together with the sink ID. This fails at executor startup rather than dropping the sink silently.

Source

Thrown at src/stream/src/from_proto/sink.rs:253

            }
            if let Some(password) = jdbc_url.password {
                properties_with_secret.insert("password".to_owned(), password);
            }
            if let Some(table_name) = properties_with_secret.get("table.name") {
                properties_with_secret.insert("table".to_owned(), table_name.clone());
            }
            if let Some(schema_name) = properties_with_secret.get("schema.name") {
                properties_with_secret.insert("schema".to_owned(), schema_name.clone());
            }
            // TODO(kwannoel): Do we need to handle jdbc.query.timeout?
        }

        let connector = {
            let sink_type = properties_with_secret
                .get(CONNECTOR_TYPE_KEY)
                .ok_or_else(|| {
                    StreamExecutorError::from((
                        SinkError::Config(anyhow!("missing config: {}", CONNECTOR_TYPE_KEY)),
                        sink_id,
                    ))
                })?;

            let sink_type_str = sink_type.to_lowercase();
            match_sink_name_str!(
                sink_type_str.as_str(),
                SinkType,
                Ok(SinkType::SINK_NAME),
                |other: &str| {
                    Err(StreamExecutorError::from((
                        SinkError::Config(anyhow!("unsupported sink connector {}", other)),
                        sink_id,
                    )))
                }
            )?
        };

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Add the connector option: `CREATE SINK s FROM t WITH (connector = 'kafka', ...)`.
  2. Check for typos in the property key — it must be exactly `connector`.
  3. Drop and recreate the sink so the options are re-persisted and propagated.
  4. Check the sink's properties via the catalog (`SHOW SINKS` / rw_catalog) to confirm the option is stored.

Example fix

-- before
CREATE SINK s FROM t WITH (format = 'debezium');
-- after
CREATE SINK s FROM t WITH (connector = 'kafka', properties.bootstrap.server = 'localhost:9092', format = 'debezium');
Defensive patterns

Strategy: validation

Validate before calling

-- Verify the connector option exists before relying on the sink
SELECT name, properties FROM rw_catalog.rw_sinks WHERE name = 'my_sink';
-- properties must contain key 'connector'

Try / catch

// application-side: catch sink creation/startup failure and inspect properties
try {
    createSink(props);
} catch (e) {
    if (String(e).includes('missing config: connector')) {
        // re-create sink with connector option set
    }
}

Prevention

When it happens

Trigger: Creating a sink without `WITH (connector = '...')` (or the property being lost between meta and the compute node), so `properties_with_secret.get(CONNECTOR_TYPE_KEY)` returns None in `new_boxed_executor`.

Common situations: Typo such as `connecter` or `type` instead of `connector`; creating a sink through an API/client that drops WITH options; restoring from a state where properties were not persisted; older clients not supporting the connector option.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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