risingwavelabs/risingwave · error · anyhow::Error

only url starting with 'hummock+' is supported in risectl

Error message

only url starting with 'hummock+' is supported in risectl

What it means

HummockService::from_env reads the RW_HUMMOCK_URL environment variable and requires the URL to carry the hummock+ scheme prefix (e.g. hummock+s3://bucket). Any RW_HUMMOCK_URL that does not start with 'hummock+' is rejected because risectl can only talk to state stores through the Hummock object-store abstraction.

Source

Thrown at src/ctl/src/common/hummock_service.rs:68

    pub object_store_metrics: Arc<ObjectStoreMetrics>,
    pub storage_metrics: Arc<MonitoredStorageMetrics>,
    pub compactor_metrics: Arc<CompactorMetrics>,
}

impl HummockServiceOpts {
    /// Recover hummock service options from env variable
    ///
    /// Currently, we will read these variables for meta:
    ///
    /// * `RW_HUMMOCK_URL`: hummock store address
    pub fn from_env(
        data_dir: Option<String>,
        use_new_object_prefix_strategy: bool,
    ) -> Result<Self> {
        let hummock_url = match env::var("RW_HUMMOCK_URL") {
            Ok(url) => {
                if !url.starts_with("hummock+") {
                    return Err(anyhow!(
                        "only url starting with 'hummock+' is supported in risectl"
                    ));
                }
                tracing::info!("using Hummock URL from `RW_HUMMOCK_URL`: {}", url);
                url
            }
            Err(_) => {
                const MESSAGE: &str = "env variable `RW_HUMMOCK_URL` not found.
                    For `./risedev d` use cases, please do the following.
                    * start the cluster with shared storage:
                    - consider adding `use: minio` in the risedev config,
                    - or directly use `./risedev d for-ctl` to start the cluster.
                    * use `./risedev ctl` to use risectl.

                    For production use cases,
                    * please set `RW_HUMMOCK_URL` to the same address specified for the meta node.
                ";
                bail!(MESSAGE);

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Prefix the URL with hummock+ : RW_HUMMOCK_URL=hummock+s3://bucket
  2. Check the meta node's state_store setting in the risedev config and reuse it verbatim with the hummock+ prefix.
  3. Alternatively start the cluster with `./risedev d for-ctl`, which exports a correctly formed RW_HUMMOCK_URL.

Example fix

// before
export RW_HUMMOCK_URL="s3://my-bucket/hummock_01"
// after
export RW_HUMMOCK_URL="hummock+s3://my-bucket/hummock_01"
Defensive patterns

Strategy: validation

Validate before calling

const url = process.env.RW_HUMMOCK_URL;
if (!url?.startsWith("hummock+")) throw new Error("RW_HUMMOCK_URL must start with 'hummock+'");

Type guard

function isHummockUrl(u) { return typeof u === "string" && u.startsWith("hummock+"); }

Prevention

When it happens

Trigger: Setting RW_HUMMOCK_URL to a raw object-store or filesystem URL (e.g. s3://bucket, file:///data) without the hummock+ prefix, then running any risectl command that builds a Hummock store.

Common situations: Copying the state_store URL from the compute node config (which omits the prefix) into RW_HUMMOCK_URL; hand-editing the env var and dropping the prefix; misunderstanding that risectl needs the hummock+-wrapped scheme.

Understand the failure class

Background: "is not a valid" / "Invalid ... value" environment variable errors: how libraries validate env vars and what to do when they reject yours — this error's family across 48 libraries.

Related errors


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