Hi, HAProxy 3.2-dev7 was released on 2025/03/07. It added 87 new commits after version 3.2-dev6.
25 bugs were fixed in this release, among which 9 tagged medium, half of which aimed at making thread dumps more reliable ("show threads" and backtraces from the watchdog timer). Aside the usual bug fixes, we're also having more sensitive changes in this version: - Just like H2, QUIC now alwo supports a larger Rx window in order to significantly speed up uploads (POST requests). By default, up to 90% of the allocatable rx buffers can be assigned to rx buffers, which can easily multiply the upload speed by 20-30 on high latency links. Please if you are using QUIC with a site dealing with uploads, give this a try and share some feedback. This will help us decide what tunables we might want to make accessible from the configutation. - unit tests: now when building with -DDEBUG_UNIT, a new -U argument will allow to name a function to be called after the conf is parsed, in order to run a unit test. A new build target "unit-tests" runs over them all. Hopefully this will encourage all devs to provide more unit tests directly in the code that can directly benefit from all the internal infrastructure without having to write extra programs in the tests/ subdirs. - idle backend connections are normally never shared between thread groups, they're only shared between threads. The reason is the possibly high cost of accessible other groups' lists. But when using reverse-http, this poses a problem in case all pre-established connections are in use on a different thread group from the one having to process a request, because it's not possible to establish new ones. Thus it now becomes possible to also steal idle connections from other groups in situations like this one where there is no other solution. And given that this is super rare, the extra cost of doing so remains imperceptible. - there's now a new option "strict-maxconn" on the servers that allows to enforce a strict maxconn check. Indeed, originally when there was no keep-alive, the number of connections was the same as the number of outgoing requests. When keep-alive arrived with idle connections, the decision was made not to break existing setups and to subject concurrent requests to the maxconn limit since it's what describes the processing cost incurred to the server. But this means that a server can see more connections when idle ones are accounted. In some rare cases, limited servers which cannot deal with idle connections could refrain from processing new connections. This was essentially observed with SPOE though we could imagine the same if someone uses, say, netcat as an HTTP server with a single connection. The new option enforces the strict limit and will either enforce the reuse of existing connections even from other thread groups, or actively kill unusable idle conns before opening new ones. Of course one must only use that as a last resort since it may reduce the connection reuse ratio, but it may be useful to work around certain components' limitations. - HTTP compression can now specifiy with "minsize-req" and "minsize-res" below which size the payload is not worth compressing. Indeed, for small objects, it's just a waste of time on both ends, and even of bandwidth if the savings are lower than the extra Content-Encoding header! - the "accept-unsafe-violations-in-http-request" and its response counter part now also accept websocket upgrade requests lacking the sec-websocket-key and sec-websocket-accept, as a use case was reported from API clients not producing them on internal networks. However, just like for H2, a fresh new header will still be produced on output, so this can also be used to make a non-compliant client talk to a compliant server. - the log-forward sections now support options to relax the message validation (dont-parse-log and assume-rfc6587-ntf). - the "accept_date" and "request_date" sample fetch functions now take care of falling back to the session's date if no stream was instantiated yet, e.g. when logging SSL handshake errors, instead of leaving empty fields. Now I'm wondering if we shouldn't consider this as a bug fix and backport it. Probably. - "show sess" on the CLI can now filter streams attached to a server, a backend or a frontend. The real use case is typically to automatically dump streams refusing to die after "shutdown server sessions", but there may be plenty of other valid cases such as focusing only on certain applications. - the changes needed to made stream dumps more reliable have an impact which is that warning dumps and "show threads" will not always resolve symbols (only for their own threads but no longer for others), as we've found cases where if another one was already doing the same, we could deadlock in the libc... Since the vast majority of users are not particularly interested in looking at the detailed output of "show threads", this is not a problem but I preferred to mention it as a visible change. The rest is the usual CI updates, and cleanups over doc, regtests, etc. Last point, time flies, and at the end of the month we'll be 2 months from the release, so we'll have to calm down on changes to reserve time for fixes coming from late testing. Let's leave sensitive changes for the next two dev releases only, i.e. till dev9 and from that point we'll have to focus on lighter stuff. Thus if you still have tricky changes pending, don't wait for upstreaming them. Please find the usual URLs below : Site index : https://www.haproxy.org/ Documentation : https://docs.haproxy.org/ Wiki : https://github.com/haproxy/wiki/wiki Discourse : https://discourse.haproxy.org/ Slack channel : https://slack.haproxy.org/ Issue tracker : https://github.com/haproxy/haproxy/issues Sources : https://www.haproxy.org/download/3.2/src/ Git repository : https://git.haproxy.org/git/haproxy.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy.git Changelog : https://www.haproxy.org/download/3.2/src/CHANGELOG Dataplane API : https://github.com/haproxytech/dataplaneapi/releases/latest Pending bugs : https://www.haproxy.org/l/pending-bugs Reviewed bugs : https://www.haproxy.org/l/reviewed-bugs Code reports : https://www.haproxy.org/l/code-reports Latest builds : https://www.haproxy.org/l/dev-packages Willy --- Complete changelog : Amaury Denoyelle (16): BUG/MINOR: h3: do not report transfer as aborted on preemptive response CLEANUP: h3: fix documentation of h3_rcv_buf() MINOR: hq-interop: properly handle incomplete request BUG/MINOR: hq-interop: fix leak in case of rcv_buf early return TESTS: quic: create first quic unittest MINOR: h3/hq-interop: restore function for standalone FIN receive MINOR/OPTIM: mux-quic: do not allocate rxbuf on standalone FIN MINOR: mux-quic: refine reception of standalone STREAM FIN MINOR: mux-quic: define globally stream rxbuf size MINOR: mux-quic: define rxbuf wrapper MINOR: mux-quic: store QCS Rx buf in a single-entry tree MINOR: mux-quic: adjust Rx data consumption API MINOR: mux-quic: adapt return value of qcc_decode_qcs() MAJOR: mux-quic: support multiple QCS RX buffers MEDIUM: mux-quic: handle too short data splitted on multiple rxbuf MAJOR: mux-quic: increase stream flow-control for multi-buffer alloc Aurelien DARRAGON (14): REGTESTS: fix reg-tests/server/abnsz.vtc BUG/MINOR: log: fix outgoing abns address family BUG/MINOR: sink: add tempo between 2 connection attempts for sft servers MINOR: clock: always use atomic ops for global_now_ms CLEANUP: log: removing "log-balance" references BUG/MINOR: log: set proper smp size for balance log-hash MINOR: log: use __send_log() with exact payload length MEDIUM: log: postpone the decision to send or not log with empty messages MINOR: proxy: make pr_mode enum bitfield compatible MINOR: cfgparse-listen: add and use cfg_parse_listen_match_option() helper BUG/MINOR: cfgparse/peers: fix inconsistent check for missing peer server BUG/MINOR: cfgparse/peers: properly handle ignored local peer case BUG/MINOR: server: dont return immediately from parse_server() when skipping checks MINOR: cfgparse/peers: provide more info when ignoring invalid "peer" or "server" lines Christopher Faulet (3): BUG/MEDIUM: applet: Don't handle EOI/EOS/ERROR is applet is waiting for room BUG/MEDIUM: spoe/mux-spop: Introduce an NOOP action to deal with empty ACK BUG/MEDIUM: mux-fcgi: Try to fully fill demux buffer on receive if not empty Damien Claisse (1): BUG/MINOR: cfgparse-tcp: relax namespace bind check Dragan Dosen (2): BUG/MEDIUM: server: properly initialize PROXY v2 TLVs BUG/MINOR: server: fix the "server-template" prefix memory leak Ilia Shipitsin (2): CI: QUIC Interop: clean old docker images BUILD: add possibility to use different QuicTLS variants Olivier Houchard (8): MEDIUM: fd: Wait if locked in fd_grab_tgid() and fd_take_tgid(). MINOR: fd: Add fd_lock_tgid_cur(). MEDIUM: epoll: Make sure we can add a new event MINOR: pollers: Add a fixup_tgid_takeover() method. MEDIUM: pollers: Drop fd events after a takeover to another tgid. MEDIUM: connections: Allow taking over connections from other tgroups. MEDIUM: servers: Add strict-maxconn. DEBUG: init: Add a macro to register unit tests Roberto Moreda (3): MINOR: log: add options eval for log-forward MINOR: log: detach prepare from parse message MINOR: log: add dont-parse-log and assume-rfc6587-ntf options Valentine Krasnobaeva (4): BUG/MINOR: cfgparse: fix NULL ptr dereference in cfg_parse_peers MINOR: sample: allow custom date format in error-log-format BUG/MEIDUM: startup: return to initial cwd only after check_config_validity() MINOR: startup: adjust alert messages, when capabilities are missed Vincent Dechenaux (1): MINOR: compression: Introduce minimum size William Lallemand (15): MINOR: jws: implement a JWK public key converter DEBUG: init: add a way to register functions for unit tests TESTS: add a unit test runner in the Makefile TESTS: jws: register a unittest for jwk CI: github: run make unit-tests on the CI TESTS: add config smoke checks in the unit tests MINOR: jws: conversion to NIST curves name CI: github: remove smoke tests from vtest.yml TESTS: ist: fix wrong array size TESTS: ist: use the exit code to return a verdict TESTS: ist: add a ist.sh to launch in make unit-tests CI: github: fix h2spec.config proxy names TESTS: change the output of run-unittests.sh TESTS: unit-tests: store sh -x in a result file CI: github: show results of the Unit tests Willy Tarreau (18): BUG/MEDIUM: uxst: fix outgoing abns address family in connect() BUG/MINOR: stream: do not call co_data() from __strm_dump_to_buffer() BUG/MINOR: mux-h1: always make sure h1s->sd exists in h1_dump_h1s_info() MINOR: tinfo: add a new thread flag to indicate a call from a sig handler BUG/MEDIUM: stream: never allocate connection addresses from signal handler MINOR: freq_ctr: provide non-blocking read functions BUG/MEDIUM: stream: use non-blocking freq_ctr calls from the stream dumper MINOR: tools: use only opportunistic symbols resolution CLEANUP: task: move the barrier after clearing th_ctx->current BUG/MINOR: h2: always trim leading and trailing LWS in header values MINOR: tinfo: split the signal handler report flags into 3 BUG/MEDIUM: stream: don't use localtime in dumps from a signal handler OPTIM: connection: don't try to kill other threads' connection when !shared MINOR: h1: permit to relax the websocket checks for missing mandatory headers BUG/MINOR: server: check for either proxy-protocol v1 or v2 to send hedaer BUG/MINOR: stream: fix age calculation in "show sess" output MINOR: stream/cli: rework "show sess" to better consider optional arguments MINOR: stream/cli: make "show sess" support filtering on front/back/server ---