Hi,
HAProxy 3.3-dev4 was released on 2025/07/26. It added 98 new commits
after version 3.3-dev3.
This one contains an average number of fixes (27) sprayed over mostly
quic/h3, lua, acme, applets. Nothing scary here.
For the rest:
- all remaining applets have been reworked to use their own buffers
according to the modern API and not share them with the stream's
channel anymore. This touches DNS, http-client, Lua, logs, peers,
Prometheus. If you happen to maintain your own patches to add your own
applets and have not converted them, you may see a warning indicating
they're working in legacy mode.
- configs involving many proxies will use much less memory, as the
storage for the "default-server" settings was now extracted from
the proxy struct and is released after the section is parsed (~4kB
saved per proxy)
- some configs using lots of servers with a "track" keyword should now
start faster. Ditto for "use-server". It happens that these mechanisms
were still using the outdated O(N) server list traversal instead of
the tree to look up the designated server's name.
- SSL traces now contain the ciphers, curves and sigalgs when known.
- QUIC on the backend side now supports connection reuse, but only in
private mode for now (i.e. no sharing yet between multiple front
connections)
- debugging: "show dev" now reports the thread->CPU bindings, and
haproxy+OS versions are now reported in panic dumps to help sort
out deployment issues and confusion that sometimes stems from using
a different binary than believed in containers. ACME is also listed
in the output of haproxy -vv's feature list.
- stats: a performance degradation caused by one extra pointer dereference
was observed since the introduction of counters sharding. It was now
addressed and the original performance is recovered (and even slightly
surpassed)
- the HTTP client will now try to be nicer to servers by sending both
headers and body at once when available.
Then there are some cleanups, mostly in the server code, developers doc
and extra tools.
Overall there's nothing absolutely amazing nor scary here. The only
slightly sensitive area are the applets, so if you'd observe new issues
with the ones mentioned above, as usual, please do report!
On a side note, the site is now being crawled by AI bots a lot, and the
access to the dynamic git stuff induces high CPU and I/O usage that could
even cause some regular git access to fail. We've mitigated the effects
by better adjusting the queue management so that git clone/pull always
has priority and for now it's OK. But this also means that visiting the
gitweb pages can occasionally experience long delays (I've seen up to
more than 300 concurrent requests there, as if there were so many people
interested in suddenly reading some objects!). I don't want to go towards
more defensive measures for now, but if you're experiencing difficulties
to access some resource, just please let me know so that we can figure
better solutions.
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 (20):
BUG/MEDIUM: h3: do not overwrite interim with final response
BUG/MINOR: h3: properly realloc buffer after interim response encoding
BUG/MINOR: h3: ensure that invalid status code are not encoded (FE side)
MINOR: qmux: change API for snd_buf FIN transmission
BUG/MEDIUM: h3: handle interim response properly on FE side
BUG/MINOR: h3: properly handle interim response on BE side
MINOR: h3: remove unused outbuf in h3_resp_headers_send()
BUG/MINOR: hq-interop: fix FIN transmission
MINOR: h3: use smallbuf for request header emission
MINOR: h3: add traces to h3_req_headers_send()
BUG/MINOR: h3: fix uninitialized value in h3_req_headers_send()
BUG/MINOR mux-quic: apply correctly timeout on output pending data
BUG/MINOR: mux-quic: ensure close-spread-time is properly applied
MINOR: mux-quic: refactor timeout code
MINOR: mux-quic: correctly implement backend timeout
MINOR: mux-quic: disable glitch on backend side
MINOR: mux-quic: store session in QCS instance
MEDIUM: mux-quic: implement be connection reuse
MINOR: mux-quic: do not reuse connection if app already shut
MEDIUM: mux-quic: support backend private connection
Aurelien DARRAGON (6):
BUG/MINOR: logs: fix log-steps extra log origins selection
MINOR: log: explicitly ignore "log-steps" on backends
BUG/MEDIUM: logs: fix sess_build_logline_orig() recursion with options
MEDIUM: stats: avoid 1 indirection by storing the shared stats directly
in counters struct
CLEANUP: peers: remove unused peer_session_target()
OPTIM: stats: store fast sharded counters pointers at session and stream
level
Ben Kallus (2):
CLEANUP: compiler: prefer char * over void * for pointer arithmetic
CLEANUP: include: replace hand-rolled offsetof to avoid UB
Christopher Faulet (29):
BUG/MINOR: applet: Don't trigger BUG_ON if the tid is not on appctx init
BUG/MINOR: hlua: Skip headers when a receive is performed on an HTTP
applet
BUG/MEDIUM: applet: State inbuf is no longer full if input data are
skipped
BUG/MEDIUM: stconn: Fix conditions to know an applet can get data from
stream
BUG/MINOR: applet: Fix applet_getword() to not return one extra byte
BUG/MEDIUM: Remove sync sends from streams to applets
MINOR: applet: Add HTX versions for applet_input_data() and
applet_output_room()
MINOR: applet: Improve applet API to take care of inbuf/outbuf alloc
failures
MEDIUM: hlua: Update the tcp applet to use its own buffers
MINOR: hlua: Fill the request array on the first HTTP applet run
MINOR: hlua: Use the buffer instead of the HTTP message to get HTTP
headers
MEDIUM: hlua: Update the http applet to use its own buffers
BUG/MEDIUM: hlua: Report to SC when data were consumed on a lua socket
BUG/MEDIUM: hlua: Report to SC when output data are blocked on a lua
socket
MEDIUM: hlua: Update the socket applet to use its own buffers
BUG/MEDIUM: dns: Reset reconnect tempo when connection is finally
established
MEDIUM: dns: Update the dns_session applet to use its own buffers
CLEANUP: http-client: Remove useless indentation when sending request body
MINOR: http-client: Try to send request body with headers if possible
MINOR: http-client: Trigger an error if first response block isn't a
start-line
BUG/MINOR: httpclient-cli: Don't try to dump raw headers in HTX mode
MINOR: httpclient-cli: Reset httpclient HTX buffer instead of removing
blocks
MEDIUM: http-client: Update the http-client applet to use its own buffers
MEDIUM: log: Update the log applet to use its own buffers
MEDIUM: sink: Update the sink applets to use their own buffers
MEDIUM: peers: Update the peer applet to use its own buffers
MEDIUM: promex: Update the promex applet to use their own buffers
MINOR: applet: Add support for flags on applets with a flag about the new
API
MEDIUM: applet: Emit a warning when a legacy applet is spawned
Frederic Lecaille (4):
BUG/MINOR: quic: Wrong source address use on FreeBSD
MINOR: quic: Get rid of qc_is_listener()
BUG/MEDIUM: quic-be: CC buffer released from wrong pool
MINOR: quic: Remove pool_head_quic_be_cc_buf pool
Ilia Shipitsin (1):
CLEANUP: acme: fix wrong spelling of "resources"
Olivier Houchard (1):
BUG/MEDIUM: threads: Disable the workaround to load libgcc_s on macOS
Remi Tricot-Le Breton (6):
MINOR: ssl: Add ciphers in ssl traces
MINOR: ssl: Add curve id to curve name table and mapping functions
MINOR: ssl: Add curves in ssl traces
MINOR: ssl: Dump ciphers and sigalgs details in trace with 'advanced'
verbosity
MINOR: ssl: Remove ClientHello specific traces if
!HAVE_SSL_CLIENT_HELLO_CB
CLEANUP: ssl: Use only NIDs in curve name to id table
Valentine Krasnobaeva (6):
BUG/MINOR: halog: exit with error when some output filters are set
simultaneosly
MINOR: cpu-topo: split cpu_dump_topology() to show its summary in show dev
MINOR: cpu-topo: write thread-cpu bindings into trash buffer
MINOR: debug: align output style of debug_parse_cli_show_dev with
cpu_dump_topology
MINOR: debug: add thread-cpu bindings info in 'show dev' output
BUILD: debug: add missed guard USE_CPU_AFFINITY to show cpu bindings
William Lallemand (4):
BUG/MEDIUM: acme: use POST-as-GET instead of GET for resources
MINOR: acme: remove acme_req_auth() and use acme_post_as_get() instead
BUG/MINOR: acme: allow "processing" in challenge requests
MINOR: acme: add ACME to the haproxy -vv feature list
Willy Tarreau (19):
CLEANUP: server: do not check for duplicates anymore in findserver()
REORG: server: move findserver() from proxy.c to server.c
MINOR: server: use the tree to look up the server name in findserver()
CLEANUP: server: rename server_find_by_name() to server_find()
CLEANUP: server: rename findserver() to server_find_by_name()
CLEANUP: server: use server_find_by_name() where relevant
CLEANUP: cfgparse: lookup proxy ID using existing functions
CLEANUP: stream: lookup server ID using standard functions
CLEANUP: server: simplify server_find_by_id()
CLEANUP: server: add server_find_by_addr()
CLEANUP: stream: use server_find_by_addr() in sticking_rule_find_target()
CLEANUP: server: be sure never to compare src against a non-existing
defsrv
MEDIUM: proxy: take the defsrv out of the struct proxy
MINOR: proxy: add checks for defsrv's validity
MEDIUM: proxy: no longer allocate the default-server entry by default
MEDIUM: proxy: register a post-section cleanup function
MINOR: debug: report haproxy and operating system info in panic dumps
DEV: gdb: add a memprofile decoder to the debug tools
DOC: connection: explain the rules for idle/safe/avail connections
---