Hi, HAProxy 2.9-dev9 was released on 2023/11/04. It added 42 new commits after version 2.9-dev8.
This version was mostly focused on fixing issues introduced during 2.9-dev, which is a good indication that things are calming down and stabilizing. A few of them could cause crashes. Aside bug fixes come some improvements: - QUIC connections are now accounted for, both in terms of connections and SSL connections. Thus the maxsslconn should now work, for example. - stick-tables now support pushing incoming non-aggregable data to another table. This is useful in cluster setups where each node tracks activity to its local table and also watches the neighbors' tables. Some info such as server_id, gpt etc work differently in that the last update overrides all values. But trying to perform stickiness in such setups wouldn't work (or requires separate tables which is not always convenient). Now placing "write-to table-foo" on a stick-table line will automatically refresh the equivalent entry in table-foo when a peer sends an update for such data, so so that the local table can be used both for counters and tags or stickiness. - it's now possible to set arbitrary PROXY Protocol fields in outgoing server connections with the new "set-proxy-v2-tlv-fmt()" directive. It will no longer be required to abuse the unique-id header for this, as I've heard in the past. - Lua's logging can now be selectively enabled for stderr and for loggers, and by default stderr will only be used if no loggers are available (so as to avoid log duplication for those who collect stderr and logs at the same place). - a new pair of sample fetch functions "req.cook_names" and "res.cook_names" return the list of the cookie names found in the request and response respectively. This can be used to improve logging or to quickly validate that a request has everything needed to be reliably processed. - initialization errors caused by stick-tables will now be a bit more verbose; till now a memory allocation failure would just have reported "failed to initialize stick-table foo" without more explanation. - the config check performed by the systemd unit file on reloads is no longer marked quiet, because that apparently hides errors un reloads. Now errors and warnings will be visible in "systemctl status". - the H2 mux uses significantly less memory and is up to 40-60% more CPU-efficient on large transfers thanks to a faster recycling of the buffers that significantly increases the probability of performing zero-copy operations. - the panic dumps are progressively getting smarter by trying to detect some likely causes and giving some hints. For example if a call to malloc_trim() is detected in the trace, a suggestion to disable it will be emitted. Similarly if a thread is waiting on the Lua lock while some "lua-load" directives are in used, an invitation to try "lua-load-per-thread" will be emitted. And if a watchdog triggers inside Lua, some possible causes will be proposed (including the fact that maybe the script depends on some external unsafe library). - wolfssl-5.6.4 was finally issued and is in a much better shape than 5.6.3 for haproxy compatibility, without requiring to close directly from github, so docs were updated to reflect this. - some doc updates as usual I'm glad to see we could finally merge in time all the pending stuff that has been floating around for some time, it will let us focus on bug fixing and cleanups now. Thanks to those who pinged me again in time ;-) Some issues and limitations are still present: - when using the reverse-http, if an SNI is needed on the server line, please make sure to use a constant expression (e.g. sni str("foo")), as the lack of a session during the pre-connect phase would currently crash on non-constant expressions. - the cases where large numbers of buffers remain allocated was finally found and I even have a tested fix for it. It "just" needs to be committed and documented, as usual. - with Amaury and Christopher we've identified a class of problems that are responsible for the occasional process_stream() loops that some like Tristan have been witnessing recently. There are essentially two causes, one that's easy to fix, caused by a difference in the way two layers check for available room in a buffer, and another one, more subtle, related to the way we calculate the next activity timeout for a given condition. Some of them are not always properly shut or may be re-armed after certain events (e.g. end of transfer) and we'll need to carefully review these use cases to see how to address them. It's a bit tricky. We're still on track for a release around the end of this month. Tests are still really necessary, especially if you've been waiting for a feature in this version. It would be bad to wait for the release to test it, spot a bug, and have to wait for a next stable release! The pending issues above do not prevent the code from working at all, as we can see on haproxy.org and the few other places that run 2.9-dev. Running some dev "just" requires a certain level of control of one's production (typically ease of rollback in case anything would go wrong). 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/2.9/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/2.9/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 : Aleksandar Lazic (1): DOC: internal: filters: fix reference to entities.pdf Alexander Stephan (2): MINOR: server: Add parser support for set-proxy-v2-tlv-fmt MINOR: connection: Send out generic, user-defined server TLVs Amaury Denoyelle (10): BUG/MINOR: backend: fix wrong BUG_ON for avail conn BUG/MAJOR: backend: fix idle conn crash under low FD MINOR: backend: refactor insertion in avail conns tree BUG/MINOR: quic: do not consider idle timeout on CLOSING state MINOR: frontend: implement a dedicated actconn increment function BUG/MINOR: ssl: use a thread-safe sslconns increment MEDIUM: quic: count quic_conn instance for maxconn MEDIUM: quic: count quic_conn for global sslconns BUG/MINOR: mux-quic: fix early close if unset client timeout BUG/MINOR: proto_reverse_connect: support SNI on active connect Aurelien DARRAGON (10): BUG/MEDIUM: server/log: "mode log" after server keyword causes crash MINOR: connection: add conn_pr_mode_to_proto_mode() helper func BUG/MEDIUM: server: "proto" not working for dynamic servers MINOR: server: add helper function to detach server from proxy list MINOR: proxy/stktable: add resolve_stick_rule helper function BUG/MINOR: stktable: missing free in parse_stick_table() BUG/MINOR: cfgparse/stktable: fix error message on stktable_init() failure MINOR: stktable: stktable_init() sets err_msg on error MINOR: stktable: check if a type should be used as-is MEDIUM: stktable/peers: "write-to" local table on peer updates Christopher Faulet (1): BUG/MINOR: tcpcheck: Report hexstring instead of binary one on check failure Ruei-Bang Chen (1): MINOR: sample: Add fetcher for getting all cookie names Tristan (2): MINOR: lua: Add flags to configure logging behaviour MINOR: lua: change tune.lua.log.stderr default from 'on' to 'auto' William Lallemand (7): BUG/MINOR: ssl: load correctly @system-ca when ca-base is define BUG/MINOR: ssl: suboptimal certificate selection with TLSv1.3 and dual ECDSA/RSA REGTESTS: ssl: update the filters test for TLSv1.3 and sigalgs BUG/MEDIUM: ssl: segfault when cipher is NULL MEDIUM: systemd: be more verbose about the reload CI: github: update wolfSSL to 5.6.4 DOC: install: update the wolfSSL required version Willy Tarreau (8): DEBUG: mux-h2/flags: fix list of h2c flags used by the flags decoder DEBUG: add a tainted flag when ha_panic() is called DEBUG: lua: add tainted flags for stuck Lua contexts DEBUG: pools: detect that malloc_trim() is in progress BUG/MEDIUM: pattern: don't trim pools under lock in pat_ref_purge_range() MINOR: mux-h2: always use h2_send() in h2_done_ff(), not h2_process() OPTIM: mux-h2: call h2_send() directly from h2_snd_buf() BUG/MINOR: server: remove some incorrect free() calls on null elements ---