Hi, HAProxy 3.1-dev5 was released on 2024/08/07. It added 88 new commits after version 3.1-dev4.
There were quite a bunch of fixes this time, spread over various areas (h2, analysers, jwt, quic, 0-rtt, queues, traces), though nothing exciting at this point. We've got a report of a user facing higher loads due to one of the new safety rules enforcements in the HTTP spec mandating that requests that contain both Transfer-Encoding and Content-Length had to work in close mode (to avoid smuggling on possible incompatible intermediary HTTP/1.0 proxies), so we've added an option to relax this rule when the chain is trusted. On the QUIC side, Chacha20 and 0-RTT were fixed when using the aws-lc crypto library. A new ruleset "quic-initial" allows to filter packets during the QUIC handshake. The currently supported actions are "reject", "accept", "dgram-drop" (for a silent drop), and "send-retry" (to force a retry when in 0-RTT for example). It can significantly help against abuses or simply to enforce source-based filtering so that the client cannot even engage in a handshake. The quic traces will now also indicate how long a stream spent waiting for flow control, buffers, etc, which should help us explain why certain requests appear to be slow. Some Cubic-specific info are now also dumped in "show quic". The traces now permit some sources to follow other ones, so that when a source automatically triggers, the followers will automatically be enabled as well. One use case is to track the session, allowing to watch a communication between the frontend and the backend without being disturbed by the rest of the traffic. We've verified that we can follow a series of requests from a front QUIC connection to an HTTP/2 backend. This will allow us to simplify some captures. Also a new meta-source "all" is supported for some "trace" commands, to set the sink, the level and the source to follow. This will save a lot of debugging commands. A new pair of sample fetch functions, fs.debug_str() and bs.debug_str() can be used to complete the logs with useful debugging info from the lower layers (stream ID, flow-control etc). It appears important to continue to provide detailed troubleshooting elements because it has happened quite a few times since we have muxes that some logs would report an error, a timeout or something unusual and that it was a bit hard to figure what happened at the lower layers. Obviously with protocols like H2 and QUIC we can't tell the whole history but it should help quite a bit. For example the stream's pause times mentioned above will be there so it will be possible to correlate the request timers with some such elements. A more significant change concerns the loading of configuration files. Previously they were opened and parsed on the fly just once. With the pending master startup changes, the starting process will need to check in the global section if it's supposed to be the master process and stop there, and the worker will parse its own config. Since /dev/stdin works and is supported, it's not possible to open it twice. Instead it was decided that the config is pre-loaded in memory and processed from there so that it stays buffered. The config size in memory is not much of a concern given the huge amplification factor (40 to 100x) of a config represented in memory, so the temporary extra copy of the text-based one is small. There could be pitfalls, though and it's always interesting to know if you find something that breaks it. We already know that loading /dev/zero will make it eat a lot of RAM for example, but we'll rather address all corner cases as a whole than each of them individually. And the rest is as usual, some build fixes, CI updates and doc updates. Quite honestly, if you're running large configs and/or are streaming your configs over SSH to a remote daemon for example, or doing anything fancy, your feedback on the config loading changes is really important to those working on this. Normally you should not notice a difference at this step. 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.1/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.1/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 (23): MINOR: quic: delay Retry emission on quic-force-retry MEDIUM: quic: implement quic-initial rules MINOR: quic: support ACL for quic-initial rules MINOR: quic: pass quic_dgram as obj_type for quic-initial rules MINOR: quic: implement reject quic-initial action MINOR: quic: implement send-retry quic-initial rules BUG/MEDIUM: quic: fix invalid conn reject with CONNECTION_REFUSED BUG/MEDIUM: quic: prevent conn freeze on 0RTT undeciphered content MINOR: flags/mux-quic: decode qcc and qcs flags BUG/MINOR: quic: fix fc_rtt/srtt values BUG/MIONR: quic: fix fc_lost BUG/MINOR: h1: do not forward h2c upgrade header token BUG/MINOR: h2: reject extended connect for h2c protocol MINOR: quic: convert qc_stream_desc release field to flags MINOR: quic: implement function to check if STREAM is fully acked BUG/MEDIUM: quic: handle retransmit for standalone FIN STREAM MINOR: quic: enforce ACK reception is handled in order MINOR: mux-quic: define dump functions for QCC and QCS MINOR: mux-quic: implement debug string for logs MINOR: quic: dump quic_conn debug string for logs MINOR: time: define tot_time structure MINOR: mux-quic: measure QCS lifetime and its blocking state BUG/MINOR: quic: prevent freeze after early QCS closure Aurelien DARRAGON (3): MEDIUM: sink: assume sft appctx stickiness BUG/MEDIUM: server/addr: fix tune.events.max-events-at-once event miss and leak MINOR: server: ensure max_events_at_once > 0 in server_atomic_sync() Christopher Faulet (9): BUG/MEDIUM: jwt: Clear SSL error queue on error when checking the signature DOC: config: Add documentation about spop mode for backends BUG/MEDIUM: stconn: Report error on SC on send if a previous SE error was set BUG/MEDIUM: mux-pt/mux-h1: Release the pipe on connection error on sending path BUILD: mux-pt: Use the right name for the sedesc variable BUG/MEDIUM: http-ana: Report error on write error waiting for the response BUG/MEDIUM: h2: Only report early HTX EOM for tunneled streams BUG/MEDIUM: mux-h2: Propagate term flags to SE on error in h2s_wake_one_stream BUG/MEDIUM: peer: Notify the applet won't consume data when it waits for sync Frederic Lecaille (7): BUG/MINOR: quic: Lack of precision when computing K (cubic only cc) MINOR: quic: Add information to "show quic" for CUBIC cc. MINOR: quic: Dump TX in flight bytes vs window values ratio. MINOR: tcp_sample: Move TCP low level sample fetch function to control layer MINOR: quic: Define ->get_info() control layer callback for QUIC BUG/MINOR: quic: Too shord datagram during O-RTT handshakes (aws-lc only) BUG/MINOR: quic: Too short datagram during packet building failures (aws-lc only) Ilia Shipitsin (4): CI: add weekly QUIC Interop regression against AWS-LC CI: harden NetBSD builds by ERR=1 DEV: coccinelle: add a test to detect unchecked strdup() BUG/MINOR: fcgi-app: handle a possible strdup() failure Valentine Krasnobaeva (9): MINOR: cfgparse: add struct cfgfile to represent config in memory REORG: tools: move list_append_word to cfgparse MINOR: startup: adapt list_append_word to use cfgfile MINOR: cfgparse: add load_cfg_in_mem MINOR: cfgparse: load_cfg_in_mem: take in account file size MINOR: tools: add fgets_from_mem MEDIUM: startup: make read_cfg() return immediately on ENOMEM MEDIUM: startup: load and parse configs from memory MINOR: startup: rename readcfgfile in parse_cfg William Lallemand (7): MEDIUM: ssl/quic: implement quic crypto with EVP_AEAD MINOR: quic: rename confusing wording aes to hp MEDIUM: quic: add key argument to header protection crypto functions MEDIUM: quic: implement CHACHA20_POLY1305 for AWS-LC BUG/MEDIUM: ssl: reactivate 0-RTT for AWS-LC BUG/MEDIUM: ssl: 0-RTT initialized at the wrong place for AWS-LC BUILD: ssl: replace USE_OPENSSL_AWSLC by OPENSSL_IS_AWSLC Willy Tarreau (26): MEDIUM: h1: allow to preserve keep-alive on T-E + C-L BUILD: cfgparse-quic: fix build error on Solaris due to missing netinet/in.h MINOR: queue: add a function to check for TOCTOU after queueing BUG/MEDIUM: queue: deal with a rare TOCTOU in assign_server_and_queue() BUG/MINOR: stconn: bs.id and fs.id had their dependencies incorrect DOC: configuration: fix alphabetical ordering of {bs,fs}.aborted MINOR: stconn: add a new pair of sf functions {bs,fs}.debug_str MINOR: mux-h2: implement the debug string for logs BUG/MINOR: trace/quic: enable conn/session pointer recovery from quic_conn BUG/MINOR: trace/quic: permit to lock on frontend/connect/session etc BUG/MEDIUM: trace: fix null deref in lockon mechanism since TRACE_ENABLED() BUG/MINOR: trace: automatically start in waiting mode with "start <evt>" BUG/MINOR: trace/quic: make "qconn" selectable as a lockon criterion BUG/MINOR: quic/trace: make quic_conn_enc_level_init() emit NEW not CLOSE MINOR: trace: support setting the sink and level for all sources at once MINOR: session/trace: enable very minimal session tracing MEDIUM: trace: implement a "follow" mechanism MINOR: trace: move the known trace context into a dedicated struct MINOR: trace: add a per-source helper to pre-fill the context MINOR: mux-h2: add a trace context filling helper MINOR: mux-h1: add a trace context filling helper MINOR: mux-quic: don't leave dangling pointer after freeing qcs->sd MINOR: mux-quic: add a trace context filling helper MINOR: mux-h1/trace: add a state trace on stream creation/upgrade MINOR: mux-h2/trace: add a state trace on stream creation/destruction MINOR: mux-h3/trace: add a state trace on stream creation/destruction ---