risingwavelabs/risingwave · error · StreamExecutorError

DmlError

Error message

DmlError

What it means

The DmlError variant transparently wraps risingwave_dml::error::DmlError, the error type for the DML service layer that buffers user writes (INSERT/UPDATE/DELETE) before they enter the streaming graph. It is thrown when the executor's interaction with the DML buffer fails.

Solutions

  1. Inspect the wrapped DmlError for the concrete cause.
  2. Retry the DML statement — transient channel issues are resolved on actor recovery.
  3. Check whether the target table/relation was dropped or altered concurrently.
  4. Look at source executor logs around the failure epoch.
Defensive patterns

Strategy: retry

Validate before calling

// before writing, confirm the relation exists and accepts DML
if frontend.table_exists(table_id) && !frontend.is_schema_changing(table_id) {
    // safe to proceed with DML
}

Type guard

fn is_dml_error(e: &StreamExecutorError) -> bool {
    e.variant_name() == "DmlError"
}

Try / catch

match write_result {
    Err(e) if e.variant_name() == "DmlError" => {
        // transient DML channel issue: retry the statement
        retry_with_backoff(|| write_again()).await?;
    }
    other => other?,
}

Prevention

When it happens

Trigger: Raised via `?` where a DmlError is converted through the #[from] impl — e.g. when the DML channel to the source executor is broken, the table is being dropped/modified, or the write cannot be accepted.

Common situations: Client DML during a materialized-view/table schema change; the DML service channel closed while writes are in flight; frontend/back pressure causing buffer overflow or disconnect.

Related errors


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

Appendix: source

Thrown at src/stream/src/executor/error.rs:105

    #[error(transparent)]
    ExchangeChannelClosed(
        #[from]
        #[backtrace]
        ExchangeChannelClosed,
    ),

    #[error("Failed to align barrier: expected `{0:?}` but got `{1:?}`")]
    AlignBarrier(Box<Barrier>, Box<Barrier>),

    #[error("Connector error: {0}")]
    ConnectorError(
        #[source]
        #[backtrace]
        BoxedError,
    ),

    #[error(transparent)]
    DmlError(
        #[from]
        #[backtrace]
        DmlError,
    ),

    #[error(transparent)]
    NotImplemented(#[from] NotImplemented),

    #[error(transparent)]
    Uncategorized(
        #[from]
        #[backtrace]
        anyhow::Error,
    ),
}

/// Serialize/deserialize error.

View on GitHub (pinned to 6469eb736d)