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
- Inspect the wrapped DmlError for the concrete cause.
- Retry the DML statement — transient channel issues are resolved on actor recovery.
- Check whether the target table/relation was dropped or altered concurrently.
- 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
- Avoid concurrent DDL on tables receiving heavy DML.
- Retry client DML on transient failures.
- Monitor DML buffer/channel backpressure metrics.
- Keep frontend and compute versions in sync.
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
- builder should have yielded a chunk
- cannot derive generated columns or the `_rw_timestamp`…
- Channel closed
- compaction resolver sink
- compaction resolver sink
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)