Commit 2b04bf8
committed
fix(pool): bound each step of returning a connection to the pool
Fixes #4349.
`Floating::return_to_pool` holds the pool's `DecrementSizeGuard` while it
does I/O on the connection: an `after_release` hook, a `ping()` to check
the connection is still usable, or a graceful `close()`. None of those were
bounded.
That matters because the I/O can be on a socket that is dead in a way the
socket cannot report. If the server disappeared without closing the
connection, and the client has nothing left to retransmit, no RST is ever
provoked and reads never complete. The returning task then holds its permit
forever and the pool shrinks by one connection. After `max_connections` of
those, every `acquire()` fails with `PoolTimedOut` and the pool never
recovers, even though the server is back.
Each step now gets `RETURN_TO_POOL_TIMEOUT` (5s, matching the existing
`CLOSE_ON_DROP_TIMEOUT`), and on expiry the connection is dropped via
`close_hard()`, which does no I/O. Cancelling `close()` likewise drops the
connection and releases the permit.
The regression test uses an `after_release` hook that never completes, which
is a deterministic stand-in for a socket that never answers: before this
change it exhausts `acquire_timeout`, after it the pool is usable again once
the bound expires.
I realise #3582 reworks this area and includes a timeout of its own; this is
meant for main until that lands.1 parent 1d674f5 commit 2b04bf8
2 files changed
Lines changed: 86 additions & 21 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
18 | 27 | | |
19 | 28 | | |
20 | 29 | | |
| |||
275 | 284 | | |
276 | 285 | | |
277 | 286 | | |
278 | | - | |
| 287 | + | |
279 | 288 | | |
280 | 289 | | |
281 | 290 | | |
282 | 291 | | |
283 | 292 | | |
284 | 293 | | |
285 | | - | |
| 294 | + | |
286 | 295 | | |
287 | 296 | | |
288 | 297 | | |
289 | 298 | | |
290 | 299 | | |
291 | | - | |
292 | | - | |
293 | | - | |
294 | | - | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
295 | 307 | | |
296 | 308 | | |
297 | | - | |
| 309 | + | |
298 | 310 | | |
299 | 311 | | |
300 | 312 | | |
301 | 313 | | |
302 | 314 | | |
303 | 315 | | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
304 | 321 | | |
305 | 322 | | |
306 | 323 | | |
| |||
311 | 328 | | |
312 | 329 | | |
313 | 330 | | |
314 | | - | |
315 | | - | |
316 | | - | |
317 | | - | |
318 | | - | |
319 | | - | |
320 | | - | |
321 | | - | |
322 | | - | |
323 | | - | |
324 | | - | |
325 | | - | |
326 | | - | |
| 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 | + | |
327 | 357 | | |
328 | 358 | | |
329 | 359 | | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
330 | 367 | | |
331 | 368 | | |
332 | 369 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
321 | 321 | | |
322 | 322 | | |
323 | 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 | + | |
324 | 352 | | |
325 | 353 | | |
326 | 354 | | |
| |||
0 commit comments