Commit f218e22
committed
BUG/MEDIUM: cli: fix master CLI connection slot leak on client disconnect
In master-worker mode the master CLI proxy (mworker_proxy) has a
hardcoded maxconn of 10. When a client connects to the master CLI
socket and issues a command that gets forwarded to an unresponsive
worker (e.g. one that is stuck or very slow), the connection hangs
waiting for the worker's response. If the client then disconnects
(timeout, Ctrl-C, etc.), the connection slot is never released because
the client-side FIN is never propagated to tear down the backend.
After 10 such leaked slots the master CLI socket becomes completely
unreachable, returning "Resource temporarily unavailable" to any new
connection attempt.
The fix has three parts:
1) Remove sc_schedule_shutdown(s->scb) after command forwarding.
The worker doesn't need the TCP FIN to know when a command ends -
CLI commands are newline-delimited. Without this shutdown, the
backend never enters half-close during normal command processing,
so timeout server-fin is never implicitly armed by process_stream().
2) In the AN_RES_WAIT_CLI early-return path, call sc_set_hcto(s->scb)
only when the client has disconnected (SC_FL_EOS on scf) and there
is no more pending request data. This arms the 1s server-fin timer
exclusively in the stuck-worker scenario.
3) Call channel_dont_close(req) to prevent process_stream() from
auto-forwarding the client's FIN to the backend via CF_AUTO_CLOSE.
A 1s timeout server-fin is configured on mworker_proxy. It is only
armed after the client disconnects cleanly, so it never fires during
normal command processing. It ensures a stuck backend releases its
connection slot promptly once the client is gone.
Locally-handled commands (master applet) are unaffected because they
complete synchronously before the client has reason to disconnect.
The scb->ioto reset (TICK_ETERNITY) at end-of-transaction in
pcli_wait_for_response() prevents any timer leakage between commands.
This fixes GH issue haproxy#3351.
This should be backported to all stable branches.1 parent c6600d7 commit f218e22
4 files changed
Lines changed: 169 additions & 10 deletions
File tree
- reg-tests/mcli
- src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3484 | 3484 | | |
3485 | 3485 | | |
3486 | 3486 | | |
3487 | | - | |
| 3487 | + | |
| 3488 | + | |
| 3489 | + | |
| 3490 | + | |
| 3491 | + | |
| 3492 | + | |
| 3493 | + | |
| 3494 | + | |
| 3495 | + | |
| 3496 | + | |
| 3497 | + | |
| 3498 | + | |
| 3499 | + | |
| 3500 | + | |
| 3501 | + | |
| 3502 | + | |
| 3503 | + | |
3488 | 3504 | | |
| 3505 | + | |
3489 | 3506 | | |
3490 | 3507 | | |
3491 | 3508 | | |
| |||
3528 | 3545 | | |
3529 | 3546 | | |
3530 | 3547 | | |
3531 | | - | |
3532 | | - | |
3533 | | - | |
3534 | | - | |
3535 | | - | |
3536 | | - | |
3537 | | - | |
| 3548 | + | |
3538 | 3549 | | |
3539 | 3550 | | |
3540 | 3551 | | |
| |||
3595 | 3606 | | |
3596 | 3607 | | |
3597 | 3608 | | |
| 3609 | + | |
| 3610 | + | |
| 3611 | + | |
| 3612 | + | |
| 3613 | + | |
| 3614 | + | |
| 3615 | + | |
3598 | 3616 | | |
3599 | 3617 | | |
3600 | 3618 | | |
| |||
3834 | 3852 | | |
3835 | 3853 | | |
3836 | 3854 | | |
3837 | | - | |
3838 | | - | |
| 3855 | + | |
| 3856 | + | |
| 3857 | + | |
| 3858 | + | |
| 3859 | + | |
| 3860 | + | |
| 3861 | + | |
3839 | 3862 | | |
3840 | 3863 | | |
3841 | 3864 | | |
| |||
0 commit comments