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
- Check whether the target actor crashed or was stopped — fix its root failure first
- Inspect `reason` and compute-node logs for the channel state at that epoch
- Retry barrier injection / let the barrier manager retry the epoch
- 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
- Handle actor shutdown gracefully by closing channels only after drain
- Retry barrier broadcast at the barrier manager
- Avoid stopping actors mid-epoch during migrations
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
- no upstream while snapshot epoch not set
- iceberg pk-index writer {} replacement input closed before i
- locality provider upstream ended unexpectedly during backfil
- Exchange executor should not have children!
- Iceberg source should not have input executor!
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/11a64c4b747a880e.
Report an issue: GitHub.