{"record":{"id":"15d512c184ee0cac","repo":"risingwavelabs/risingwave","slug":"no-meta-server-address-provided","errorCode":null,"errorMessage":"no meta server address provided","messagePattern":"no meta server address provided","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/rpc_client/src/meta_client.rs","lineNumber":2657,"sourceCode":"                    return Ok((channel, addr));\n                }\n                Err(e) => {\n                    tracing::warn!(\n                        error = %e.as_report(),\n                        \"Failed to connect to meta server {}, trying again\",\n                        addr,\n                    );\n                    last_error = Some(e);\n                }\n            }\n        }\n\n        if let Some(last_error) = last_error {\n            Err(anyhow::anyhow!(last_error)\n                .context(\"failed to connect to all meta servers\")\n                .into())\n        } else {\n            bail!(\"no meta server address provided\")\n        }\n    }\n\n    async fn connect_to_endpoint(endpoint: Endpoint) -> Result<Channel> {\n        let channel = endpoint\n            .http2_keep_alive_interval(Duration::from_secs(Self::ENDPOINT_KEEP_ALIVE_INTERVAL_SEC))\n            .keep_alive_timeout(Duration::from_secs(Self::ENDPOINT_KEEP_ALIVE_TIMEOUT_SEC))\n            .connect_timeout(Duration::from_secs(5))\n            .monitored_connect(\"grpc-meta-client\", Default::default())\n            .await?\n            .wrapped();\n\n        Ok(channel)\n    }\n\n    pub(crate) fn retry_strategy_to_bound(\n        high_bound: Duration,\n        exceed: bool,","sourceCodeStart":2639,"sourceCodeEnd":2675,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/rpc_client/src/meta_client.rs#L2639-L2675","documentation":"In the same endpoint-iteration loop, if the configured meta server address list is empty, MetaClient construction bails with 'no meta server address provided'. It is a configuration error: the client was asked to connect without any candidate endpoints.","triggerScenarios":"Constructing MetaClient with an empty `meta_addr` list — e.g. env var RW_META_ADDR/meta endpoints unset or empty, or programmatic construction passing `vec![]`.","commonSituations":"Missing RUST_LOG-style env config in deployments; config file omits `server.meta_endpoints`; tests forgetting to start an in-memory meta and pass no addresses; k8s service env vars not injected.","solutions":["Set the meta address env var (e.g. RW_META_NODE=... / `--meta-addr`) or config `meta_endpoints` to at least one valid address","Check startup command/config file actually passes the address list to MetaClient::new","In tests, ensure the embedded meta service is started and its address is passed in"],"exampleFix":"// before\nMetaClient::new(None, Vec::new(), ...).await // -> no meta server address provided\n// after\nlet addrs = std::env::var(\"RW_META_ADDR\")?;\nassert!(!addrs.is_empty(), \"meta address required\");\nMetaClient::new(None, addrs.split(',').map(String::from).collect(), ...).await","handlingStrategy":"validation","validationCode":"// Before constructing the client:\nfn validate_meta_addrs(addrs: &[String]) -> Result<(), String> {\n    if addrs.is_empty() { Err(\"at least one meta server address must be provided\".into()) } else { Ok(()) }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Fail fast at startup if meta address env/config is empty","Use config templates that include server.meta_endpoints","In tests, assert the embedded meta address is set before client creation"],"tags":["configuration","meta-service","grpc"],"backgroundTag":"missing-required-config-field","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}