Commit ef33138
fix(client): bound the socket-level wait itself, not just the loop
Third finding on the same seam, and the root of all three: the deadline
arithmetic in receive() means nothing while the blocking primitive
answers only to the constructor-time steady-state timeout. A peer that
accepts and then goes silent — a proxy fronting an unreachable backend,
the exact case connect() is being bounded for — parks the first recv()
for the full steady-state window before any deadline is rechecked.
Every socket wait now takes the remaining budget of the loop it serves:
per-call on the coroutine client, via a per-wait refresh of the client
timeout option on the synchronous one. Where a synchronous build applies
options only at connect(), the behaviour degrades to exactly what shipped
before — the loop-level deadline still bounds the total — and where
honoured, the wait matches the budget.
The contract tests observe the socket layer directly: every handshake
wait stays within the remaining connect budget, steady-state waits return
to the full receive timeout, and the synchronous transport sees its
option refreshed per wait.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>1 parent c023ef1 commit ef33138
2 files changed
Lines changed: 108 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
546 | 546 | | |
547 | 547 | | |
548 | 548 | | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
549 | 574 | | |
550 | 575 | | |
551 | 576 | | |
| |||
569 | 594 | | |
570 | 595 | | |
571 | 596 | | |
572 | | - | |
| 597 | + | |
| 598 | + | |
573 | 599 | | |
574 | 600 | | |
575 | 601 | | |
576 | 602 | | |
577 | | - | |
| 603 | + | |
578 | 604 | | |
579 | 605 | | |
580 | 606 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
37 | 40 | | |
38 | 41 | | |
| 42 | + | |
39 | 43 | | |
40 | 44 | | |
41 | 45 | | |
| |||
59 | 63 | | |
60 | 64 | | |
61 | 65 | | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
62 | 69 | | |
63 | 70 | | |
64 | 71 | | |
65 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
66 | 82 | | |
67 | 83 | | |
68 | 84 | | |
| |||
124 | 140 | | |
125 | 141 | | |
126 | 142 | | |
127 | | - | |
| 143 | + | |
128 | 144 | | |
129 | 145 | | |
130 | 146 | | |
| |||
303 | 319 | | |
304 | 320 | | |
305 | 321 | | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
306 | 384 | | |
307 | 385 | | |
308 | 386 | | |
| |||
0 commit comments