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

  1. Inspect the inner StreamExecutorError source for the real cause
  2. Check stream actor logs and the compute node for the failing executor
  3. Look for channel/barrier failures around the reported actor/epoch
  4. 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

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


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