risingwavelabs/risingwave · error · DmlError
DML is not permitted during cluster recovery (no available…
Error message
DML is not permitted during cluster recovery (no available table reader in streaming executors)
What it means
DmlError::NoReader is returned when a DML operation cannot proceed because no table reader is available in the streaming executors. This happens during cluster recovery: the streaming actors that would feed reads to the DML path are being recovered or are offline, so writes are temporarily not permitted.
Solutions
- Wait for cluster recovery to complete, then retry the write.
- Check cluster health (`./risedev ctl cluster info` or meta dashboard) before resuming ingestion.
- Configure ingestion clients to pause/retry on this error during maintenance windows.
Defensive patterns
Strategy: retry
Validate before calling
// check cluster is healthy before writing // e.g. verify all workers are RUNNING via meta dashboard/ctl before resuming ingestion
Try / catch
try { await insert(); }
catch (e) {
if (String(e).includes("no available table reader")) { await waitForRecovery(); await insert(); }
else throw e;
} Prevention
- Pause ingestion during failover/recovery maintenance
- Gate writers on cluster health checks
- Retry with exponential backoff after restarts
When it happens
Trigger: Executing INSERT/UPDATE/DELETE while the cluster is recovering (e.g. after a meta/worker failover) — the DML executor fails to obtain a table reader channel from the streaming framework.
Common situations: Writes sent immediately after a crash or failover before recovery completes; load balancers redirecting traffic to a node still recovering; automated ingestion pipelines not pausing during maintenance.
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
- a stream has reached the end but some other stream has not…
- adhoc recovery triggered
- Barrier read is unavailable for now. Likely the cluster is…
- cannot derive generated columns or the `_rw_timestamp`…
- cannot find StreamActor of actor
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/88c53bcaabdec0cd.
Report an issue: GitHub.
Appendix: source
Thrown at src/dml/src/error.rs:21
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/// The error type for DML operations.
#[derive(thiserror::Error, Debug)]
pub enum DmlError {
#[error("table schema has changed, please try again later")]
SchemaChanged,
#[error(
"DML is not permitted during cluster recovery (no available table reader in streaming executors)"
)]
NoReader,
#[error("table reader closed")]
ReaderClosed,
}
pub type Result<T> = std::result::Result<T, DmlError>;
View on GitHub (pinned to 6469eb736d)