@@ -3,7 +3,6 @@ package runtime
33import (
44 "context"
55 "fmt"
6- "sync"
76 "time"
87
98 "go.uber.org/zap"
@@ -172,11 +171,8 @@ func (r *Runtime) LoadConfiguredServers(cfg *config.Config) error {
172171 storedServerMap [storedServer .Name ] = storedServer
173172 }
174173
175- // Add servers synchronously to avoid deadlock with tool discovery
176- // Wait for all server add/remove operations to complete before returning
177- // This prevents DiscoverAndIndexTools from trying to acquire locks while servers are being modified
178-
179- var wg sync.WaitGroup
174+ // Add/remove servers asynchronously to prevent blocking on slow connections
175+ // All server operations now happen in background goroutines with timeouts
180176
181177 for _ , serverCfg := range cfg .Servers {
182178 storedServer , existsInStorage := storedServerMap [serverCfg .Name ]
@@ -202,11 +198,9 @@ func (r *Runtime) LoadConfiguredServers(cfg *config.Config) error {
202198 }
203199
204200 if serverCfg .Enabled {
205- // Add server synchronously to avoid lock contention with DiscoverAndIndexTools
206- // The actual connection still happens asynchronously inside AddServer
207- wg .Add (1 )
201+ // Add server asynchronously to prevent blocking
202+ // AddServer has its own 30-second timeout for connections
208203 go func (cfg * config.ServerConfig , cfgPath string ) {
209- defer wg .Done ()
210204 if err := r .upstreamManager .AddServer (cfg .Name , cfg ); err != nil {
211205 r .logger .Error ("Failed to add/update upstream server" , zap .Error (err ), zap .String ("server" , cfg .Name ))
212206 } else {
@@ -223,13 +217,14 @@ func (r *Runtime) LoadConfiguredServers(cfg *config.Config) error {
223217 r .logger .Info ("Server is quarantined but kept connected for security inspection" , zap .String ("server" , serverCfg .Name ))
224218 }
225219 } else {
226- r .upstreamManager .RemoveServer (serverCfg .Name )
227- r .logger .Info ("Server is disabled, removing from active connections" , zap .String ("server" , serverCfg .Name ))
220+ // Remove server asynchronously to prevent blocking
221+ go func (name string ) {
222+ r .upstreamManager .RemoveServer (name )
223+ r .logger .Info ("Server is disabled, removing from active connections" , zap .String ("server" , name ))
224+ }(serverCfg .Name )
228225 }
229226 }
230227
231- wg .Wait ()
232-
233228 serversToRemove := []string {}
234229
235230 for _ , serverName := range currentUpstreams {
@@ -253,18 +248,21 @@ func (r *Runtime) LoadConfiguredServers(cfg *config.Config) error {
253248 }
254249 }
255250
251+ // Remove servers asynchronously to prevent blocking
256252 for _ , serverName := range serversToRemove {
257- r .logger .Info ("Removing server no longer in config" , zap .String ("server" , serverName ))
258- r .upstreamManager .RemoveServer (serverName )
259- if err := r .storageManager .DeleteUpstreamServer (serverName ); err != nil {
260- r .logger .Error ("Failed to delete server from storage" , zap .Error (err ), zap .String ("server" , serverName ))
261- }
262- if err := r .indexManager .DeleteServerTools (serverName ); err != nil {
263- r .logger .Error ("Failed to delete server tools from index" , zap .Error (err ), zap .String ("server" , serverName ))
264- } else {
265- r .logger .Info ("Removed server tools from search index" , zap .String ("server" , serverName ))
266- }
267253 changed = true
254+ go func (name string ) {
255+ r .logger .Info ("Removing server no longer in config" , zap .String ("server" , name ))
256+ r .upstreamManager .RemoveServer (name )
257+ if err := r .storageManager .DeleteUpstreamServer (name ); err != nil {
258+ r .logger .Error ("Failed to delete server from storage" , zap .Error (err ), zap .String ("server" , name ))
259+ }
260+ if err := r .indexManager .DeleteServerTools (name ); err != nil {
261+ r .logger .Error ("Failed to delete server tools from index" , zap .Error (err ), zap .String ("server" , name ))
262+ } else {
263+ r .logger .Info ("Removed server tools from search index" , zap .String ("server" , name ))
264+ }
265+ }(serverName )
268266 }
269267
270268 if len (serversToRemove ) > 0 {
0 commit comments