risingwavelabs/risingwave · warning · MetaError

has been deprecated, please use instead.

Error message

{0} has been deprecated, please use {1} instead.

What it means

MetaError::Deprecated(String, String) reports that a deprecated API/feature has been used, and names the replacement: `{0} has been deprecated, please use {1} instead.` The meta service uses this to reject or warn about legacy RPC endpoints/fields that have been replaced by newer ones, guiding clients to migrate.

Solutions

  1. Read the error message: it names the exact replacement API to use
  2. Migrate the caller to the suggested new API/field
  3. Upgrade the risingwave CLI/dashboard or client library to a version matching the cluster
  4. Check release notes for the deprecation notice

Example fix

// before
client.deprecated_list_tables(req).await?;
// after
client.list_tables(req).await?; // renamed API per deprecation notice
Defensive patterns

Strategy: type-guard

Type guard

fn is_deprecation(e: &MetaError) -> Option<(&str, &str)> {
    match e {
        MetaError::Deprecated(old, new) => Some((old, new)),
        _ => None,
    }
}

Try / catch

match result {
    Err(MetaError::Deprecated(old, new)) => {
        tracing::warn!("{old} is deprecated, migrating to {new}");
        call_new_api(new)
    }
    r => r,
}

Prevention

When it happens

Trigger: A client (CLI, dashboard, old SDK) calls a deprecated meta RPC or passes a deprecated request field that the meta node's handler layer checks and rejects.

Common situations: Operating an older risingwave CLI/dashboard against a newer cluster; automation scripts still invoking renamed/removed admin APIs; skipping upgrade notes when rolling forward the cluster.

Understand the failure class

Background: "is deprecated and will be removed" — deprecation warnings for old API names, keywords, and options, and how to migrate before the removal release — this error's family across 29 libraries.

Related errors


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

Appendix: source

Thrown at src/meta/src/error.rs:138

        #[backtrace]
        SinkError,
    ),

    #[error(transparent)]
    Internal(
        #[from]
        #[backtrace]
        anyhow::Error,
    ),

    // Indicates that recovery was triggered manually.
    #[error("adhoc recovery triggered")]
    AdhocRecovery,

    #[error("Integrity check failed")]
    IntegrityCheckFailed,

    #[error("{0} has been deprecated, please use {1} instead.")]
    Deprecated(String, String),

    #[error(transparent)]
    NotImplemented(#[from] NotImplemented),

    #[error("Secret error: {0}")]
    SecretError(
        #[from]
        #[backtrace]
        SecretError,
    ),
}

impl MetaError {
    /// Provide the Postgres error code for the error.
    fn provide_postgres_error_code(&self, request: &mut std::error::Request<'_>) {
        match self.inner() {
            MetaErrorInner::CatalogIdNotFound { .. } => {

View on GitHub (pinned to 6469eb736d)