Hi, HAProxy 2.9-dev7 was released on 2023/10/06. It added 75 new commits after version 2.9-dev6.
This version fixes a number of issues in previous development releases and prepares the work for subsequent patch series: - Rémi found a bug in the latest update of the plock code that could sometimes make the wrlock unreliable (it didn't wait for one reader to finish). Let's hope this was the one causing the two recent crashes on haproxy.org for which the cores made no sense but could be explained by memory corruption. - some updates to the reverse-connect code, which now works much better. An FD leak was fixed, the attach-srv action parser was fixed to support conditions and doesn't mandate anymore that all listeners are H2. I'll retry to setup a gateway soon. - a race in the Lua co-socket connect code was addressed, by which if it's interrupted by the Lua scheduler in the middle of the operation, it would fail and not be able to recover. Now it will be able to reconnect. - QUIC now builds with the AWS-LC TLS library. A few features are currently missing: 0-RTT, some ciphers based on chacha20 and aes128-ccm, and the client hello callback that's used to select the certificate between RSA and ECDSA. The support status page will be updated soon with this. - QUIC binding errors at runtime when trying to connect back to a client will now emit a warning once to suggest using capabilities or uid to address the issue. - the cache now supports the "Origin" header as a secondary cache key - "http-request set-timeout" now supports "client" to adjust the timeout on the front connection. - the panic message for spinning streams will now use the same large format as used in "show sess all", because once to twice a year we still face such a report and every time the contents were insufficient to diagnose the reason. - the post-parsing checks for the "mode" keyword were all revisited not to consider anymore that TCP and HTTP were mutual opposites. This will make it easier to bring new modes. Note that we're currently chasing a few issues: - we managed to trigger some transfer timeouts with QUIC over lossy networks, which depend on the object size, congestion control algorithms, stream counts and buffer sizes. We captured a full trace and spent a few hours analyzing it to try to estimate where the problem was, but for now without particular conclusion except "that's difficult". This may or may not match what Tristan saw in listener-socket mode and what Luke also reported recently. - on haproxy.org after some time (~10 days) we start to see a memory usage increase related to a negative "needed_avg" estimate that dissuades the callers from releasing the memory. I know it appeared with the split of the pools heads in dev3, I thought I fixed it but it had not been enough in dev6, so I need to continue to analyze the situation (for now it does not happen). I think I managed to ease its reproduction by using violent H2 injections, so I'll have to see. If you observe any abnormal memory, just have a look at the output of "show pools" and see if you see very large "needed_avg". If so you may need to reload. For next steps, some progress was made on long-time issue #401 (improved log server management) with a first step consisting in finally being able to check log servers and group them so that we won't need anymore to rely on the sampling mechanism to perform some dirty load balancing. It might even partially address #1519 (stats). At first glance we already have something usable so it should be merged early next week once the review is complete. I'm still unhappy with the TCP logs that do not scale with threads due to the same reason as the traces: the ring lock that I already tried to remove but that first requires that the DNS code doesn't share this code anymore and that the buffer functions are split and taken away from there. A second big part is the mux-to-mux forwarding that's a bit sensitive and that allows one side to consider the other side's window and flow control before starting to receive data. The goal here is to avoid as much as possible to store data into buffers that we won't be able to evacuate on the other side, since it consumes memory, thrashes L3 caches and degrades performance. It's an even older wish that should pave the way to new classes of optimization and that tends to confirm that the new architecture is much more flexible than the pre-1.9 one (yes, 10 versions will have been necessary for this). A third part is the cache's locking which is about to be significantly relaxed. This should also be ready for next dev. And of course I still have to review Alexander's patches. Overall I'm glad that the sensitive stuff is getting merged ~1.5 months before the release, as it will let us finish the small stuff while continuing the testing and bug fixing, so everything is still on track for now. 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 : Amaury Denoyelle (12): BUG/MINOR: mux-quic: remove full demux flag on ncbuf release BUG/MINOR: proto_reverse_connect: fix FD leak on connection error BUG/MINOR: tcp_act: fix attach-srv rule ACL parsing MINOR: connection: define error for reverse connect MINOR: connection: define mux flag for reverse support MINOR: tcp_act: remove limitation on protocol for attach-srv DEV: sslkeylogger: handle file opening error MINOR: quic: define quic-socket bind setting MINOR: quic: handle perm error on bind during runtime MINOR: backend: refactor specific source address allocation MINOR: proto_reverse_connect: support source address setting BUG/MINOR: hq-interop: simplify parser requirement Aurelien DARRAGON (20): MINOR: tcp_rules: tcp-{request,response} requires TCP or HTTP mode MINOR: stktable: "stick" requires TCP or HTTP mode MINOR: filter: "filter" requires TCP or HTTP mode MINOR: backend/balance: "balance" requires TCP or HTTP mode MINOR: flt_http_comp: "compression" requires TCP or HTTP mode MINOR: http_htx/errors: prevent the use of some keywords when not in tcp/http mode MINOR: fcgi-app: "use-fcgi-app" requires TCP or HTTP mode MINOR: cfgparse-listen: "http-send-name-header" requires TCP or HTTP mode MINOR: cfgparse-listen: "dynamic-cookie-key" requires TCP or HTTP mode MINOR: proxy: dynamic-cookie CLIs require TCP or HTTP mode MINOR: cfgparse-listen: "http-reuse" requires TCP or HTTP mode MINOR: proxy: report a warning for max_ka_queue in proxy_cfg_ensure_no_http() MINOR: cfgparse-listen: warn when use-server rules is used in wrong mode DOC: config: unify "log" directive doc MINOR: sink/log: fix some typos around postparsing logic MINOR: sink: remove useless check after sink creation MINOR: sink: don't rely on p->parent in sink appctx MINOR: sink: don't rely on forward_px to init sink forwarding MINOR: sink: refine forward_px usage MINOR: sink: function to add new sink servers Christopher Faulet (19): BUILD: pool: Fix GCC error about potential null pointer dereference MINOR: hlua: Set context's appctx when the lua socket is created MINOR: hlua: Don't preform operations on a not connected socket MINOR: hlua: Save the lua socket's timeout in its context MINOR: hlua: Save the lua socket's server in its context MINOR: hlua: Test the hlua struct first when the lua socket is connecting BUG/MEDIUM: hlua: Initialize appctx used by a lua socket on connect only DEBUG: mux-h1: Fix event label from trace messages about payload formatting BUG/MINOR: mux-h1: Handle read0 in rcv_pipe() only when data receipt was tried BUG/MINOR: mux-h1: Ignore C-L when sending H1 messages if T-E is also set BUG/MEDIUM: h1: Ignore C-L value in the H1 parser if T-E is also set REGTESTS: filters: Don't set C-L header in the successful response to CONNECT MINOR: mux-h1: Add flags if outgoing msg contains a header about its payload MINOR: mux-h1: Rely on H1S_F_HAVE_CHNK to add T-E in outgoing messages BUG/MEDIUM: mux-h1: Add C-L header in outgoing message if it was removed BUG/MEDIUM: mux-h1; Ignore headers modifications about payload representation BUG/MINOR: h1-htx: Keep flags about C-L/T-E during HEAD response parsing MINOR: h1-htx: Declare successful tunnel establishment as bodyless BUG/MEDIUM: stconn: Fix comparison sign in sc_need_room() Emeric Brun (1): Revert "BUG/MEDIUM: quic: missing check of dcid for init pkt including a token" Remi Tricot-Le Breton (3): Revert "MEDIUM: sample: Small fix in function check_operator for eror reporting" DOC: sample: Add a comment in 'check_operator' to explain why 'vars_check_arg' should ignore the 'err' buffer MEDIUM: cache: Add "Origin" header to secondary cache key Vladimir Vdovin (1): MINOR: support for http-request set-timeout client William Lallemand (3): BUG/MINOR: proto_reverse_connect: fix FD leak upon connect BUILD: quic: allow USE_QUIC to work with AWSLC CI: github: add USE_QUIC=1 to aws-lc build Willy Tarreau (16): CLEANUP: freq_ctr: make all freq_ctr readers take a const CLEANUP: stream: make the dump code not depend on the CLI appctx MINOR: stream: split stats_dump_full_strm_to_buffer() in two CLEANUP: stream: use const filters in the dump function CLEANUP: stream: make strm_dump_to_buffer() take a const stream MINOR: stream: make strm_dump_to_buffer() take an arbitrary buffer MINOR: stream: make strm_dump_to_buffer() show the list of filters MINOR: stream: make stream_dump() always multi-line MINOR: streams: add support for line prefixes to strm_dump_to_buffer() MEDIUM: stream: now provide full stream dumps in case of loops MINOR: debug: use the more detailed stream dump in panics CLEANUP: stream: remove the now unused stream_dump() function MINOR: stream: fix output alignment of stuck thread dumps BUG/MAJOR: plock: fix major bug in pl_take_w() introduced with EBO MINOR: haproxy: permit to register features during boot BUG/MEDIUM: actions: always apply a longest match on prefix lookup ---