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
- Add the connector option: `CREATE SINK s FROM t WITH (connector = 'kafka', ...)`.
- Check for typos in the property key — it must be exactly `connector`.
- Drop and recreate the sink so the options are re-persisted and propagated.
- 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
- Always include `connector = '<name>'` in CREATE SINK WITH options.
- Check for key typos (`connector`, not `connecter`).
- Verify persisted properties via the catalog after creating a sink.
- Upgrade clients/drivers that may drop WITH options.
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
- Unknown sink connector: {sink_name}
- unsupported sink connector {}
- Unknown source connector: {connector_name}
- Field '{field}' is not allowed to be altered on the fly for
- Field '{field}' is not allowed to be altered on the fly for
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/d3426581dbba9f09.
Report an issue: GitHub.