risingwavelabs/risingwave · error · StreamError
Executor error: {0}
Error message
Executor error: {0} What it means
This is the Executor variant of the stream engine ErrorKind: a StreamExecutorError from any streaming actor/executor is wrapped as `Executor error: {0}`. It is the standard funnel through which executor failures (channel issues, barrier handling, data errors) surface to the actor's error handler.
Source
Thrown at src/stream/src/error.rs:54
thiserror_ext::Construct,
)]
#[thiserror_ext(newtype(name = StreamError, backtrace))]
pub enum ErrorKind {
#[error("Storage error: {0}")]
Storage(
#[backtrace]
#[from]
StorageError,
),
#[error("Expression error: {0}")]
Expression(
#[from]
#[backtrace]
ExprError,
),
#[error("Executor error: {0}")]
Executor(
#[from]
#[backtrace]
StreamExecutorError,
),
#[error("Actor {actor_id} exited unexpectedly: {source}")]
UnexpectedExit {
actor_id: ActorId,
#[backtrace]
source: StreamError,
},
#[error("Failed to send barrier with epoch {epoch} to actor {actor_id}: {reason}", epoch = .barrier.epoch.curr)]
BarrierSend {
barrier: Barrier,
actor_id: ActorId,
reason: &'static str,View on GitHub (pinned to 6469eb736d)
Solutions
- Inspect the inner StreamExecutorError source for the real cause
- Check stream actor logs and the compute node for the failing executor
- Look for channel/barrier failures around the reported actor/epoch
- If caused by query logic, fix the query; if infra, restart the streaming job
Defensive patterns
Strategy: try-catch
Try / catch
if let Err(e) = actor_join_result {
if let Some(inner) = e.root_cause_downcast_ref::<StreamExecutorError>() {
log::error!("executor root cause: {inner}");
}
} Prevention
- Always inspect the inner error source, not the wrapper
- Watch actor/fragment health metrics to catch failures early
- Keep barrier and channel paths covered by tests
When it happens
Trigger: Any executor returns Err(StreamExecutorError) — e.g. barrier collection failure, channel send failure, inconsistent epoch, or an inner expression/storage error — converted via `#[from]`.
Common situations: Downstream channel closed while upstream still sends; barrier mismatched or lost; data-driven assertion failures inside operators; nested Expression/Storage errors re-wrapped.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- dynamic filter condition eval must return bool array
- below watermark check condition eval must return bool array
- next offset {:?} should be later than current offset {:?}
- new item epoch {} does not match current chunk offset epoch
- new item epoch {} does not exceed barrier offset epoch {}
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/743b39d2a06977d7.
Report an issue: GitHub.