risingwavelabs/risingwave · error
right barrier received while left stream end
Error message
right barrier received while left stream end
What it means
The Lookup executor's barrier alignment found the left input stream ended, yet a barrier then arrived from the right input. In RisingWave's two-input contract, upstreams end together or not at all; a barrier after the left side ended means the alignment invariant was broken, so the executor aborts the actor rather than producing undefined output.
Solutions
- Check upstream actors' logs to find why the left input ended early (upstream panic, StopManual, backpressure bug).
- Verify the plan topology: both Lookup inputs should drain together; re-plan/re-create the MV if the plan came from an older frontend version.
- Ensure the cluster is on a consistent version (no rolling upgrade skew between actors).
- If reproducible, capture the fragment graph and report; this is an internal invariant failure, not a user-fixable config issue.
Defensive patterns
Strategy: try-catch
Try / catch
// Wrap actor/stream construction so alignment errors surface as job failure:
match executor_result {
Err(e) if e.to_string().contains("barrier received while") => {
log::error!("upstream termination protocol violated: {e}");
// fail the actor / restart the stream graph
}
_ => {}
} Prevention
- Keep all nodes on the same RisingWave version to avoid protocol skew.
- Never manually terminate one upstream branch of a two-input executor in tests.
- Monitor actor failure logs for asymmetric upstream termination.
When it happens
Trigger: Raised inside align_barrier's passthrough loop: after observing a None from the left stream, the loop drains remaining right messages and hits a Message::Barrier from the right input.
Common situations: Version skew or a corrupt/misaligned plan where one upstream subtree finishes while another keeps sending barriers; actor scheduling or migration bugs causing asymmetric upstream termination; custom executors producing mismatched upstream lifecycles in tests.
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
- left barrier received while right stream end
- iceberg pk-index writer
- actor exited unexpectedly
- barrier reader closed unexpectedly
- below watermark check condition eval must return bool array
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/2319f906d4f033af.
Report an issue: GitHub.
Appendix: source
Thrown at src/stream/src/executor/lookup/sides.rs:145
RightBarrier,
}
'outer: loop {
let (side_status, side_barrier) = 'inner: loop {
// Prefer right
let select_result = match select(right.next(), left.next()).await {
future::Either::Left(x) => future::Either::Right(x),
future::Either::Right(x) => future::Either::Left(x),
};
match select_result {
future::Either::Left((None, _)) => {
// left stream end, passthrough right chunks
while let Some(msg) = right.next().await {
match msg? {
w @ Message::Watermark(_) => yield Either::Left(w),
c @ Message::Chunk(_) => yield Either::Left(c),
Message::Barrier(_) => {
bail!("right barrier received while left stream end");
}
}
}
break 'outer;
}
future::Either::Right((None, _)) => {
// right stream end, passthrough left chunks
while let Some(msg) = left.next().await {
match msg? {
w @ Message::Watermark(_) => yield Either::Right(w),
c @ Message::Chunk(_) => yield Either::Right(c),
Message::Barrier(_) => {
bail!("left barrier received while right stream end");
}
}
}
break 'outer;
}View on GitHub (pinned to 6469eb736d)