Hi,
HAProxy 3.1-dev7 was released on 2024/09/05. It added 56 new commits
after version 3.1-dev6.
This version collects a non-negligible number of bug fixes (16) including
the important one affecting H2+zero-copy forwarding mentioned in the 3.0
and 2.9 announcements. The other bugs that were fixed concern frozen
connections, crashes, and an issue where rate counters could be bad and
remain bad for a while in case of time jumps.
Among the changes in this version, I'm seeing:
- support for applying a factor to byte rates in stick-tables. The issue
is that right now the rate values are stored on 32 bits and that this
limits measurable rates to about 34 Gbps. When this was added in 2010,
we wouldn't imagine that users would require more than this *per key*.
But now we're in 2024, the bwlim filter has become popular even on
large systems where high limits need to be set. It was figured that
the best way to address this specific (and admittedly rare) need is to
just apply a factor to the rate stored in the stick-table. This allows
the bwlim filter to be configured with lower values and reported rates
to still make sense. The "brates-factor" configured on the stick-table
supports a range of 1 to 1024. 1024 could imply counting kbytes per
second instead of bytes per second. 125 could be nice to count kbit/s
instead for example.
- the MPTCP support from Dorian, Anthony and Mathieu was finally merged.
MPTCP addresses can be explicitly specified using prefixes "mptcp@",
"mptcp4@", "mptcp6@". While writing this I'm realizing that I don't
know if we have an easy way to know if we're dealing with an MPTCP or a
regular TCP connection in order to feed stats. It could be interesting
to see in logs which connections were made using this and measure how
popular it is among clients. Hmmm maybe we can do that using one
listener each... More things to test :-)
- the init-state patch from Aaron was also merged. It finally allows
a server *not* to instantly turn on upon startup or when leaving
maintenance, but only after it succeeds its checks. There have been
requests for this for a very long time (issue 51!), and now 4 possible
behaviors can be configured per server. One use case I'm aware of is
when you set a server in maintenance to upgrade it, you usually don't
want it to instantly be reintegrated when marking it ready, instead
you usually prefer that it performs its checks. Now it will be
possible via the "init-state" server parameter.
- a few sample fetch functions (ssl_fc_supported_versions_bin and
ssl_fc_sigalgs_bin) were added to retrieve such information during
the SSL handshake that are otherwise not available later.
- the environment variables for CLF log formats were added
- the master process now restores its initial environment before
switching to wait mode. Indeed, previously it would re-exec itself
using the new variables parsed in the config. An example of problem
is if you do that in your config:
global
#setenv TRACE 1
.if defined(TRACE)
...
.endif
Then once you temporarily uncomment the "setenv", the TRACE variable
is set and passed to sub-processes, then if you comment the config
again it persists since it was inherited. This won't happen anymore
as we now keep a copy of the environment that is restored before the
execve(). Note that all such corner cases won't be an issue soon with
the ongoing change of the master/worker startup sequence anyway.
- support for "retry-on 429" was added.
- QUIC: the NEW_TOKEN frame support was added so as to always be able
to validate reachability of the client during 0-RTT. The problem was
reported by Michael Wedl, without this a client can change its address
between the connection establishment and a 0-RTT request, the last one
will be used and logged (as expected). The problem is that we don't
know if it's its real address and we need to validate it first. The
NEW_TOKEN allows to deliver an IP-based token to the client for use
later, and if the address changes, then we can use a regular RETRY
token. It was tested to be OK and now works fine even in the interop.
It was also backported to 3.0. Not sure how far it will go since it
relies on recent infrastructure updates.
The rest is extra debug info, cleanups and typo fixes, as well as CI
updates. I'm glad that we're finally merging long-standing changes that
have been discussed for several years.
If you're running any 3.1-dev, this one should be worth an update. It
contains essentially bug fixes (including the one against the risk of
crashing the H2 mux) and all other changes are really isolated, so except
by failing on a bugfix, the risk of regression from previous versions is
much lower than the risk to fix bugs.
Given that we now have some substance for another 3.0 and that Fred spent
a good time backporting and testing the QUIC stuff, I think we'll produce
3.0.5 next week (no promise as usual). 2.9 and 2.8 are almost ready for
another shot. 2.6 should not require too much work at first glance so it
should be within reach. 2.4 and 2.2 are older and will require more work
(if fixes are needed at all, which is not even granted).
We still have roughly 3 months before the release, that's fine but that's
not a lot. As a reminder, September is usually busy for a number of us
(meetings, conferences, even releases of enterprise stuff for some), so I
expect less regular progress in the coming weeks and less time for reviews
as well. This means that sensitive stuff really needs to be prioritized so
that we still have sufficient testing time (and that includes my ongoing
work on H2 rx window). We're having a pretty nice 3.1 for now, which seems
to be in a better shape than 3.0 when it was released, I would hate to
degrade it in the last weeks, so please all keep this in mind.
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 :
Aaron Kuehler (1):
MEDIUM: server: add init-state
Amaury Denoyelle (2):
MINOR: mux-quic: add buf_in_flight to QCC debug infos
MINOR: mux-quic: correct qcc_bufwnd_full() documentation
Aperence (4):
MINOR: tools: extend str2sa_range to add an alt parameter
MINOR: server: add a alt_proto field for server
MEDIUM: sock: use protocol when creating socket
MEDIUM: protocol: add MPTCP per address support
Christopher Faulet (10):
MINOR: proxy: Add support of 429-Too-Many-Requests in retry-on status
BUG/MEDIUM: mux-h2: Set ES flag when necessary on 0-copy data forwarding
BUG/MEDIUM: stream: Prevent mux upgrades if client connection is no
longer ready
BUG/MINIR: proxy: Match on 429 status when trying to perform a L7 retry
MEDIUM: stick-table: Add support of a factor for IN/OUT bytes rates
MEDIUM: bwlim: Use a read-lock on the sticky session to apply a shared
limit
BUG/MEDIUM: mux-pt: Never fully close the connection on shutdown
BUG/MEDIUM: cli: Always release back endpoint between two commands on the
mcli
BUG/MEDIUM: mux-h1: Properly handle empty message when an error is
triggered
BUG/MEDIUM: mux-pt: Fix condition to perform a shutdown for writes in
mux_pt_shut()
Frederic Lecaille (12):
BUILD: quic: 32bits build broken by wrong integer conversions for printf()
MINOR: tools: Implement ipaddrcpy().
MINOR: quic: Implement quic_tls_derive_token_secret().
MINOR: quic: Token for future connections implementation.
BUG/MINOR: quic: Missing incrementation in NEW_TOKEN frame builder
MINOR: quic: Modify NEW_TOKEN frame structure (qf_new_token struct)
MINOR: quic: Implement qc_ssl_eary_data_accepted().
MINOR: quic: Add trace for QUIC_EV_CONN_IO_CB event.
BUG/MEDIUM: quic: always validate sender address on 0-RTT
BUG/MINOR: quic: Crash from trace dumping SSL eary data status (AWS-LC)
BUG/MINOR: quic: unexploited retransmission cases for Initial pktns.
BUG/MINOR: Crash on O-RTT RX packet after dropping Initial pktns
Ilya Shipitsin (7):
DEV: coccinelle: add a test to detect unchecked malloc()
DEV: coccinelle: add a test to detect unchecked calloc()
CI: QUIC Interop AWS-LC: enable ngtcp2 client
CI: fix missing comma introduced in
956839c0f68a7722acc586ecd91ffefad2ccb303
CI: QUIC Interop: do not run bandwidth measurement tests
CI: QUIC Interop: use different artifact names for uploading logs
CLEANUP: assorted typo fixes in the code and comments
Nathan Wehrman (1):
MINOR: config: Created env variables for http and tcp clf formats
Nicolas CARPi (2):
CLEANUP: haproxy: fix typos in code comment
CLEANUP: mqtt: fix typo in MQTT_REMAINING_LENGHT_MAX_SIZE
Valentine Krasnobaeva (3):
MINOR: tools: add helpers to backup/clean/restore env
MINOR: mworker: restore initial env before wait mode
BUG/MINOR: haproxy: free init_env in deinit only if allocated
William Lallemand (6):
BUILD: tools: environ is not defined in OS X and BSD
CLEANUP: ssl: cleanup the clienthello capture
MEDIUM: ssl: capture the supported_versions extension from Client Hello
MEDIUM: ssl/sample: add ssl_fc_supported_versions_bin sample fetch
MEDIUM: ssl: capture the signature_algorithms extension from Client Hello
MEDIUM: ssl/sample: add ssl_fc_sigalgs_bin sample fetch
Willy Tarreau (8):
BUILD: quic: fix build errors on FreeBSD since recent GSO changes
MINOR: mux-h2: try to clear DEM_MROOM and MUX_MFULL at more places
BUG/MAJOR: mux-h2: always clear MUX_MFULL and DEM_MROOM when clearing the
mbuf
BUG/MINOR: mux-spop: always clear MUX_MFULL and DEM_MROOM when clearing
the mbuf
DEV: patchbot: count the number of backported/non-backported patches
DEV: patchbot: add direct links to show only specific categories
DEV: patchbot: detect commit IDs starting with 7 chars
BUG/MEDIUM: clock: also update the date offset on time jumps
---