Hi,
HAProxy 3.4-dev2 was released on 2026/01/07. It added 69 new commits
after version 3.4-dev1.
Yeah I know it's been almost a month, but the vacation period seems to
have affected activity more than usual, probably due to how it broke
the weeks. But that's not bad because it also seems to have offered some
users some calm periods to plan upgrades that could possibly not have
been easy otherwise, resulting in some bugs being reported. Thus it's
not surprising that this version contains a bunch of fixes, several of
which also concern 3.3. I think we'll emit another 3.3 soon to flush
what's pending.
The bug fixes are not very interesting to discuss and touch various
areas (HTTP forwarding, idle connections, connection retries).
For the rest, not that many areas were touched. I can cite these
points of interest:
- improvements on the CPU topology simplified management. A new
"cpu-affinity" keyword permits to decide how threads will be pinnned
to CPUs within a group: will they all share the same cores permitted
in the group, all the cores of the CCX when the group covers a whole
CCX, or just the CPU core they're attached to or the CPU thread they're
attached to. "cpu-policy" now has a new sub-option "threads-per-core 1"
allowing to start a single thread per CPU core, which can be quite
convenient to leave more room to the the network driver on each core,
or for a new process during reloads, and in this case it makes sense
to permit that single thread to bind to both CPU siblings of the same
core. In certain test scenarios we're seeing from no gain with half
the threads (which is already interesting) to 10-15% gain by playing
with these. There's also a new directive "max-threads-per-group" which
allows to create more, smaller thread groups on CPUs with large unified
L3 caches. For example on an Ampere Altra with 80 cores, setting the
limit to 8-16 also increases the performance by 10-15% by creating 5
or 10 groups which all deal with less contention. So I think that we
now have a reasonable toolset to ease portable configurations that are
expected to match a workload and easily adapt to the underlying
hardware.
- patterns (maps/acl): an issue remained with the commit phase after
a long upload of large maps or ACLs: the generation ID of the element
is stored with the element, and in order to avoid long delays, we purge
the old ones in small batches. But this used to force a scan of many
new elements to find the next old one to remove, and continued to use
a lot of CPU during that purge. The patterns have now be reorganized
with one tree/list head per generation, and the purge of older
generations on commit is as simple as doing small batches of removal
of the first element in the list (i.e. they're basically dequeued).
This results in a much faster and more determinist purge time which
should no longer trigger watchdog warnings as some users have already
encountered.
- the HTTP/1 mux now supports counting glitches. This is still very
basic but it can be sufficient to cleanly close highly misbehaving
connections. Also, regarding glitches, both h1 and h2 will now try a
graceful close when reaching 75% of the configured glitches limit so
as to be nice with "just bogus" agents.
- the "show proc" master CLI keyword used to be limited by the buffer
size to around 202 processes. While this situation is not supposed to
happen on regular usages, if it ever happens while debugging an incident,
it didn't help that the output was truncated. Now it properly iterates
after pausing on a full buffer and is no longer affected by such a limit.
- other interesting point: we discovered that due to a historical bug
that probably has always been there, automatic proxy ID numbering
starts at 2, so ID 1 is never automatically assigned. Instead of fixing
it and breaking numerous setups for no reason, this was simply
documented in the doc and code, and a regtest now verifies that we
don't later fix it by accident.
- some cleanups of proxy structs and management tasks that are needed
to prepare a long journey through dynamic backends.
- basic support for Lua 5.5 was added. At least it builds, I think there
have been some tests but I don't know to what extent at this point. I
noticed that we didn't add the automatic version search in the lib name
in the makefile, I don't know if distros still use this format. We'll
see.
- a new TCP sample fetch function "fc_saved_syn" permits to retrieve a
binary dump of the TCP SYN packet as recorded by the TCP stack on
modern Linux systems, provided that the bind option "tcp-ss" was set
to "1" (ip+tcp) or "2" (eth+ip+tcp). This gives us a nice set of info
that are useful to perform some MAC-based access control, or to try
to differentiate a good from a bad actor behind a NAT box. A small
number of converters (~20) were added to manipulate such packets and
extract various pieces (e.g. source IP, TCP window, MSS etc), and one
("ip.fp") even builds a "fingerprint" composed of mostly invariant
parts of the packet. I'm still experimenting with this at home, but I
think it can be valuable during DDoS attacks, in order to try to
preserve access to innocent users (think about CGNAT where multiple
users share the same IP address for example). At least now we have the
tools and we can experiment.
The rest is more cleanups, more regtests, and some CI updates.
On a completely different topic, we're now running off the secondary
server for web and git, so it seems to indicate that the replication
was overall OK for all these years, though we had to tweak it a little
bit to make it bidirectional so that pushing to either node works (this
will reduce the effort of getting back to nominal later). I'll start to
experiment with the mailing list migration today. I'll do my best to
avoid spamming everyone but you can expect a few "test please ignore"
messages depending on how my tests go. If some find that they don't
receive anything anymore in the next few days, please check your spambox
first, then ping me privately so that we can investigate further.
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 :
Alexander Stephan (4):
MINOR: mworker/cli: only keep positive PIDs in proc_list
CLEANUP: mworker: remove duplicate list.h include
BUG/MINOR: mworker/cli: fix show proc pagination using reload counter
MINOR: mworker/cli: extract worker "show proc" row printer
Amaury Denoyelle (4):
MEDIUM: cfgparse: acknowledge that proxy ID auto numbering starts at 2
MINOR: cfgparse: remove useless checks on no server in backend
OPTIM/MINOR: proxy: do not init proxy management task if unused
BUG/MINOR: quic: fix deprecated warning for window size keyword
Christopher Faulet (8):
BUG/MEDIUM: http-ana: Properly detect client abort when forwarding
response (v2)
BUG/MEDIUM: stconn: Don't report abort from SC if read0 was already
received
CLEANUP: backend: Remove useless test on server's xprt
CLEANUP: tcpcheck: Remove useless test on the xprt used for healthchecks
CLEANUP: ssl-sock: Remove useless tests on connection when resuming TLS
session
BUG/MEDIUM: peers: Properly handle shutdown when trying to get a line
BUG/MEDIUM: mux-h1: Take care to update <kop> value during zero-copy
forwarding
BUG/MEDIUM: stconn: Move data from <kip> to <kop> during zero-copy
forwarding
Frederic Lecaille (1):
REGTESTS: quic: fix a TLS stack usage
Ilia Shipitsin (1):
CLEANUP: assorted typo fixes in the code, commits and doc
Maxime Henrion (6):
MINOR: tools: add a secure implementation of memset
MINOR: patterns: preliminary changes for reorganization
MEDIUM: patterns: reorganize pattern reference elements
CLEANUP: patterns: remove dead code
OPTIM: patterns: cache the current generation
BUG/MAJOR: set the correct generation ID in pat_ref_append().
Mike Lothian (1):
MINOR: hlua: Add support for lua 5.5
Olivier Houchard (14):
BUG/MEDIUM: quic: Don't try to use hystart if not implemented
BUG/MEDIUM: backend: Do not remove CO_FL_SESS_IDLE in assign_server()
MINOR: cpu-topo: Turn the cpu policy configuration into a struct
MEDIUM: cpu-topo: Add a "threads-per-core" keyword to cpu-policy
MEDIUM: cpu-topo: Add a "cpu-affinity" option
MEDIUM: cpu-topo: Add a new "max-threads-per-group" global keyword
MEDIUM: cpu-topo: Add the "per-thread" cpu_affinity
MEDIUM: cpu-topo: Add the "per-ccx" cpu_affinity
BUG/MEDIUM: cpu-topo: Don't forget to reset visited_ccx.
MINOR: cpu-topo: Factorize code
MINOR: cpu-topo: Rename variables to better fit their usage
MINOR: threads: Avoid using a thread group mask when stopping.
MEDIUM: cpu-topo: Add an optional directive for per-group affinity
MINOR: receiver: Remove tgroup_mask from struct shard_info
William Lallemand (9):
BUG/MEDIUM: mworker/listener: ambiguous use of RX_F_INHERITED with shards
REGTESTS: list all skipped tests including 'feature cmd' ones
CI: github: remove openssl no-deprecated job
CI: github: add a job to test the master branch of OpenSSL
CI: github: openssl-master.yml misses actions/checkout
CI: github: use git prefix for openssl-master.yml
REGTESTS: fix error when no test are skipped
BUG/MINOR: cpu-topo: fix -Wlogical-not-parentheses build with clang
BUG/MEDIUM: mworker: can't use signals after a failed reload
Willy Tarreau (21):
BUG/MEDIUM: mux-h2: synchronize all conditions to create a new backend
stream
DOC: config: fix number of values for "cpu-affinity"
MINOR: mux-h2: add missing glitch count for non-decodable H2 headers
MINOR: mux-h2: perform a graceful close at 75% glitches threshold
MEDIUM: mux-h1: implement basic glitches support
MINOR: mux-h1: perform a graceful close at 75% glitches threshold
MINOR: tcp: add new bind option "tcp-ss" to instruct the kernel to save
the SYN
MINOR: protocol: support a generic way to call getsockopt() on a
connection
MINOR: tcp: implement the get_opt() function
MINOR: tcp_sample: implement the fc_saved_syn sample fetch function
BUG/MINOR: backend: fix the conn_retries check for TFO
BUG/MINOR: backend: inspect request not response buffer to check for TFO
MINOR: net_helper: add sample converters to decode ethernet frames
MINOR: net_helper: add sample converters to decode IP packet headers
MINOR: net_helper: add sample converters to decode TCP headers
MINOR: net_helper: add ip.fp() to build a simplified fingerprint of a SYN
MINOR: net_helper: prepare the ip.fp() converter to support more options
MINOR: net_helper: add an option to ip.fp() to append the TTL to the
fingerprint
MINOR: net_helper: add an option to ip.fp() to append the source address
DOC: config: fix the length attribute name for stick tables of type
binary / string
DOC: config: fix a few typos and refine cpu-affinity
---