From 31cdd864d217a759639445fb3b5751013f916f49 Mon Sep 17 00:00:00 2001 From: Weny Xu Date: Wed, 3 Jun 2026 20:05:50 +0800 Subject: [PATCH] fix: format detected IPv6 grpc address (#8221) Signed-off-by: WenyXu --- src/servers/src/grpc.rs | 58 ++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/src/servers/src/grpc.rs b/src/servers/src/grpc.rs index 3adfd24945..50dd0b69c4 100644 --- a/src/servers/src/grpc.rs +++ b/src/servers/src/grpc.rs @@ -24,7 +24,7 @@ pub mod prom_query_gateway; pub mod region_server; use std::any::Any; -use std::net::SocketAddr; +use std::net::{IpAddr, SocketAddr}; use std::time::Duration; use api::v1::health_check_server::{HealthCheck, HealthCheckServer}; @@ -95,14 +95,8 @@ impl GrpcOptions { if self.server_addr.is_empty() { match local_ip_address::local_ip() { Ok(ip) => { - let detected_addr = format!( - "{}:{}", - ip, - self.bind_addr - .split(':') - .nth(1) - .unwrap_or(DEFAULT_GRPC_ADDR_PORT) - ); + let port = port_from_bind_addr(&self.bind_addr); + let detected_addr = format_server_addr(ip, port); info!("Using detected: {} as server address", detected_addr); self.server_addr = detected_addr; } @@ -131,7 +125,18 @@ impl GrpcOptions { } } -const DEFAULT_GRPC_ADDR_PORT: &str = "4001"; +const DEFAULT_GRPC_ADDR_PORT: u16 = 4001; + +fn port_from_bind_addr(bind_addr: &str) -> u16 { + bind_addr + .rsplit_once(':') + .and_then(|(_, port)| port.parse().ok()) + .unwrap_or(DEFAULT_GRPC_ADDR_PORT) +} + +fn format_server_addr(ip: IpAddr, port: u16) -> String { + SocketAddr::new(ip, port).to_string() +} const DEFAULT_INTERNAL_GRPC_ADDR_PORT: &str = "4010"; @@ -415,3 +420,36 @@ impl Server for GrpcServer { self } } + +#[cfg(test)] +mod tests { + use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; + + use super::{DEFAULT_GRPC_ADDR_PORT, format_server_addr, port_from_bind_addr}; + + #[test] + fn test_port_from_bind_addr() { + assert_eq!(3002, port_from_bind_addr("127.0.0.1:3002")); + assert_eq!(3002, port_from_bind_addr("[::]:3002")); + assert_eq!( + 3002, + port_from_bind_addr("greptimedb-metasrv.default.svc.cluster.local:3002") + ); + assert_eq!( + DEFAULT_GRPC_ADDR_PORT, + port_from_bind_addr("invalid-bind-addr") + ); + } + + #[test] + fn test_format_server_addr() { + assert_eq!( + "127.0.0.1:3002", + format_server_addr(IpAddr::V4(Ipv4Addr::LOCALHOST), 3002) + ); + assert_eq!( + "[::1]:3002", + format_server_addr(IpAddr::V6(Ipv6Addr::LOCALHOST), 3002) + ); + } +}