risingwavelabs/risingwave · error · StreamError

Failed to send barrier with epoch {epoch} to actor {actor_id

Error message

Failed to send barrier with epoch {epoch} to actor {actor_id}: {reason}

What it means

Raised when the system fails to deliver a barrier message to a stream actor: `Failed to send barrier with epoch {epoch} to actor {actor_id}: {reason}`. Barriers drive checkpointing and scheduling; a failed send means the actor did not receive the epoch's barrier, typically because its channel is closed or full.

Source

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

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

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

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Check whether the target actor crashed or was stopped — fix its root failure first
  2. Inspect `reason` and compute-node logs for the channel state at that epoch
  3. Retry barrier injection / let the barrier manager retry the epoch
  4. If recurring, check for actor migration or scale-in races in the meta service
Defensive patterns

Strategy: retry

Validate before calling

// before injecting a barrier, confirm the actor is alive:
// if actor_is_terminated(actor_id) { skip or recreate actor }

Try / catch

if let Err(e) = sender.send_barrier(barrier, actor_id).await {
    if !actor_alive(actor_id) { /* expected during failover: retry next epoch */ }
    else { log::error!("barrier send failed: {e}"); }
}

Prevention

When it happens

Trigger: The barrier manager or an upstream actor calls the barrier sender for a specific actor_id/epoch and the underlying channel send fails; `reason` is a static description of why.

Common situations: Actor already exited or being migrated when a barrier is broadcast; channel closed due to a prior actor failure; slow consumer with a closed/dropped channel during failover.

Related errors


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