Hi,
HAProxy 2.9-dev6 was released on 2023/09/22. It added 51 new commits
after version 2.9-dev5.
It looks like this version was mostly focused on bug fixes all around the
code and debugging improvements. I think we'll soon have to work on a new
series of stable versions.
Among the noticeable bugs fixed are:
- a possible crash in H2 when processing a response containing a DATA
frame after an 1xx response (or more generally before final headers).
- fixes for subtle Lua API changes between 5.3 and 5.4 related to
yielding operations.
- some fixes for http reverse-connect regarding server name resolution
and incorrectly set default maxconn.
- a possible case where deleting a server from the CLI was possible if
the server didn't have any streams anymore but was being retried on
by one stream. I.e. that stream still had a reference to it and could
possibly end up on it again after the retry.
- make sure not to interrupt responses that are delivered before requests
when the server terminates with a reset. That's particularly visible in
H2 with gRPC.
- master-worker mode failed to work with thread-groups > 1 due to the CLI
not being pinned to group 1 only.
- a possible crash in fcgi with stderr records due to a zero-copy operation
that should not be allowed in this case.
- a possible crash in QUIC since the recent updates to release memory
earlier.
Some reliability and bug detection improvements were made to the pools:
- the size rounding to try to merge similar sized pools was done a bit
too early, and affected the visible size of the pool. The problem is
that for buffers it would usually result in slightly larger buffers
than requested. It's usually not a problem for most structs but for
buffers it can be annoying because certain sizes might not be as
optimal as desired. Also, this would also affect the location where
we place the canary at the end of the allocated area, that is used to
detect overflows. Because of this, sometimes a single-byte overflow
was not detected. This is no longer the case now, just writing one
extra byte past the allocated size will be detected.
- we figured that just performing an abort when a pool corruption was
detected was not very helpful, because this required non-trivial
interactive memory inspection to figure the cause, and either the
developers had to blindly dictate lots of complicated gdb commands
to a bug reporter, or they'd have to ask for the core, none of which
is great. Now instead, when a pool corruption is detected, haproxy
will provide as many information as possible about the detected issue,
the pool name(s), call places, and even some contents near the end
in case of an overflow, so that most of the time the developers don't
need to request anything from the reporter. We may further improve
this depending on how it goes, we'll see.
Finally the new stuff:
- the "bytes()" converter can now take its offset and length from
variables as well as constants. This will permit to extract contents
from more complex protocols (i.e. skip/parse TLV fields etc).
- Lua can now register actions for the http-after-response rule sets
- the IPv4/IPv6 address parsers used in the config and pattern matching
were unified so that the various forms are properly usable everywhere.
Previously, certain (obsolete) encodings of IPv4 in IPv6 were not
always converted to IPv4 when needed.
- the lock used to consistently update the log servers' index when
using the sampling mechanism caused some bottlenecks and could be
replaced with atomic ops, resulting in ~4x faster log production.
- a few new sample fetch functions "bytes_in" and "bytes_out" to match
their siblings in log-format tags.
- some build fixes for CentOS 8 and USE_QUIC_OPENSSL_COMPAT, some CI
updates (provide gdb backtrace when possible), a few doc udpates and
a regtest improvements.
On a side note, some might have noticed that OpenSSL now dropped support
for their last decent branch 1.1.1 after releasing 1.1.1w on 09-11,
ignoring the requests for extending it while they're trying to fix their
3.x mess. This means that aside LTS distros, users are now left with only
the 3.x versions that are a total disaster in terms of performance. There's
not a single week without new questions about what alternative to choose
depending on the use cases (frontend, backend, QUIC, threads, CPU
architecture, distro support etc). Thus I've started a Wiki page about
what I know of the current situation (i.e. neither authoritative nor
perfectly accurate) and that we'll update as progress is being made with
alternatives:
https://github.com/haproxy/wiki/wiki/SSL-Libraries-Support-Status
The goal is to save everyone precious time by exposing the currently known
limitations affecting the available alternatives. It may also help distros
identify acceptable mid-term solutions depending on how well they'll cover
other software as well (curl, nginx and apache are important SSL users as
well).
Feedback from testers and from the libs maintainers is obviously welcome,
because the situation with OpenSSL has gotten worse than in 2014 after
Heartbleed since now nobody knows where to go. So the earlier we know what
works well, the better!
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/2.9/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/2.9/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 (6):
BUG/MINOR: proto_reverse_connect: fix preconnect with startup name
resolution
MINOR: proto_reverse_connect: prevent transparent server for pre-connect
BUG/MINOR: proto_reverse_connect: set default maxconn
MINOR: proto_reverse_connect: refactor preconnect failure
MINOR: proto_reverse_connect: remove unneeded wakeup
MINOR: proto_reverse_connect: emit log for preconnect
Aurelien DARRAGON (8):
BUG/MEDIUM: hlua: don't pass stale nargs argument to lua_resume()
BUG/MINOR: hlua/init: coroutine may not resume itself
BUG/MINOR: server: add missing free for server->rdr_pfx
MEDIUM: tools/ip: v4tov6() and v6tov4() rework
MINOR: pattern/ip: offload ip conversion logic to helper functions
MINOR: pattern: fix pat_{parse,match}_ip() function comments
MINOR: pattern/ip: simplify pat_match_ip() function
BUG/MEDIUM: server/cli: don't delete a dynamic server that has streams
Cedric Paillet (1):
BUG/MINOR: promex: fix backend_agg_check_status
Christopher Faulet (4):
BUG/MEDIUM: mux-fcgi: Don't swap trash and dbuf when handling STDERR
records
BUG/MEDIUM: master/cli: Pin the master CLI on the first thread of the
group 1
BUG/MAJOR: mux-h2: Report a protocol error for any DATA frame before
headers
BUG/MEDIUM: http-ana: Try to handle response before handling server abort
Emeric Brun (1):
MINOR: quic: handle external extra CIDs generator.
Frédéric Lécaille (3):
BUG/MINOR: quic: fdtab array underflow access
BUG/MEDIUM: quic: quic_cc_conn ->cntrs counters unreachable
BUG/MINOR: quic: Leak of frames to send.
Ilya Shipitsin (1):
CI: cirrus-ci: display gdb bt if any
Lokesh Jindal (2):
MEDIUM: sample: Enhances converter "bytes" to take variable names as
arguments
MEDIUM: sample: Small fix in function check_operator for eror reporting
Sébastien Gross (1):
MINOR: hlua: Add support for the "http-after-res" action
William Lallemand (6):
MINOR: samples: implement bytes_in and bytes_out samples
DOC: configuration: add %[req.ver] sample to %HV
DOC: configuration: add %[query] to %HQ
BUILD: quic: fix build on centos 8 and USE_QUIC_OPENSSL_COMPAT
REGTESTS: ssl: skip OCSP test w/ WolfSSL
REGTESTS: ssl: skip generate-certificates test w/ wolfSSL
Willy Tarreau (18):
DEBUG: pools: always record the caller for uncached allocs as well
DEBUG: pools: pass the caller pointer to the check functions and macros
DEBUG: pools: make pool_check_pattern() take a pointer to the pool
DEBUG: pools: inspect pools on fatal error and dump information found
DEBUG: pools: also print the item's pointer when crashing
DEBUG: pools: also print the value of the tag when it doesn't match
DEBUG: pools: print the contents surrounding the expected tag location
MEDIUM: pools: refine pool size rounding
MAJOR: import: update mt_list to support exponential back-off
CLEANUP: pools: simplify the pool expression when no pool was matched in
dump
BUG/MINOR: freq_ctr: fix possible negative rate with the scaled API
Revert "MAJOR: import: update mt_list to support exponential back-off"
MINOR: logs: clarify the check of the log range
MINOR: log: remove the unused curr_idx in struct smp_log_range
CLEANUP: logs: rename a confusing local variable "curr_rg" to "smp_rg"
MINOR: logs: use a single index to store the current range and index
MEDIUM: logs: atomically check and update the log sample index
CLEANUP: ring: rename the ring lock "RING_LOCK" instead of "LOGSRV_LOCK"
---