risingwavelabs/risingwave · error · SinkError::Coordinator

no coordinator

Error message

no coordinator

What it means

This error is returned by the default `new_coordinator` implementation of the sink commit coordinator trait, indicating that this sink connector does not provide a commit coordinator. It surfaces when a two-phase (decoupled) commit is requested for a sink whose implementation has no coordinator, typically non-Iceberg connectors.

Source

Thrown at src/connector/src/sink/mod.rs:903

        Ok(())
    }

    fn validate_unknown_fields(&self) -> Result<()> {
        Ok(())
    }

    async fn validate(&self) -> Result<()>;
    async fn new_log_sinker(&self, writer_param: SinkWriterParam) -> Result<Self::LogSinker>;

    fn is_coordinated_sink(&self) -> bool {
        false
    }

    async fn new_coordinator(
        &self,
        _iceberg_compact_stat_sender: Option<UnboundedSender<IcebergSinkCompactionUpdate>>,
    ) -> Result<SinkCommitCoordinator> {
        Err(SinkError::Coordinator(anyhow!("no coordinator")))
    }
}

pub trait SinkLogReader: Send {
    fn start_from(
        &mut self,
        start_offset: Option<u64>,
    ) -> impl Future<Output = LogStoreResult<()>> + Send + '_;
    /// Emit the next item.
    ///
    /// The implementation should ensure that the future is cancellation safe.
    fn next_item(
        &mut self,
    ) -> impl Future<Output = LogStoreResult<(u64, LogStoreReadItem)>> + Send + '_;

    /// Mark that all items emitted so far have been consumed and it is safe to truncate the log
    /// from the current offset.
    fn truncate(&mut self, offset: TruncateOffset) -> LogStoreResult<()>;

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Disable sink decoupling for this sink: `SET sink_decouple = false` and drop `commit_checkpoint_interval` > 1 from WITH options
  2. Check whether the connector supports a commit coordinator (Iceberg does); switch the sink to a supported connector if two-phase commit is required
  3. If implementing a new sink connector, override `new_coordinator` to return a real SinkCommitCoordinator
Defensive patterns

Strategy: validation

Validate before calling

// verify the connector supports a commit coordinator before enabling decouple
if !matches!(sink_type, SinkType::Iceberg) && (decouple_enabled || commit_interval > 1) {
    return Err("sink decouple requires a coordinator-capable connector (e.g. iceberg)");
}

Prevention

When it happens

Trigger: Creating a sink with sink decouple enabled (or commit_checkpoint_interval > 1) on a connector whose `SinkCommitter::new_coordinator` uses the default trait implementation that unconditionally returns `Err(SinkError::Coordinator(anyhow!("no coordinator")))`.

Common situations: Enabling sink_decouple for a Kafka/Doris/other sink that only supports integrated commit; misconfigured connector type; driver code attempting two-phase commit after a config validation gap.

Related errors


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