From 0167b2decdebe7c38de5eb859f63ba6b3c7241dc Mon Sep 17 00:00:00 2001 From: weisd Date: Fri, 18 Jul 2025 10:41:00 +0800 Subject: [PATCH] fix: optimize RPC connection management and prevent race conditions (#252) --- crates/protos/src/lib.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/crates/protos/src/lib.rs b/crates/protos/src/lib.rs index 2433eca2..396976c5 100644 --- a/crates/protos/src/lib.rs +++ b/crates/protos/src/lib.rs @@ -39,14 +39,21 @@ pub async fn node_service_time_out_client( Box, > { let token: MetadataValue<_> = "rustfs rpc".parse()?; - let channel = match GLOBAL_Conn_Map.read().await.get(addr) { - Some(channel) => channel.clone(), + + let channel = { GLOBAL_Conn_Map.read().await.get(addr).cloned() }; + + let channel = match channel { + Some(channel) => channel, None => { let connector = Endpoint::from_shared(addr.to_string())?.connect_timeout(Duration::from_secs(60)); - connector.connect().await? + let channel = connector.connect().await?; + + { + GLOBAL_Conn_Map.write().await.insert(addr.to_string(), channel.clone()); + } + channel } }; - GLOBAL_Conn_Map.write().await.insert(addr.to_string(), channel.clone()); // let timeout_channel = Timeout::new(channel, Duration::from_secs(60)); Ok(NodeServiceClient::with_interceptor(