Repository navigation
Commit e4e5612
committed
Let the session reaper finish before the transport closes
## Motivation and Context
`StreamableHTTPTransport#close` stopped the session reaper with `Thread#kill`. The reaper removes expired sessions
under the transport's lock and closes their streams after releasing it, so a kill landing between the two left those
streams open with no session left to find them by: nothing closed them afterwards, since `close` tears down only
the sessions still registered.
The reaper now waits between reaps on a condition variable under the lock instead of sleeping, and `close` sets
a flag, signals it, and joins the thread for up to `REAPER_JOIN_TIMEOUT` seconds before killing it. A reaper waiting
leaves its wait at once; one past its removal finishes closing the streams it collected before `close` goes on to
the rest of the transport. The join is bounded so a stream whose close never returns cannot hold the shutdown, and
its outcome never decides whether the teardown runs: `Thread#join` re-raises the exception a thread died with, which
`close` swallows, since the reaper reported what it could when it happened and the sessions still have to go.
A spurious wakeup only runs a reap early.
## How Has This Been Tested?
Three new tests in `test/mcp/server/transports/streamable_http_transport_test.rb`: one wakes the reaper while a reaped
session's stream blocks inside its close, and checks that `close` returns only once that close completed and that
the stream was closed; one ends the reaper with an exception, through a reap that raises and an exception reporter
that raises as well, and checks that `close` still tears the sessions and their streams down; one makes the join
time out at once while the reaper is inside a close that never returns, and checks that `close` returns and kills it.
Against the previous library, with the reaper's sleep stubbed out so that it reaps at once, `close` returned while
the stream was still open and the stream was never closed; the second and the third are what a plain join would
have failed, with `close` re-raising the reaper's exception before any teardown, and never returning.
## Breaking Changes
None. `close` now waits up to five seconds for a reap in progress to finish closing its streams.1 parent c090dd6 commit e4e5612
2 files changed
Lines changed: 181 additions & 2 deletions
File tree
- lib/mcp/server/transports
- test/mcp/server/transports
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
347 | 347 | | |
348 | 348 | | |
349 | 349 | | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
350 | 354 | | |
351 | 355 | | |
352 | 356 | | |
| |||
355 | 359 | | |
356 | 360 | | |
357 | 361 | | |
| 362 | + | |
| 363 | + | |
358 | 364 | | |
359 | 365 | | |
360 | 366 | | |
| |||
453 | 459 | | |
454 | 460 | | |
455 | 461 | | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
456 | 470 | | |
457 | | - | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
458 | 484 | | |
459 | 485 | | |
460 | 486 | | |
| |||
772 | 798 | | |
773 | 799 | | |
774 | 800 | | |
| 801 | + | |
| 802 | + | |
775 | 803 | | |
776 | 804 | | |
777 | 805 | | |
778 | | - | |
| 806 | + | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
779 | 813 | | |
780 | 814 | | |
781 | 815 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4323 | 4323 | | |
4324 | 4324 | | |
4325 | 4325 | | |
| 4326 | + | |
| 4327 | + | |
| 4328 | + | |
| 4329 | + | |
| 4330 | + | |
| 4331 | + | |
| 4332 | + | |
| 4333 | + | |
| 4334 | + | |
| 4335 | + | |
| 4336 | + | |
| 4337 | + | |
| 4338 | + | |
| 4339 | + | |
| 4340 | + | |
| 4341 | + | |
| 4342 | + | |
| 4343 | + | |
| 4344 | + | |
| 4345 | + | |
| 4346 | + | |
| 4347 | + | |
| 4348 | + | |
| 4349 | + | |
| 4350 | + | |
| 4351 | + | |
| 4352 | + | |
| 4353 | + | |
| 4354 | + | |
| 4355 | + | |
| 4356 | + | |
| 4357 | + | |
| 4358 | + | |
| 4359 | + | |
| 4360 | + | |
| 4361 | + | |
| 4362 | + | |
| 4363 | + | |
| 4364 | + | |
| 4365 | + | |
| 4366 | + | |
| 4367 | + | |
| 4368 | + | |
| 4369 | + | |
| 4370 | + | |
| 4371 | + | |
| 4372 | + | |
| 4373 | + | |
| 4374 | + | |
| 4375 | + | |
| 4376 | + | |
| 4377 | + | |
| 4378 | + | |
| 4379 | + | |
| 4380 | + | |
| 4381 | + | |
| 4382 | + | |
| 4383 | + | |
| 4384 | + | |
| 4385 | + | |
| 4386 | + | |
| 4387 | + | |
| 4388 | + | |
| 4389 | + | |
| 4390 | + | |
| 4391 | + | |
| 4392 | + | |
| 4393 | + | |
| 4394 | + | |
| 4395 | + | |
| 4396 | + | |
| 4397 | + | |
| 4398 | + | |
| 4399 | + | |
| 4400 | + | |
| 4401 | + | |
| 4402 | + | |
| 4403 | + | |
| 4404 | + | |
| 4405 | + | |
| 4406 | + | |
| 4407 | + | |
| 4408 | + | |
| 4409 | + | |
| 4410 | + | |
| 4411 | + | |
| 4412 | + | |
| 4413 | + | |
| 4414 | + | |
| 4415 | + | |
| 4416 | + | |
| 4417 | + | |
| 4418 | + | |
| 4419 | + | |
| 4420 | + | |
| 4421 | + | |
| 4422 | + | |
| 4423 | + | |
| 4424 | + | |
| 4425 | + | |
| 4426 | + | |
| 4427 | + | |
| 4428 | + | |
| 4429 | + | |
| 4430 | + | |
| 4431 | + | |
| 4432 | + | |
| 4433 | + | |
| 4434 | + | |
| 4435 | + | |
| 4436 | + | |
| 4437 | + | |
| 4438 | + | |
| 4439 | + | |
| 4440 | + | |
| 4441 | + | |
| 4442 | + | |
4326 | 4443 | | |
4327 | 4444 | | |
4328 | 4445 | | |
| |||
7133 | 7250 | | |
7134 | 7251 | | |
7135 | 7252 | | |
| 7253 | + | |
| 7254 | + | |
| 7255 | + | |
| 7256 | + | |
| 7257 | + | |
| 7258 | + | |
| 7259 | + | |
| 7260 | + | |
| 7261 | + | |
| 7262 | + | |
| 7263 | + | |
| 7264 | + | |
| 7265 | + | |
| 7266 | + | |
| 7267 | + | |
| 7268 | + | |
| 7269 | + | |
| 7270 | + | |
| 7271 | + | |
| 7272 | + | |
| 7273 | + | |
| 7274 | + | |
| 7275 | + | |
| 7276 | + | |
| 7277 | + | |
| 7278 | + | |
| 7279 | + | |
| 7280 | + | |
7136 | 7281 | | |
7137 | 7282 | | |
7138 | 7283 | | |
| |||
0 commit comments