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

  1. Wait for cluster recovery to complete, then retry the write.
  2. Check cluster health (`./risedev ctl cluster info` or meta dashboard) before resuming ingestion.
  3. 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

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


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)