Hi,
HAProxy 3.4-dev3 was released on 2026/01/22. It added 80 new commits
after version 3.4-dev2.
Things are starting to move a little bit faster as new features reach
completion and get merged. The usual ~20 bugs were fixed, with no real
criticity (mostly minor, a bit of medium). And the rest of the changes
are mostly split like this:
- the work to "remove" the limit on the number of thread groups is done.
I'm placing quotes because I think that the hard limit changed from
64 groups to 32768 (of up to 64 threads each). Of course such numbers
make no sense (I think I said this about 64 threads when we started
supporting threads...). But the point is to offer more flexibility
and a more dynamic resource allocation on large systems without
having again to rebuild with different settings, and to permit wider
ranges of thread limits per group (i.e. favor locality or bandwidth).
It should theoretically have no visible impact.
- some hash algorithms employed to encrypt passwords in userlists are
sometimes far too slow and not suited at all to web environments, but
it happens that some users, customers or developers are not aware and
will provide them in config snippets that significantly inflate config
parsing time (really) and can completely ruin runtime performance. We
now have a timing test during startup that will result in a warning
being emitted if a hash takes more than 10ms (which is an eternity),
hoping that the problem will be detected before reaching production.
- the work on dynamic backends continues. It is now possible to "publish"
or "unpublish" an existing backend from the CLI. This is the equivalent
for a backend of the maintenance mode for a server: use_backend rules
pointing to it will just be ignored, letting the next matching one be
evaluated. Backends marked "disabled" in the config will now stay and
experience the same fate. The "force-persist" rules are now permitted
in the frontend as well, to recognize a secret deployment key that can
be used to force the access to such backends for testing before opening
the service. This publish/unpublish step will be necessary later before
removing / after adding a backend. The status is reflected in the stats
page. And now, named defaults sections will persist even if not used
yet (that was the initial plan in order to permit dynamic backend
creation using them later).
- the default systemd unit file was improved to support a "conf.d"
directory with multiple files in it. It defaults to /etc/haproxy/conf.d
and will be mandatory on startup (if using this unit file). It will not
be necessary however to move configs there, as the current default file
continues to be used at the primary location. This should give a bit
more flexibility to distros who prefer to place the process-wide sections
in a central file (e.g. global, peers, traces, logs etc) while having
one application per file elsewhere.
- the -dKall command line option will now also list the "userlist" section.
- JWE tokens now benefit from two new converters, jwt_decrypt_cert() and
jwt_decrypt_secret(), which respectively work with asymmetric or
symmetric algorithms. This work also opened the opportunity to add two
new converters to encrypt/decrypt AES CBC: aes_cbc_enc(), aes_cbc_dec().
- a few sample fetch functions like fc.timer.handshake() and other fc_*
retrieved from tcp_info were extended to support being called in the
connection or session rulesets. It indeed made no sense to have to call
them for each stream regarding timings that will not change, so now
their values can be stored in session variables if needed.
- a new sample fetch function, dump_all_vars(), supports dumping all or
just a subset of known variables based on scopes and name prefixes.
This can be super convenient to pass timing info or trust level to an
application server via headers for example, in a single rule instead
of having as many rules as variables. It produces a string on output
with a configurable delimiter.
The rest is roughly a handful of new regtests, build script updates for
AWS-LC and QuicTLS, build fixes for old macOS versions, build fixes for
newer compilers on latest Fedora, and doc updates. The CI was updated to
temporarily work around build issues with OpenSSL 4 reported in the ECH
builds.
And that's about all! At this point none of these changes represent a
specific risk, so deployment for testing on properly instrumented production
is still considered safe and encouraged, in order to test new features and
report about them. I already said it last time, but we really need to make
a pause in bug handling to issue a bunch of new stable releases. Time is
scarce these days, but fixed bugs accumulate for 3.3 and 3.2 and I don't
like it when -dev is more solid than -stable (at least it should give all
of us a good reason for switching to -dev ;-)).
Oh, and let me share a pleasant observation that hadn't been seen in a
long time: in this release, over the last 2 weeks, we've had no less
than 4 new first-time contributors (Egor, Hyeonggeun, Simon and @akarl10).
Welcome to them, and let's hope the trend continues!
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.4/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.4/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 (17):
MINOR: cfgparse: remove duplicate "force-persist" in common kw list
BUG/MEDIUM: quic: fix ACK ECN frame parsing
BUG/MINOR: proxy: free persist_rules
MEDIUM: stream: refactor switching-rules processing
REGTESTS: add test on backend switching rules selection
MEDIUM: proxy: do not select a backend if disabled
MEDIUM: proxy: implement publish/unpublish backend CLI
MINOR: stats: report BE unpublished status
MINOR: cfgparse: adapt warnif_cond_conflicts() error output
MEDIUM: proxy: force traffic on unpublished/disabled backends
BUG/MEDIUM: mux-quic: prevent BUG_ON() on aborted uni stream close
BUG/MINOR: proxy: fix deinit crash on defaults with duplicate name
MINOR: proxy: remove proxy_preset_defaults()
MINOR: proxy: refactor defaults proxies API
MINOR: proxy: simplify defaults proxies list storage
MEDIUM: cfgparse: do not store unnamed defaults in name tree
MEDIUM: proxy: implement persistent named defaults
Aurelien DARRAGON (7):
BUG/MINOR: hlua_fcn: fix broken yield for Patref:add_bulk()
BUG/MINOR: hlua_fcn: ensure Patref:add_bulk() is given a table object
before using it
BUG/MINOR: http_act: fix deinit performed on uninitialized lf_expr in
release_http_map()
MINOR: cli: use srv_drop() when server was created using new_server()
BUG/MINOR: server: ensure server is detached from proxy list before being
freed
BUG/MEDIUM: promex: server iteration may rely on stale server
BUG/MEDIUM: log: parsing log-forward options may result in segfault
Christian Ruppert (1):
REGTESTS: ssl: Fix reg-tests curve check
Egor Shestakov (4):
BUG/MINOR: cfgparse: fix "default" prefix parsing
REORG/MINOR: cfgparse: eliminate code duplication by lshift_args()
DOC: fix typos in the documentation files
DOC: fix mismatched quotes typos around words in the documentation files
Hyeonggeun Oh (6):
MINOR: cfgparse: Refactor "userlist" parser to print it in -dKall
operation
REORG: cfgparse: move peers parsing to cfgparse-peers.c
MINOR: tools: add chunk_escape_string() helper function
MINOR: vars: store variable names for runtime access
MINOR: vars: implement dump_all_vars() sample fetch
DOC: vars: document dump_all_vars() sample fetch
Ilia Shipitsin (1):
CI: github: switch monthly Fedora Rawhide build to OpenSSL
Olivier Houchard (11):
MINOR: receiver: Dynamically alloc the "members" field of shard_info
MINOR: stats: Increase the tgid from 8bits to 16bits
BUG/MINOR: stats-file: Use a 16bits variable when loading tgid
MEDIUM: counters: Dynamically allocate per-thread group counters
MEDIUM: counters: Remove some extra tests
BUG/MEDIUM: threads: Fix binding thread on bind.
MEDIUM: counters: mostly revert da813ae4d7cb77137ed
MINOR: queues: Turn non_empty_tgids into a long array.
MINOR: threads: Eliminate all_tgroups_mask.
BUG/MEDIUM: queues: Fix arithmetic when feeling non_empty_tgids
MEDIUM: thread: Turn the group mask in thread set into a group counter
Remi Tricot-Le Breton (9):
MINOR: ssl: Factorize AES GCM data processing
MINOR: ssl: Add new aes_cbc_enc/_dec converters
REGTESTS: ssl: Add tests for new aes cbc converters
MINOR: jwe: Add new jwt_decrypt_secret converter
MINOR: jwe: Add new jwt_decrypt_cert converter
REGTESTS: jwe: Add jwt_decrypt_secret and jwt_decrypt_cert tests
DOC: jwe: Add doc for jwt_decrypt converters
MINOR: jwe: Some algorithms not supported by AWS-LC
REGTESTS: jwe: Fix tests of algorithms not supported by AWS-LC
Simon Ser (1):
DOC: proxy-protocol: Add SSL client certificate TLV
Tim Duesterhus (1):
CLEANUP: connection: Remove outdated note about CO_FL `0x00002000` being
unused
William Lallemand (15):
BUILD: ssl: strchr definition changed in C23
BUILD: tools: memchr definition changed in C23
BUG/MINOR: cfgparse: wrong section name upon error
BUG/MINOR: cli/stick-tables: argument to "show table" is optional
CI: github: remove ERR=1 temporarly from the ECH job
MEDIUM: systemd: implement directory loading
SCRIPTS: build-ssl: use QUICTLS_VERSION instead of QUICTLS=yes
CI: github: define the right quictls version in each jobs
CI: github: fix vtest.yml with "not quictls"
SCRIPTS: build-ssl: clone the quictls branch directly
SCRIPTS: build-ssl: fix quictls build for 1.1.1 versions
BUG/MEDIUM: ssl: fix error path on generate-certificates
BUG/MEDIUM: ssl: fix generate-certificates option when SNI greater than
64bytes
REGTESTS: ssl: fix generate-certificates w/ LibreSSL
SCRIPTS: build: enable symbols in AWS-LC builds
Willy Tarreau (6):
BUILD: sockpair: fix build issue on macOS related to variable-length
arrays
MEDIUM: config: warn if some userlist hashes are too slow
MINOR: sample: also support retrieving fc.timer.handshake without a stream
MINOR: tcp-sample: permit retrieving tcp_info from the connection/session
stage
BUG/MINOR: net_helper: fix IPv6 header length processing
BUG/MEDIUM: debug: only dump Lua state when panicking
akarl10 (1):
BUG/MINOR: ech/quic: enable ech configuration also for quic listeners
---