risingwavelabs/risingwave · error · BackupError

overwrite_hummock_storage_endpoint, overwrite_backup_storage

Error message

overwrite_hummock_storage_endpoint, overwrite_backup_storage_url, overwrite_backup_storage_directory must be set simultaneously

What it means

dispatch validates restore options: if `overwrite_hummock_storage_endpoint` is true, both `overwrite_backup_storage_url` and `overwrite_backup_storage_directory` must also be provided, since the snapshot's stored endpoints will be overwritten and need replacement values. Partial specification is rejected.

Source

Thrown at src/meta/src/backup_restore/restore.rs:216

        )
        .await?;
    }

    Ok(())
}

async fn dispatch<L: Loader<S>, W: Writer<S>, S: Metadata>(
    target_id: MetaSnapshotId,
    opts: &RestoreOpts,
    loader: L,
    writer: W,
) -> BackupResult<()> {
    // Validate parameters.
    if opts.overwrite_hummock_storage_endpoint
        && (opts.overwrite_backup_storage_url.is_none()
            || opts.overwrite_backup_storage_directory.is_none())
    {
        return Err(BackupError::Other(anyhow::anyhow!("overwrite_hummock_storage_endpoint, overwrite_backup_storage_url, overwrite_backup_storage_directory must be set simultaneously".to_owned())));
    }

    // Restore meta store.
    let target_snapshot = loader.load(target_id).await?;
    if !opts.overwrite_hummock_storage_endpoint {
        let storage_url = target_snapshot.metadata.storage_url()?;
        if storage_url != opts.hummock_storage_url {
            return Err(BackupError::Other(anyhow::anyhow!(
                "storage_url mismatch: {} {}",
                storage_url,
                opts.hummock_storage_url
            )));
        }
        let storage_directory = target_snapshot.metadata.storage_directory()?;
        if storage_directory != opts.hummock_storage_directory {
            return Err(BackupError::Other(anyhow::anyhow!(
                "storage_directory mismatch: {} {}",
                storage_directory,

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Provide all three options together: overwrite_hummock_storage_endpoint=true plus explicit overwrite_backup_storage_url and overwrite_backup_storage_directory
  2. Or set overwrite_hummock_storage_endpoint=false to reuse the snapshot's stored endpoints
  3. Review the restore command/config so all override flags are consistent

Example fix

// before
RestoreOpts { overwrite_hummock_storage_endpoint: true, overwrite_backup_storage_url: None, .. }
// after
RestoreOpts { overwrite_hummock_storage_endpoint: true, overwrite_backup_storage_url: Some(url), overwrite_backup_storage_directory: Some(dir), .. }
Defensive patterns

Strategy: validation

Validate before calling

if opts.overwrite_hummock_storage_endpoint
    && (opts.overwrite_backup_storage_url.is_none() || opts.overwrite_backup_storage_directory.is_none()) {
    return Err(anyhow!("must set overwrite_backup_storage_url and overwrite_backup_storage_directory together"));
}

Prevention

When it happens

Trigger: Running a restore with overwrite_hummock_storage_endpoint enabled but omitting overwrite_backup_storage_url and/or overwrite_backup_storage_directory.

Common situations: Disaster-recovery restore into a different cloud environment where only some of the three override flags were supplied; typos in long CLI flag names.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


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