Hi,
HAProxy 2.9-dev2 was released on 2023/07/21. It added 91 new commits
after version 2.9-dev1. This remains pretty calm for 3 weeks, because
everyone seems to be busy making progress on complex stuff thanks to
2.8 appearing to be pretty good for now.
There are now a number of low-importance fixes in queue (deadlock on
listeners, a few issues with QUIC, etc). To give an idea of the extent
of fixes for now, one of them removes an unneeded '\n' in some error
essages... We've seen more dramatic changes :-)
Now regarding the new stuff:
- small rework of the sample expression parser to unify the converter
and sample-fetch parser in order to remove some code duplication. As
usual, no regression expected but please report any you'd notice. A
second more sensitive change concerns the introduction of a sample
type "same" that is not exposed but only used in declarations. This
solves a problem with a few converters such as "debug()" that return
the same type as the input but could only be declared with output type
"any", which prevents parsing error from being detected if an
incompatible converter is placed last. At this point only the "debug"
converter was changed. Again, no visible change is expected unless the
config is already broken. Finally, to conclude the sample conversion,
sample fetch functions that used to return both IPv4 and IPv6 such as
"src" etc now return a type "addr". The rationale behind this is that
we used to cheat by declaring them as returning only one type and
letting the converters cast on the fly. The "addr" type was only used
to resolve the chain of casts in the expression. Now these ones can
just return a type addr and the converter behind automatically handles
it. Same, theoretically there should be no visible effect.
- A new pair of SSL sample fetch functions were added: ssl_fc_curve and
ssl_bc_curve. These ones are only available with OpenSSL 3.0 and above,
and they are used to return the name of the curve used during the key
exchange.
- In Lua, it's now possible to read "proc" variables from the core API,
it was found to be convenient for various things such as global
thresholds or dynamic modes that can be adjusted on the fly using the
CLI. Also the Lua-based mailers now handle the "timeout mail" directive
from the mailers section.
- several QUIC fixes, updates and traces, as usual.
- SSL: after the discussion about whether or not to integrate the QUIC
compatibility layer to allow QUIC to be tested on top of OpenSSL, it
appeared that both here on this list and on the QUIC workgroup, the
general sentiment was rather against having this for basically 3
reasons that align with my initial concerns:
- would make users imagine that what they're testing is really
QUIC while it can be of lower quality
- would make the stubborn openssl team win the QUIC battle,
confirming they were right to piss off the whole world
- better aim the resources on supporting alternate libs
I generally agree with the first two. I don't agree with the 3rd
one because that's already what we've been doing for quite a while
and are still continuing, but despite our past and ongoing efforts
and commitments on this, it only very slowly improves the situation
and doesn't solely depend on us, but also library implementers, their
available resources, the ability for distros to adopt new components,
etc. We haven't reduce our efforts on this, we do sincerely hope that
LTS distros shipping next year will support wolfSSL out of the box,
and maybe AWS-LC, who knows so we expect to have more choice. But
this doesn't solve the issue users are facing right now. And I've
received quite a few comments over the last year from people saying
"do you imagine we can build quictls in field?". Of course I know
it's not possible at plenty of places. I also understand that such
people are not actively looking for QUIC deployments right now, but
rather to validate the compability with their infrastructure and
start to run tests. Some are worried that fragmentation may happen
over VPN (we can say "don't worry" but they'll believe it when seeing
it). Others about their firewall's timeouts impacts on bidirectional
UDP streams, etc. Finally, the QUIC maintainers themselves would
welcome bug reports caused by whatever bug may be left. So this tends
to indicate that there is a demand for having something very close to
QUIC with much less deployment trouble, and without fooling the users
into thinking that it's a real QUIC. For now we've thought that
enabling this mechanism only at build time via USE_QUIC_OPENSSL_COMPAT=1
and in the config as well with a directive "limited-quic" in the global
section could be reasonable fit. Maybe we could rename the option to
make it sound even more limited (we thought about "reduced", "degraded",
"unsafe", "unsupported" etc, it's hard to find a name). The idea here
is to convey the idea that if you don't like it it's rather because
of the limited support than the protocol itself, while allowing users
to start to discover it.
I don't know how this will evolve for 2.9, maybe it will be refined,
reworked, reverted or improved, I don't know. Also, the NGINX team
said they're currently working on trying to get 0-RTT to work, so
the long-term question becomes even more justified.
Last point, in case they'd be any doubt about the intent to find an
alternate SSL library, let me remind everyone that OpenSSL 3.x's
disastrous performance is a much bigger problem than its lack of QUIC
support, and that it's not just a QUIC patchset that will fix it, so
the work on an alternative is not going to fade away.
And that's roughly all for this version.
I'm aware of some progress being made on various topics at the moment,
hopefully we'll get some of them in dev3 or dev4:
- a number of log-format tags are receiving an equivalent sample-fetch
so that it will finally be possible to exploit such metrics differently
if needed. Many are still missing, that's a long task due to some
specific formats.
- the mux-to-mux forwarding that takes care of congestion window to
avoid filling buffers with blocked data is progressing.
- the mechanism to automatically bind threads and create thread-groups
based on CPU topology is making progress as well, hopefully by next
-dev we'll be able to see optimal binding on multi-socket machines,
segmented caches and hybrid CPUs.
- the patch series to reduce the locking contention on stick-tables
should be merged soon
- some work was finally started to reduce the locking cost in the
shctx blocks used by the cache.
I don't have the rest in mind at the moment.
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 :
Aurelien DARRAGON (27):
BUG/MINOR: tcp_sample: bc_{dst,src} return IP not INT
MEDIUM: acl/sample: unify sample conv parsing in a single function
MINOR: sample: introduce c_pseudo() conv function
MEDIUM: sample: add missing ADDR=>? compatibility matrix entries
MINOR: sample: fix ipmask sample definition
MEDIUM: tree-wide: fetches that may return IPV4+IPV6 now return ADDR
MEDIUM: sample: introduce 'same' output type
BUG/MEDIUM: sink: invalid server list in sink_new_from_logsrv()
BUG/MINOR: http_ext: unhandled ERR_ABORT in proxy_http_parse_7239()
BUG/MINOR: sink: missing sft free in sink_deinit()
BUG/MINOR: ring: size warning incorrectly reported as fatal error
BUG/MINOR: ring: maxlen warning reported as alert
BUG/MINOR: log: LF upsets maxlen for UDP targets
MINOR: sink/api: pass explicit maxlen parameter to sink_write()
BUG/MEDIUM: log: improper use of logsrv->maxlen for buffer targets
BUG/MINOR: log: fix missing name error message in cfg_parse_log_forward()
BUG/MINOR: log: fix multiple error paths in cfg_parse_log_forward()
BUG/MINOR: log: free errmsg on error in cfg_parse_log_forward()
BUG/MINOR: sink: invalid sft free in sink_deinit()
BUG/MINOR: sink: fix errors handling in cfg_post_parse_ring()
BUG/MINOR: server: set rid default value in new_server()
MINOR: hlua_fcn/mailers: handle timeout mail from mailers section
BUG/MINOR: sink/log: properly deinit srv in sink_new_from_logsrv()
EXAMPLES: maintain haproxy 2.8 retrocompatibility for lua mailers script
BUG/MINOR: hlua_fcn/queue: use atomic load to fetch queue size
BUG/MINOR: hlua: hlua_yieldk ctx argument should support pointers
BUG/MEDIUM: hlua_fcn/queue: bad pop_wait sequencing
Christopher Faulet (6):
DOC: config: Fix fc_src description to state the source address is
returned
BUG/MINOR: sample: Fix wrong overflow detection in add/sub conveters
BUG/MINOR: http: Return the right reason for 302
BUG/MINOR: h1-htx: Return the right reason for 302 FCGI responses
BUG/MINOR: server: Don't warn on server resolution failure with init-addr
none
BUG/MEDIUM: listener: Acquire proxy's lock in relax_listener() if
necessary
Daan van Gorkum (1):
MINOR: lua: Allow reading "proc." scoped vars from LUA core.
Emeric Brun (6):
BUG/MEDIUM: quic: token IV was not computed using a strong secret
BUG/MINOR: quic: retry token remove one useless intermediate expand
BUG/MEDIUM: quic: missing check of dcid for init pkt including a token
BUG/MEDIUM: quic: timestamp shared in token was using internal time clock
CLEANUP: quic: remove useless parameter 'key' from quic_packet_encrypt
BUILD: quic: fix warning during compilation using gcc-6.5
Frédéric Lécaille (33):
BUG/MINOR: quic: Possible leak when allocating an encryption level
BUG/MINOR: quic: Missing QUIC connection path member initialization
BUILD: quic: Compilation fixes for some gcc warnings with -O1
BUG/MINOR: quic: Possible crash in "show quic" dumping packet number
spaces
BUG/MINOR: quic: Unckecked encryption levels availability
MINOR: quic: Stop storing the TX encoded transport parameters
MINOR: quic: Dynamic allocation for negotiated Initial TLS cipher context.
MINOR: quic: Release asap the negotiated Initial TLS context.
MINOR: quic: Add traces to qc_may_build_pkt()
MEDIUM: quic: Packet building rework.
CLEANUP: quic: Remove a useless TLS related variable from
quic_conn_io_cb().
MEDIUM: quic: Handshake I/O handler rework.
MINOR: quic: Add traces for qc_frm_free()
MINOR: quic: add trace about pktns packet/frames releasing
BUG/MINOR: quic: Missing parentheses around PTO probe variable.
MINOR: quic: Ping from Initial pktns before reaching anti-amplification
limit
MINOR: quic: QUIC openssl wrapper implementation
MINOR: quic: Include QUIC opensssl wrapper header from TLS stacks
compatibility header
MINOR: quic: Do not enable O-RTT with USE_QUIC_OPENSSL_COMPAT
MINOR: quic: Set the QUIC connection as extra data before calling
SSL_set_quic_method()
MINOR: quic: Do not enable 0RTT with SSL_set_quic_early_data_enabled()
MINOR: quic: Add a compilation option for the QUIC OpenSSL wrapper
MINOR: quic: Export some KDF functions (QUIC-TLS)
MINOR: quic: Make ->set_encryption_secrets() be callable two times
MINOR: quic: Initialize TLS contexts for QUIC openssl wrapper
MINOR: quic: Call the keylog callback for QUIC openssl wrapper from
SSL_CTX_keylog()
MINOR: quic: Add a quic_openssl_compat struct to quic_conn struct
MINOR: quic: Useless call to SSL_CTX_set_quic_method()
MINOR: quic: SSL context initialization with QUIC OpenSSL wrapper.
MINOR: quic: Missing encoded transport parameters for QUIC OpenSSL wrapper
MINOR: quic: Add "limited-quic" new tuning setting
DOC: quic: Add "limited-quic" new tuning setting
DOC: install: Document how to build a limited support for QUIC
Ilya Shipitsin (2):
CI: add naming convention documentation
CI: explicitely highlight VTest result section if there's something
Marcos de Oliveira (2):
BUG/MINOR: server-state: Ignore empty files
BUG/MINOR: server-state: Avoid warning on 'file not found'
Mariam John (1):
MEDIUM: ssl: new sample fetch method to get curve name
Patrick Hemmer (1):
MINOR: peers: add peers keyword registration
Remi Tricot-Le Breton (3):
DOC: ssl: Fix typo in 'ocsp-update' option
DOC: ssl: Add ocsp-update troubleshooting clues and emphasize on crt-list
only aspect
BUG/MINOR: cache: A 'max-age=0' cache-control directive can be overriden
by a s-maxage
Thierry Fournier (2):
BUG/MINOR: config: Remove final '\n' in error messages
BUG/MINOR: config: Lenient port configuration parsing
Willy Tarreau (6):
MINOR: cpuset: add cpu_map_configured() to know if a cpu-map was found
BUG/MINOR: config: do not detect NUMA topology when cpu-map is configured
BUG/MINOR: cpuset: remove the bogus "proc" from the cpu_map struct
BUG/MINOR: init: set process' affinity even in foreground
CLEANUP: cpuset: remove the unused proc_t1 field in cpu_map
CLEANUP: config: make parse_cpu_set() return documented values
firexinghe (1):
BUG/MINOR: hlua: add check for lua_newstate
---