refactor(mcp): return startup error last from startMCPInterruptible
- commit
- ef9ee0c39245f57a68c3f3458c2949b5d56d1d83
- author
- brice · · 2026-10-15 14:04 UTC
- parent
- 16815dd
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
2 files · +5 -5
M packages/agent/mcp_runtime.go +4 -4
| @@ -58,7 +58,7 @@ func startMCP(ctx context.Context, args *Args, version string) (func(), error) { | |||
| 58 | 58 | manager := mcp.NewManager(cfg, args.CWD, mcp.ClientInfo{Name: "zut", Version: version}, provider.NewHTTPClient(false)) | |
| 59 | 59 | sigCh := make(chan os.Signal, 1) | |
| 60 | 60 | signal.Notify(sigCh, mcpSignals...) | |
| 61 | - | failures, requiredErr, sig := startMCPInterruptible(ctx, manager, sigCh) | |
| 61 | + | failures, sig, requiredErr := startMCPInterruptible(ctx, manager, sigCh) | |
| 62 | 62 | signal.Stop(sigCh) | |
| 63 | 63 | if sig != nil { | |
| 64 | 64 | // Interrupted during startup: no mode owns signals yet, so stop the | |
| @@ -94,7 +94,7 @@ func signalExitCode(sig os.Signal) int { | |||
| 94 | 94 | // startMCPInterruptible runs manager.Start and cancels the handshakes when a | |
| 95 | 95 | // signal arrives on sigCh, waiting until every connection attempt has closed | |
| 96 | 96 | // its transport. It returns the signal that interrupted startup, if any. | |
| 97 | - | func startMCPInterruptible(ctx context.Context, manager *mcp.Manager, sigCh <-chan os.Signal) ([]error, error, os.Signal) { | |
| 97 | + | func startMCPInterruptible(ctx context.Context, manager *mcp.Manager, sigCh <-chan os.Signal) ([]error, os.Signal, error) { | |
| 98 | 98 | startCtx, cancel := context.WithCancel(ctx) | |
| 99 | 99 | defer cancel() | |
| 100 | 100 | type result struct { | |
| @@ -108,11 +108,11 @@ func startMCPInterruptible(ctx context.Context, manager *mcp.Manager, sigCh <-ch | |||
| 108 | 108 | }() | |
| 109 | 109 | select { | |
| 110 | 110 | case r := <-done: | |
| 111 | - | return r.failures, r.required, nil | |
| 111 | + | return r.failures, nil, r.required | |
| 112 | 112 | case sig := <-sigCh: | |
| 113 | 113 | cancel() | |
| 114 | 114 | <-done | |
| 115 | - | return nil, nil, sig | |
| 115 | + | return nil, sig, nil | |
| 116 | 116 | } | |
| 117 | 117 | } | |
| 118 | 118 | ||
| @@ -58,7 +58,7 @@ func startMCP(ctx context.Context, args *Args, version string) (func(), error) { | |||||
| 58 | manager := mcp.NewManager(cfg, args.CWD, mcp.ClientInfo{Name: "zut", Version: version}, provider.NewHTTPClient(false)) | 58 | manager := mcp.NewManager(cfg, args.CWD, mcp.ClientInfo{Name: "zut", Version: version}, provider.NewHTTPClient(false)) | ||
| 59 | sigCh := make(chan os.Signal, 1) | 59 | sigCh := make(chan os.Signal, 1) | ||
| 60 | signal.Notify(sigCh, mcpSignals...) | 60 | signal.Notify(sigCh, mcpSignals...) | ||
| 61 | - | failures, requiredErr, sig := startMCPInterruptible(ctx, manager, sigCh) | 61 | + | failures, sig, requiredErr := startMCPInterruptible(ctx, manager, sigCh) |
| 62 | signal.Stop(sigCh) | 62 | signal.Stop(sigCh) | ||
| 63 | if sig != nil { | 63 | if sig != nil { | ||
| 64 | // Interrupted during startup: no mode owns signals yet, so stop the | 64 | // Interrupted during startup: no mode owns signals yet, so stop the | ||
| @@ -94,7 +94,7 @@ func signalExitCode(sig os.Signal) int { | |||||
| 94 | // startMCPInterruptible runs manager.Start and cancels the handshakes when a | 94 | // startMCPInterruptible runs manager.Start and cancels the handshakes when a | ||
| 95 | // signal arrives on sigCh, waiting until every connection attempt has closed | 95 | // signal arrives on sigCh, waiting until every connection attempt has closed | ||
| 96 | // its transport. It returns the signal that interrupted startup, if any. | 96 | // its transport. It returns the signal that interrupted startup, if any. | ||
| 97 | - | func startMCPInterruptible(ctx context.Context, manager *mcp.Manager, sigCh <-chan os.Signal) ([]error, error, os.Signal) { | 97 | + | func startMCPInterruptible(ctx context.Context, manager *mcp.Manager, sigCh <-chan os.Signal) ([]error, os.Signal, error) { |
| 98 | startCtx, cancel := context.WithCancel(ctx) | 98 | startCtx, cancel := context.WithCancel(ctx) | ||
| 99 | defer cancel() | 99 | defer cancel() | ||
| 100 | type result struct { | 100 | type result struct { | ||
| @@ -108,11 +108,11 @@ func startMCPInterruptible(ctx context.Context, manager *mcp.Manager, sigCh <-ch | |||||
| 108 | }() | 108 | }() | ||
| 109 | select { | 109 | select { | ||
| 110 | case r := <-done: | 110 | case r := <-done: | ||
| 111 | - | return r.failures, r.required, nil | 111 | + | return r.failures, nil, r.required |
| 112 | case sig := <-sigCh: | 112 | case sig := <-sigCh: | ||
| 113 | cancel() | 113 | cancel() | ||
| 114 | <-done | 114 | <-done | ||
| 115 | - | return nil, nil, sig | 115 | + | return nil, sig, nil |
| 116 | } | 116 | } | ||
| 117 | } | 117 | } | ||
| 118 | 118 | ||||
M packages/agent/mcp_runtime_test.go +1 -1
| @@ -417,7 +417,7 @@ func TestStartMCPInterruptibleCancelsHandshake(t *testing.T) { | |||
| 417 | 417 | sigCh := make(chan os.Signal, 1) | |
| 418 | 418 | result := make(chan os.Signal, 1) | |
| 419 | 419 | go func() { | |
| 420 | - | _, _, sig := startMCPInterruptible(context.Background(), manager, sigCh) | |
| 420 | + | _, sig, _ := startMCPInterruptible(context.Background(), manager, sigCh) | |
| 421 | 421 | result <- sig | |
| 422 | 422 | }() | |
| 423 | 423 | <-reached | |
| @@ -417,7 +417,7 @@ func TestStartMCPInterruptibleCancelsHandshake(t *testing.T) { | |||||
| 417 | sigCh := make(chan os.Signal, 1) | 417 | sigCh := make(chan os.Signal, 1) | ||
| 418 | result := make(chan os.Signal, 1) | 418 | result := make(chan os.Signal, 1) | ||
| 419 | go func() { | 419 | go func() { | ||
| 420 | - | _, _, sig := startMCPInterruptible(context.Background(), manager, sigCh) | 420 | + | _, sig, _ := startMCPInterruptible(context.Background(), manager, sigCh) |
| 421 | result <- sig | 421 | result <- sig | ||
| 422 | }() | 422 | }() | ||
| 423 | <-reached | 423 | <-reached | ||