{"record":{"id":"16ed9fb04104c16a","repo":"risingwavelabs/risingwave","slug":"only-url-starting-with-hummock-is-supported-in","errorCode":null,"errorMessage":"only url starting with 'hummock+' is supported in risectl","messagePattern":"only url starting with 'hummock\\+' is supported in risectl","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/ctl/src/common/hummock_service.rs","lineNumber":68,"sourceCode":"    pub object_store_metrics: Arc<ObjectStoreMetrics>,\n    pub storage_metrics: Arc<MonitoredStorageMetrics>,\n    pub compactor_metrics: Arc<CompactorMetrics>,\n}\n\nimpl HummockServiceOpts {\n    /// Recover hummock service options from env variable\n    ///\n    /// Currently, we will read these variables for meta:\n    ///\n    /// * `RW_HUMMOCK_URL`: hummock store address\n    pub fn from_env(\n        data_dir: Option<String>,\n        use_new_object_prefix_strategy: bool,\n    ) -> Result<Self> {\n        let hummock_url = match env::var(\"RW_HUMMOCK_URL\") {\n            Ok(url) => {\n                if !url.starts_with(\"hummock+\") {\n                    return Err(anyhow!(\n                        \"only url starting with 'hummock+' is supported in risectl\"\n                    ));\n                }\n                tracing::info!(\"using Hummock URL from `RW_HUMMOCK_URL`: {}\", url);\n                url\n            }\n            Err(_) => {\n                const MESSAGE: &str = \"env variable `RW_HUMMOCK_URL` not found.\n                    For `./risedev d` use cases, please do the following.\n                    * start the cluster with shared storage:\n                    - consider adding `use: minio` in the risedev config,\n                    - or directly use `./risedev d for-ctl` to start the cluster.\n                    * use `./risedev ctl` to use risectl.\n\n                    For production use cases,\n                    * please set `RW_HUMMOCK_URL` to the same address specified for the meta node.\n                \";\n                bail!(MESSAGE);","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/ctl/src/common/hummock_service.rs#L50-L86","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nexport RW_HUMMOCK_URL=\"s3://my-bucket/hummock_01\"\n// after\nexport RW_HUMMOCK_URL=\"hummock+s3://my-bucket/hummock_01\"","handlingStrategy":"validation","validationCode":"const url = process.env.RW_HUMMOCK_URL;\nif (!url?.startsWith(\"hummock+\")) throw new Error(\"RW_HUMMOCK_URL must start with 'hummock+'\");","typeGuard":"function isHummockUrl(u) { return typeof u === \"string\" && u.startsWith(\"hummock+\"); }","tryCatchPattern":null,"preventionTips":["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"],"tags":["risectl","hummock","env","url"],"backgroundTag":"invalid-env-var-value","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}