Skip to content

Commit 0e8a835

Browse files
committed
refactor: Update LoadConfiguredServers to use asynchronous server operations and modify e2e-config for enabled state
1 parent 7fcacf8 commit 0e8a835

2 files changed

Lines changed: 25 additions & 26 deletions

File tree

internal/runtime/lifecycle.go

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package runtime
33
import (
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 {

test/e2e-config.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
"-y",
1313
"@modelcontextprotocol/server-everything"
1414
],
15-
"enabled": false,
15+
"enabled": true,
1616
"quarantined": false,
1717
"created": "2025-01-01T00:00:00Z",
18-
"updated": "2025-10-05T21:05:58.786562+03:00"
18+
"updated": "2025-10-08T18:17:09.56386+03:00"
1919
}
2020
],
2121
"top_k": 10,
@@ -47,6 +47,7 @@
4747
"compress": true,
4848
"json_format": false
4949
},
50+
"api_key": "8fe19be2087ba7a9ab828bda259472e55e89fc2fc2150359395bb5e041c8f545",
5051
"read_only_mode": false,
5152
"disable_management": false,
5253
"allow_server_add": true,

0 commit comments

Comments
 (0)