risingwavelabs/risingwave · error

failed to receive rebuild sink notify

Error message

failed to receive rebuild sink notify

What it means

While the sink executor consumes its write log (waiting on a rewind/rebuild future), it also listens on rebuild_sink_rx for messages from the writer (e.g. UpdateConfig from ALTER SINK CONFIG). If the channel closes with no message — the writer task is gone — recv returns None and the executor raises this error instead of silently proceeding.

Source

Thrown at src/stream/src/executor/sink.rs:897

                                    "failed to rewind the log reader"
                                );
                                Err(e)
                            }
                        }
                    } else {
                        Err(e)
                    }
                    .map_err(|e| StreamExecutorError::from((e, sink_param.sink_id)))?;
                }
            });
            let message = loop {
                select! {
                    result = &mut future => {
                        let Err(e): StreamExecutorResult<!> = result;
                        return Err(e);
                    }
                    result = rebuild_sink_rx.recv() => {
                        let message = result.ok_or_else(|| anyhow!("failed to receive rebuild sink notify"))?;
                        // Dropping the consumer costs a rewind, or a recovery when the log
                        // reader cannot rewind. Not worth it for an update that changes nothing.
                        if let RebuildSinkMessage::UpdateConfig(config) = &message
                            && !sink_config_has_changes(&sink_param.properties, config)
                        {
                            info!(
                                executor_id = %sink_writer_param.executor_id,
                                sink_id = %sink_param.sink_id,
                                "skip alter sink config because properties are unchanged"
                            );
                            continue;
                        }
                        break message;
                    }
                }
            };
            drop(future);
            match message {

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Look for an earlier error/exit of the write-log executor in the same actor's logs
  2. Restart the actor so writer and reader halves are re-created together
  3. Verify channel pairing in the sink executor split (writer holds tx, consumer holds rx) hasn't been broken by recent changes
  4. Escalate to RisingWave maintainers if reproducible — it signals an unexpected writer shutdown
Defensive patterns

Strategy: try-catch

Try / catch

let message = match rebuild_sink_rx.recv().await {
    Some(m) => m,
    None => return Err(anyhow!("failed to receive rebuild sink notify")),
};

Prevention

When it happens

Trigger: rebuild_sink_rx.recv() returns None while execute_consume_log is select!-waiting: the paired writer (execute_write_log side) dropped rebuild_sink_tx, typically because the write-log executor terminated.

Common situations: Writer task exited due to a prior error, actor cancellation racing with log consumption, or misrouted channel wiring after executor restart.

Related errors


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