risingwavelabs/risingwave · error · StreamError

Actor exited unexpectedly

Error message

Actor {actor_id} exited unexpectedly: {source}

What it means

Raised when a streaming actor terminates with an error instead of completing normally: the actor's exit is reported as `Actor {actor_id} exited unexpectedly: {source}`. It wraps the actor ID plus the underlying StreamError, so operators can tell which fragment/actor failed and why.

Solutions

  1. Read `source` and the actor_id to identify the failing fragment and root error
  2. Check compute node logs around that actor for panics or OOM
  3. Fix the root cause (query logic, resource limits, infra)
  4. Recover the streaming job; RisingWave will attempt to rebuild the failed actor
Defensive patterns

Strategy: try-catch

Try / catch

match actor_handle.await {
    Ok(Ok(())) => {}
    Ok(Err(e)) | Err(e) => log::error!("actor {} exited unexpectedly: {}", actor_id, e),
}

Prevention

When it happens

Trigger: The stream manager observes an actor's JoinHandle resolving to an error (actor panic captured as error, executor returned Err), and reports it via this ErrorKind variant.

Common situations: A bug in an executor causes it to return an error; OOM or panic inside an actor; upstream infra failure cascading into actor shutdown; materialized view background job dies.

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/c0cff462102d7995. Report an issue: GitHub.

Appendix: source

Thrown at src/stream/src/error.rs:61

        #[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,
    },

    #[error("Secret error: {0}")]
    Secret(
        #[from]
        #[backtrace]
        SecretError,

View on GitHub (pinned to 6469eb736d)