{"record":{"id":"11a64c4b747a880e","repo":"risingwavelabs/risingwave","slug":"failed-to-send-barrier-with-epoch-epoch-to-actor","errorCode":null,"errorMessage":"Failed to send barrier with epoch {epoch} to actor {actor_id}: {reason}","messagePattern":"Failed to send barrier with epoch (.+?) to actor (.+?): (.+?)","errorType":"error_code","errorClass":"StreamError","httpStatus":null,"severity":"error","filePath":"src/stream/src/error.rs","lineNumber":68,"sourceCode":"        #[backtrace]\n        ExprError,\n    ),\n\n    #[error(\"Executor error: {0}\")]\n    Executor(\n        #[from]\n        #[backtrace]\n        StreamExecutorError,\n    ),\n\n    #[error(\"Actor {actor_id} exited unexpectedly: {source}\")]\n    UnexpectedExit {\n        actor_id: ActorId,\n        #[backtrace]\n        source: StreamError,\n    },\n\n    #[error(\"Failed to send barrier with epoch {epoch} to actor {actor_id}: {reason}\", epoch = .barrier.epoch.curr)]\n    BarrierSend {\n        barrier: Barrier,\n        actor_id: ActorId,\n        reason: &'static str,\n    },\n\n    #[error(\"Secret error: {0}\")]\n    Secret(\n        #[from]\n        #[backtrace]\n        SecretError,\n    ),\n\n    #[error(transparent)]\n    Uncategorized(\n        #[from]\n        #[backtrace]\n        anyhow::Error,","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/error.rs#L50-L86","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// before injecting a barrier, confirm the actor is alive:\n// if actor_is_terminated(actor_id) { skip or recreate actor }","typeGuard":null,"tryCatchPattern":"if let Err(e) = sender.send_barrier(barrier, actor_id).await {\n    if !actor_alive(actor_id) { /* expected during failover: retry next epoch */ }\n    else { log::error!(\"barrier send failed: {e}\"); }\n}","preventionTips":["Handle actor shutdown gracefully by closing channels only after drain","Retry barrier broadcast at the barrier manager","Avoid stopping actors mid-epoch during migrations"],"tags":["rust","streaming","barrier","checkpoint"],"backgroundTag":"broken-pipe","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}