Hi, HAProxy 3.3-dev2 was released on 2025/06/26. It added 114 new commits after version 3.3-dev1.
As usual a few bug fixes but nothing really alarming, 3.2 for now seems to be a pretty good one. This version now applied the pending list of breaking changes (listed there: https://github.com/haproxy/wiki/wiki/Breaking-changes ): - "dispatch" and "option transparent" are now deprecated and will emit a warning indicating how to replace them, and how to silence the warning during the transition period. - the deprecated "program" section is gone as well, it has never been really used in fact and was a source of headache for process management. - naming collisions between frontends and backends that was deprecated since 3.1 is no longer supported. Note that the warning was turned into an error, but a lot of code cleanup is still needed due to all the hacks in place to work with that specificity. - naming collisions between servers with different IDs that was also deprecated since 3.1 is no longer supported either. Same as above, some cleanup still has to be done (essentially removing handling for a ton of special cases that can no longer happen and that will make haproxy start faster with large configs). - the deprecated "native mailers" based on hacked TCP checks are no longer supported, only the Lua-based ones will make use of the mailers section. That makes me think that I'm not sure we have a way to ensure that such a script is loaded, as we don't want to have a mailers section not emit any error if the Lua script is not loaded. Will check that. As previously indicated, the "performance" cpu-policy is now the default starting with 3.3, which means that large machines will by default use all their CPUs (no longer limited to 64 threads, multiple nodes will be used and split into groups). Those with large systems and no specific binding might observe a small increase in memory usage and an increase in overall performance as well, as witnessed by Basha in his talk at HAProxyConf. Performance regressions, if any, should be reported, of course! There's also a new option to enable/disable secure TLS renegotiation on the backend. Do not ask me what it's used for, though, I'm mostly summarizing what I'm seeing :-) And almost all the remaining changes (~75%) are preparatory work to support QUIC on the backend side. It is still extremely experimental and under active development (hence requires "expose-experimental-directives") but it already starts to work for current tests. While the initial use cases probably don't seem obvious, the long term goal will be to support QUIC on the whole chain so that we don't miss opportunities to adapt to an ever growing ecosystem which we've adopted early, and can continue to participate to the QMux experiments and development. As a bonus it should help us implement the regression tests for H3 and QUIC that we've been missing for so long, and even simplify experiments on new congestion control algorithms. Note to myself: I should take vacation more often if it permits my coworker to progress this fast when I'm not there ;-) And the rest is essentially doc clarifications and minor stuff. Due to the number of possibly breaking config changes (that were planned and used to cause warnings but we know how we all are...) and the fact that for now virtually nothing on the critical path was touched, it's a good moment to give it a try just to make sure your configs continue to load and work, as this version is very close to latest 3.2 but with these changes. At least it's loading and working on haproxy.org! I think we'll have to produce a new 3.2 maybe next week since there remains a rare race in the leastconn algo, but that's about all that's needed for it and it seems hard to trigger, so I think we can still wait a little bit more to see if other fixes are needed. We'll see. 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 Q&A from devs : https://github.com/orgs/haproxy/discussions Sources : https://www.haproxy.org/download/3.3/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.3/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 (40): BUG/MINOR: config/server: reject QUIC addresses MINOR: server: implement helper to identify QUIC servers MINOR: server: mark QUIC support as experimental MINOR: mux-quic-be: allow QUIC proto on backend side MINOR: quic: define proper proto on QUIC servers BUG/MEDIUM: mux-quic: adjust wakeup behavior MEDIUM: backend: delay MUX init with ALPN even if proto is forced MINOR: quic: mark ctrl layer as ready on quic_connect_server() MINOR: mux-quic: improve documentation for snd/rcv app-ops MINOR: mux-quic: define flag for backend side MINOR: mux-quic: set expect data only on frontend side MINOR: mux-quic: instantiate first stream on backend side MINOR: quic: wakeup backend MUX on handshake completed MINOR: hq-interop: decode response into HTX for backend side support MINOR: hq-interop: encode request from HTX for backend side support BUG/MINOR: quic: prevent crash on startup with -dt MINOR: server: reject QUIC servers without explicit SSL BUG/MINOR: quic: work around NEW_TOKEN parsing error on backend side BUG/MINOR: quic: don't restrict reception on backend privileged ports MINOR: hq-interop: handle HTX response forward if not enough space BUG/MINOR: quic: fix ODCID initialization on frontend side BUG/MINOR: mux-quic: check sc_attach_mux return value MINOR: h3: support basic HTX start-line conversion into HTTP/3 request MINOR: h3: encode request headers MINOR: h3: complete HTTP/3 request method encoding MINOR: h3: complete HTTP/3 request scheme encoding MINOR: h3: adjust path request encoding MINOR: h3: adjust auth request encoding or fallback to host MINOR: h3: prepare support for response parsing MINOR: h3: convert HTTP/3 response into HTX for backend side support MINOR: h3: complete response status transcoding MINOR: h3: transcode H3 response headers into HTX blocks MINOR: h3: use BUG_ON() on missing request start-line MINOR: h3: reject invalid :status in response CLEANUP: connection: remove unused mux-ops dedicated to QUIC BUG/MINOR: mux-quic/h3: properly handle too low peer fctl initial stream MINOR: mux-quic: support max bidi streams value set by the peer MINOR: mux-quic: abort conn if cannot create stream due to fctl MEDIUM: mux-quic: implement attach for new streams on backend side BUG/MEDIUM: quic: do not release BE quic-conn prior to upper conn Aurelien DARRAGON (3): BUILD: listener: fix 'for' loop inline variable declaration MINOR: hlua: emit a log instead of an alert for aborted actions due to unavailable yield MAJOR: mailers: remove native mailers support Christopher Faulet (9): BUG/MINOR: hlua: Don't forget the return statement after a hlua_yieldk() BUILD: hlua: Fix warnings about uninitialized variables BUILD: hlua: Fix warnings about uninitialized variables (2) BUG/MINOR: http-ana: Properly handle keep-query redirect option if no QS BUG/MEDIUM: cli: Don't consume data if outbuf is full or not available MINOR: cli: handle EOS/ERROR first BUG/MEDIUM: check: Set SOCKERR by default when a connection error is reported BUG/MINOR: stream: Avoid recursive evaluation for unique-id based on itself BUG/MINOR: log: Be able to use %ID alias at anytime of the stream's evaluation Frederic Lecaille (40): MINOR: quic-be: Correct Version Information transp. param encoding MINOR: quic-be: Version Information transport parameter check MINOR: quic-be: Call ->prepare_srv() callback at parsing time MINOR: quic-be: QUIC backend XPRT and transport parameters init during parsing MINOR: quic-be: QUIC server xprt already set when preparing their CTXs MINOR: quic-be: Add a function for the TLS context allocations MINOR: quic-be: Correct the QUIC protocol lookup MINOR: quic-be: ssl_sock contexts allocation and misc adaptations MINOR: quic-be: SSL sessions initializations MINOR: quic-be: Add a function to initialize the QUIC client transport parameters MINOR: sock: Add protocol and socket types parameters to sock_create_server_socket() MINOR: quic-be: ->connect() protocol callback adaptations MINOR: quic-be: QUIC connection allocation adaptation (qc_new_conn()) MINOR: quic-be: xprt ->init() adapatations MINOR: quic-be: add field for max_udp_payload_size into quic_conn MINOR: quic-be: Do not redispatch the datagrams MINOR: quic-be: Datagrams and packet parsing support MINOR: quic-be: Handshake packet number space discarding MINOR: h3-be: Correctly retrieve h3 counters MINOR: quic-be: Store asap the DCID MINOR: quic-be: Build post handshake frames MINOR: quic-be: Add the conn object to the server SSL context MINOR: quic-be: Initial packet number space discarding. MINOR: quic-be: I/O handler switch adaptation MINOR: quic-be: Store the remote transport parameters asap MINOR: quic-be: Missing callbacks initializations (USE_QUIC_OPENSSL_COMPAT) MINOR: quic-be: Make the secret derivation works for QUIC backends (USE_QUIC_OPENSSL_COMPAT) MINOR: quic-be: SSL_get_peer_quic_transport_params() not defined by OpenSSL 3.5 QUIC API MINOR: quic-be: get rid of ->li quic_conn member MINOR: quic-be: Prevent the MUX to send/receive data MEDIUM: quic-be: initialize MUX on handshake completion CLEANUP: quic-be: Add comments about qc_new_conn() usage BUG/MINOR: quic-be: CID double free upon qc_new_conn() failures MINOR: quic-be: Avoid SSL context unreachable code without USE_QUIC_OPENSSL_COMPAT BUG/MINOR: quic: Fix OSSL_FUNC_SSL_QUIC_TLS_got_transport_params_fn callback (OpenSSL3.5) BUG/MINOR: quic: wrong QUIC_FT_CONNECTION_CLOSE(0x1c) frame encoding MINOR: quic-be: add a "CC connection" backend TX buffer pool MINOR: quic: Useless TX buffer size reduction in closing state MINOR: quic-be: Allow sending 1200 bytes Initial datagrams MINOR: quic-be: address validation support implementation (RETRY) Maximilian Moehl (1): DOC: config: crt-list clarify default cert + cert-bundle Olivier Houchard (2): BUG/MAJOR: fwlc: Count an avoided server as unusable. MINOR: fwlc: Factorize code. Remi Tricot-Le Breton (1): MINOR: ssl: Add "renegotiate" server option Valentine Krasnobaeva (3): DOC: config: prefer-last-server: add notes for non-deterministic algorithms BUG/MINOR: tools: use my_unsetenv instead of unsetenv CLEANUP: startup: move comment about nbthread where it's more appropriate William Lallemand (4): BUG/MEDIUM: ssl/clienthello: ECDSA with ssl-max-ver TLSv1.2 and no ECDSA ciphers DOC: configuration: add details on prefer-client-ciphers DOC: remove the program section from the documentation MAJOR: mworker: remove program section support Willy Tarreau (11): MAJOR: cfgparse: turn the same proxy name warning to an error MAJOR: cfgparse: make sure server names are unique within a backend BUG/MINOR: tools: only reset argument start upon new argument MEDIUM: proxy: deprecate the "transparent" and "option transparent" directives REGTESTS: update http_reuse_be_transparent with "transparent" deprecated REGTESTS: script: also add a line pointing to the log file DOC: config: explain how to deal with "transparent" deprecation MEDIUM: proxy: mark the "dispatch" directive as deprecated MEDIUM: cpu-topo: switch to the "performance" cpu-policy by default SCRIPTS: drop the HTML generation from announce-release BUILD: qpack: fix a build issue on older compilers ---