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

  1. Check upstream actors' logs to find why the left input ended early (upstream panic, StopManual, backpressure bug).
  2. 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.
  3. Ensure the cluster is on a consistent version (no rolling upgrade skew between actors).
  4. 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

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


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)