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
- Prefix the URL with hummock+ : RW_HUMMOCK_URL=hummock+s3://bucket
- Check the meta node's state_store setting in the risedev config and reuse it verbatim with the hummock+ prefix.
- 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
- Keep the hummock+ prefix when copying state_store URLs from cluster config
- Export env vars in a shared profile script so they are never hand-retyped
- Prefer `./risedev d for-ctl` which sets the URL correctly
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
- env variable `RW_HUMMOCK_URL` not found. * start the cluste
- only Hummock state store is supported in risectl
- env variable `RW_META_ADDR` not found. For `./risedev d` us
- Storage error: {0}
- failed to parse meta address `{1}`: {0}
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/16ed9fb04104c16a.
Report an issue: GitHub.