{"record":{"id":"bbed5b6ae1d27b73","repo":"quickwit-oss/quickwit","slug":"no-server-currently-available","errorCode":null,"errorMessage":"no server currently available","messagePattern":"no server currently available","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-codegen/src/codegen.rs","lineNumber":1252,"sourceCode":"        };\n        methods.extend(method);\n    }\n    (bounds, methods)\n}\n\nfn generate_grpc_client_adapter(context: &CodegenContext) -> TokenStream {\n    let service_name = &context.service_name;\n    let service_name_string = service_name.to_string();\n    let grpc_client_package_name = &context.grpc_client_package_name;\n    let grpc_client_package_name_string = &context.package_name.to_string();\n    let grpc_client_name = &context.grpc_client_name;\n    let grpc_client_adapter_name = &context.grpc_client_adapter_name;\n    let grpc_server_adapter_methods = generate_grpc_client_adapter_methods(context);\n    let extra_grpc_server_adapter_methods = if context.generate_extra_service_methods {\n        quote! {\n            async fn check_connectivity(&self) -> anyhow::Result<()> {\n                if self.connection_addrs_rx.borrow().is_empty() {\n                    anyhow::bail!(\"no server currently available\")\n                }\n                Ok(())\n            }\n\n            fn endpoints(&self) -> Vec<quickwit_common::uri::Uri> {\n                self.connection_addrs_rx\n                    .borrow()\n                    .iter()\n                    .flat_map(|addr| quickwit_common::uri::Uri::from_str(&format!(\"grpc://{addr}/{}.{}\", #grpc_client_package_name_string, #service_name_string)))\n                    .collect()\n            }\n        }\n    } else {\n        TokenStream::new()\n    };\n\n    quote! {\n        #[derive(Debug, Clone)]","sourceCodeStart":1234,"sourceCodeEnd":1270,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-codegen/src/codegen.rs#L1234-L1270","documentation":"Emitted by generated code (quickwit-codegen) in the `check_connectivity` method of the gRPC client adapter. The adapter tracks connected server addresses in `connection_addrs_rx`; when that list is empty there is no gRPC server to route requests to, so the adapter refuses calls with this error instead of failing at channel establishment time.","triggerScenarios":"Calling `check_connectivity()` or any service method on a generated gRPC client (e.g. GrpcSearchServiceAdapter) when no server address has ever been registered or all registered servers have disconnected (the watcher drained `connection_addrs_rx`).","commonSituations":"Quickwit started as a searcher-only node with no local gRPC services, the target server process is down or still booting, cluster topology changed and the client's server watch observed all peers leaving, or misconfigured chitchat/gRPC ports.","solutions":["Verify the target Quickwit service is running and its gRPC port is reachable (`grpc_listen_addr`), then wait for the client to observe it.","Check the node's cluster configuration/seed addresses so the client discovers at least one server; fix peer/advertise settings if peers never join.","Retry with backoff — transient during startup until `connection_addrs_rx` is populated.","If the client is constructed manually, ensure the connection watcher/`connection_addrs_rx` is fed with server addresses."],"exampleFix":"// before: calling immediately after client creation, before any server is known\nlet result = search_service.root_search(...).await; // may fail: no server currently available\n// after: wait for at least one server before calling\nwhile client.check_connectivity().await.is_err() {\n    tokio::time::sleep(Duration::from_millis(250)).await;\n}\nlet result = search_service.root_search(...).await;","handlingStrategy":"retry","validationCode":"// Check server availability before the request\nif client.check_connectivity().await.is_err() {\n    tokio::time::sleep(Duration::from_millis(500)).await; // wait for discovery\n}","typeGuard":null,"tryCatchPattern":"let mut attempts = 0;\nloop {\n    match client.check_connectivity().await {\n        Ok(()) => break,\n        Err(e) if e.to_string().contains(\"no server currently available\") && attempts < 10 => {\n            attempts += 1;\n            tokio::time::sleep(Duration::from_millis(500 * attempts)).await;\n        }\n        Err(e) => return Err(e),\n    }\n}","preventionTips":["Verify grpc_listen_addr and peer/seed configuration before startup.","Use readiness probes that check connectivity before routing traffic to the node.","Confirm the cluster actually formed (chitchat members) before issuing search/ingest calls."],"tags":["grpc","network","codegen","connectivity"],"backgroundTag":"connection-refused","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}