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
- Look for an earlier error/exit of the write-log executor in the same actor's logs
- Restart the actor so writer and reader halves are re-created together
- Verify channel pairing in the sink executor split (writer holds tx, consumer holds rx) hasn't been broken by recent changes
- 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
- Keep writer and reader halves created and dropped together in the executor split
- Log writer-side exits so a closed rx is explainable
- Add tests where the writer exits while the consumer is select!-waiting
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
- failed to send the rebuild-sink request to the reader
- channel closed
- Lance fragment write task stopped before accepting a record
- unable to send response: {:?}
- (dynamic: channel send error on shutdown signal)
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/d890ac70228fcd28.
Report an issue: GitHub.