Commit 417bdbb
Fix test hang: use instrumented xUnit with async void GC root fix
xUnit v3's TestRunner.RunTest wraps test execution in an async void
callback (required by ExecutionContext.Run's ContextCallback signature).
When the test's async continuation chain forms a cycle with no external
GC root (no I/O, no timers), the entire object graph is collectible.
In Release mode on Ubuntu, the JIT's aggressive optimizations make this
reproducible — the async void state machine gets collected, the test
never completes, and the test host hangs.
The fix extracts the async void body into an async Task method and
holds a reference to the returned Task, keeping the entire async chain
GC-rooted for the lifetime of RunTest.
Also reverts prior ConnectAsync/McpSessionHandler workarounds that
were attempting to address this from the product side.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>1 parent 7916e99 commit 417bdbb
File tree
5 files changed
+23
-98
lines changed- src/ModelContextProtocol.Core
- Client
- tests
- Common/InstrumentedXunit
5 files changed
+23
-98
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
533 | 533 | | |
534 | 534 | | |
535 | 535 | | |
536 | | - | |
| 536 | + | |
537 | 537 | | |
538 | 538 | | |
539 | 539 | | |
| |||
543 | 543 | | |
544 | 544 | | |
545 | 545 | | |
546 | | - | |
| 546 | + | |
547 | 547 | | |
548 | 548 | | |
549 | 549 | | |
| |||
553 | 553 | | |
554 | 554 | | |
555 | 555 | | |
556 | | - | |
557 | | - | |
558 | | - | |
559 | | - | |
560 | | - | |
561 | | - | |
562 | | - | |
563 | | - | |
564 | | - | |
565 | | - | |
566 | | - | |
567 | | - | |
568 | | - | |
569 | | - | |
570 | | - | |
571 | | - | |
572 | | - | |
573 | | - | |
574 | | - | |
575 | | - | |
576 | | - | |
577 | | - | |
578 | | - | |
579 | | - | |
580 | | - | |
581 | | - | |
582 | | - | |
583 | | - | |
584 | | - | |
585 | | - | |
586 | | - | |
587 | | - | |
588 | | - | |
589 | | - | |
590 | | - | |
591 | | - | |
592 | | - | |
593 | | - | |
594 | | - | |
595 | | - | |
596 | | - | |
597 | | - | |
| 556 | + | |
598 | 557 | | |
599 | 558 | | |
600 | 559 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | 95 | | |
103 | 96 | | |
104 | 97 | | |
| |||
331 | 324 | | |
332 | 325 | | |
333 | 326 | | |
| 327 | + | |
334 | 328 | | |
335 | 329 | | |
336 | 330 | | |
337 | 331 | | |
338 | 332 | | |
339 | 333 | | |
340 | 334 | | |
341 | | - | |
342 | | - | |
343 | | - | |
344 | | - | |
345 | | - | |
346 | | - | |
| 335 | + | |
347 | 336 | | |
348 | | - | |
349 | | - | |
350 | | - | |
351 | | - | |
352 | | - | |
353 | | - | |
| 337 | + | |
354 | 338 | | |
355 | 339 | | |
356 | 340 | | |
357 | 341 | | |
358 | | - | |
359 | | - | |
360 | | - | |
361 | | - | |
362 | | - | |
363 | | - | |
364 | | - | |
365 | | - | |
366 | | - | |
367 | | - | |
368 | | - | |
369 | | - | |
370 | | - | |
371 | | - | |
372 | | - | |
373 | | - | |
374 | | - | |
375 | | - | |
376 | | - | |
377 | 342 | | |
378 | 343 | | |
379 | 344 | | |
| |||
611 | 576 | | |
612 | 577 | | |
613 | 578 | | |
614 | | - | |
615 | | - | |
616 | | - | |
617 | | - | |
618 | | - | |
619 | | - | |
620 | | - | |
621 | | - | |
622 | | - | |
623 | | - | |
624 | | - | |
625 | | - | |
626 | | - | |
627 | | - | |
628 | | - | |
629 | | - | |
630 | 579 | | |
631 | 580 | | |
632 | 581 | | |
| |||
Binary file not shown.
Binary file not shown.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
11 | 28 | | |
0 commit comments