Hi, HAProxy 3.2-dev15 was released on 2025/05/09. It added 38 new commits after version 3.2-dev14.
Past week has been a bit chaotic, thanks mainly to two determined testers, Christian and Basha, who reported crashes on dev14 related to peers, queues and SPOE, and dedicated a lot of energy tweaking their configs, testing patches, and collecting traces. Many thanks to them for this again, I'm perfectly aware of the effort it requires to run and monitor code after you've seen an error. It would be really nice if more testers participated like this, even just to report "deployed dev15, no problem so far", as it helps narrow the issues down and limits the amount of changes we're asking others to apply. And it would spread the load on more people, requiring less efforts to a few. So the past 3 full days spent chasing concurrency issues explain this late release. The good thing in all of this, is that it has become increasingly difficult to break the code or make it misbehave, even when having full reproducers, and that most of the bugs fixed date from the pre-3.2 era and are no longer regressions, so I guess that we're really close to something pretty good now. Aside the bugs, some small changes were applied: - revert of a low importance bug-fix on the SPOP mux that was causing infinite loops. This requires deeper changes that are no longer in the scope of what's acceptable for 3.2. - the config parser now detects and reports the problem of empty args. Historically, empty args used to mark the end of the line, and all keyword parsers currently rely on this, so that's not something that will disappear in a long while (though we could imagine special-casing some specific usages). A line like this would trigger a dirty error indicating a missing '}' when "FOO" is empty: http-request accept if { path_sub "a" "$FOO" "b" } this one reported by Demi Marie in issue #2944 is more vicious because it will silently discard the words after the empty arg: acl foo path_sub "a" "$FOO" "b" Now the parser will emit warnings about this and will try to show where the empty arg is. And we should decide whether to turn that into an error for 3.3, or just skip the empty arg if we decide that it has legit use cases. Note that OSS Fuzz has been helpful here, because addressing this woke some other dirty cases we initially overlooked like "\x00blah" ... - the CLI "acme ps" command was replaced with "acme status" which is a bit more intuitive, and shows the status of all certificates. - Björn reported that type "ip" in stick-tables with ipv4-only and ought to be renamed to "ipv4" and make "ip" ipv6. I was caught believing that it had already been done. So a preliminary change was merged to accept "ipv4" as well as "ip" in the config, with the doc encouraging to use it instead. IMHO we can change that in 3.3, with a few provisions that we much check (or ensure) that stick-tables remain compatible over peers so that v4-in-v6 addresses sent to a remote in v4-only can properly be translated. For now in order not to change anything, "ip" remains printed everywhere. - improved error reporting for ssl-f-use. - more improved debugging (lock history is clearer now) - doc updates: crt-store, new "acme" section, resolvers vs libc discussion - mangled outputs in thread dumps was caused by too small a buffer (4kB), indicating we're emitting a lot of useful info now, which also explains why we can more often guess a cause from a dump, or claim that two reports are identical. The buffer was bumped to 8kB per thread. And that's about all for this one. There are still two pending patches I'd like to merge to avoid runtime CPU latency warnings when dealing with heavily contended stick-tables with many peers. The problem is that the peers code is very old and was already not prone to efficient locking, so it can easily start to cause locking cascades and make all threads wait in line at various critical places. Where possible we want to limit this risk and reduce its impacts. There's also the small change on the DNS family choice to periodically revalidate IPv6 connectivity. That's simple to do, I just didn't find 2 hours to finish it. Regarding the LRU cache cleanups however, I think I'll postpone them for 3.3 as my branch still has many patches requiring cleanups. I also need to finish the started work on cleaning :authority from bad characters. And there was a good suggestion by Tim to add a stick-tables section to the doc, I think I can work on this in about a week if we don't face other big bugs. Thus with no more blocking bug in the pipe, please give it a try again, especially if you hadn't till now, as well as if you've tested but remained silent, success stories are helpful to eliminate possible causes for issues others face. 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 (8): MINOR: quic: extend return value during TP parsing BUG/MINOR: quic: use proper error code on missing CID in TPs BUG/MINOR: quic: use proper error code on invalid server TP BUG/MINOR: quic: reject retry_source_cid TP on server side BUG/MINOR: quic: use proper error code on invalid received TP value BUG/MINOR: quic: fix TP reject on invalid max-ack-delay BUG/MINOR: quic: reject invalid max_udp_payload size BUG/MEDIUM: quic: free stream_desc on all data acked Aurelien DARRAGON (4): BUG/MEDIUM: stktable: fix sc_*(<ctr>) BUG_ON() regression with ctx > 9 BUG/MINOR: proxy: only use proxy_inc_fe_cum_sess_ver_ctr() with frontends BUG/MINOR: cli: fix too many args detection for commands MINOR: server: ensure server postparse tasks are run for dynamic servers Christopher Faulet (1): Revert "BUG/MEDIUM: mux-spop: Handle CLOSING state and wait for AGENT DISCONNECT frame" William Lallemand (7): BUG/MINOR: acme/cli: don't output error on success MINOR: acme/cli: 'acme status' show the status acme-configured certificates MEDIUM: acme/ssl: remove 'acme ps' in favor of 'acme status' DOC: configuration: add "acme" section to the keywords list DOC: configuration: add the "crt-store" keyword MINOR: ssl: add filename and linenum for ssl-f-use errors BUG/MINOR: ssl: can't use crt-store some certificates in ssl-f-use Willy Tarreau (18): BUG/MINOR: tools: do not create an empty arg from trailing spaces MEDIUM: config: warn about the consequences of empty arguments on a config line MINOR: tools: make parse_line() provide hints about empty args MINOR: cfgparse: visually show the input line on empty args BUG/MINOR: tools: always terminate empty lines BUG/MINOR: tools: make parseline report the required space for the trailing 0 DEBUG: threads: don't keep lock label "OTHER" in the per-thread history DEBUG: threads: merge successive idempotent lock operations in history DEBUG: threads: display held locks in threads dumps BUG/MAJOR: queue: lock around the call to pendconn_process_next_strm() BUG/MINOR: tools: only fill first empty arg when not out of range MINOR: debug: bump the dump buffer to 8kB MINOR: stick-tables: add "ipv4" as an alias for the "ip" type BUG/MEDIUM: peers: hold the refcnt until updating ts->seen BUG/MEDIUM: stick-tables: close a tiny race in __stksess_kill() BUG/MEDIUM: stick-table: always remove update before adding a new one BUG/MINOR: cfgparse: consider the special case of empty arg caused by \x00 DOC: config: recommend disabling libc-based resolution with resolvers ---