Hi,
HAProxy 2.4.1 was released on 2021/06/17. It added 73 new commits
after version 2.4.0.
Overall, we've had a few very minor regressions in 2.4 for now. One of
them is the closure without error response when http-ignore-probes is
set and a bad request is received, and the few other ones were about a
few extra fields having disappeared from the H2 traces. The rest is just
regular bug fixes, though some of these are quite annoying and have been
present for a while:
- the "set maxconn server" command on the CLI could deadlock with
requests in the queue (the same locks can be taken a second time).
This has been the case since 1.8 and will have to be backported there.
- the old bug that got reported 2-3 times since 2.2 about loops in
process_stream() was finally caught. Under some circumstances a
connection could get receive hte error flag after it was being queued
and this theoretically impossible situation wasn't handled.
- there was a thin but possible race between free() and pool_alloc() in
the lockless variant since its introduction in 1.9. It was so thin and
so hard to trigger that I'm not sure anyone ever reported it. The fix
wasn't trivial but it allowed to remove a specificity of this code and
to make the lockless one not architecture-specific anymore. 2.5 has
already merged the implementations, and the conditions to use it could
be relaxed in a future 2.4.
- an HTX defragmentation bug recently appeared with HTTP compression,
in the rare case where compression inflates the buffer. This bug has
been there since 2.0 and we've got 2 or 3 similar reports in a week,
which is a bit surprising.
- an old bug affecting the dequeuing code was fixed. It has always been
there but got recently amplified in 2.3. The bug was that a flag was
not set on a request being picked out of the queue, so the request
had to pass again through load balancing after a server had picked it.
That used to only be a waste of CPU cycles, until a small optimization
in 2.3 resulted in avoiding to LB when there were already requests in
queue. This resulted in such requests remaining in the queue until
their timeout (or a restart).
- the SHCTX code that is used for the cache and the SSL sessions was
improperly locked when USE_PRIVATE_CACHE was enabled. It's extremely
rarely used, but if used it could crash.
In addition to these important fixes, a number of users have witnessed
watchdog panics when dealing with large DNS responses. The problem was
related to algorithmic complexity in the response processing and when
matching against certain server settings. A few more cross-references
were added here and there to address this issue and reduce the complexity
from O(n^3) to O(n) if I understood right.
The HTTP compression was having issues at the end of a response that could
occasionally be truncated or corrupted.
The Opentracing initialization would previously fail in a chroot, the
initialization sequence was slightly changed to address this. Note that
users will need to also update their Opentracing C wrapper to version
1.1.0, as the thread initialization was split between the two.
There were some fixes and cleanups for the dynamic servers (those added
and deleted at runtime from the CLI). A few settings were not properly
set, initialized, or tested.
And the rest is less visible but there are quite a few minor issues fixed,
I encourage you to have a look at the full change log at the end.
Please find the usual URLs below :
Site index : http://www.haproxy.org/
Discourse : http://discourse.haproxy.org/
Slack channel : https://slack.haproxy.org/
Issue tracker : https://github.com/haproxy/haproxy/issues
Wiki : https://github.com/haproxy/wiki/wiki
Sources : http://www.haproxy.org/download/2.4/src/
Git repository : http://git.haproxy.org/git/haproxy-2.4.git/
Git Web browsing : http://git.haproxy.org/?p=haproxy-2.4.git
Changelog : http://www.haproxy.org/download/2.4/src/CHANGELOG
Cyril's HTML doc : http://cbonte.github.io/haproxy-dconv/
Willy
---
Complete changelog :
Alex (1):
DOC: use the req.ssl_sni in examples
Alexandar Lazic (1):
DOC/MINOR: move uuid in the configuration to the right alphabetical order
Amaury Denoyelle (9):
BUG/MAJOR: server: prevent deadlock when using 'set maxconn server'
MINOR: errors: allow empty va_args for diag variadic macro
BUG/MINOR: stick-table: insert srv in used_name tree even with fixed id
BUG/MEDIUM: server: extend thread-isolate over much of CLI 'add server'
BUG/MEDIUM: server: clear dynamic srv on delete from proxy id/name trees
BUG/MEDIUM: server: do not forget to generate the dynamic servers ids
BUG/MINOR: server: do not keep an invalid dynamic server in px ids tree
BUG/MEDIUM: server: do not auto insert a dynamic server in px addr_node
BUG/MINOR: server: explicitly set "none" init-addr for dynamic servers
Christopher Faulet (16):
BUG/MEDIUM: filters: Exec pre/post analysers only one time per filter
BUG/MINOR: http-comp: Preserve HTTP_MSGF_COMPRESSIONG flag on the response
Revert "MEDIUM: http-ana: Deal with L7 retries in HTTP analysers"
BUG/MINOR: http-ana: Send the right error if max retries is reached on L7
retry
BUG/MINOR: http-ana: Handle L7 retries on refused early data before K/A
aborts
MINOR: http-ana: Perform L7 retries because of status codes in response
analyser
CLEANUP: http-ana: Remove useless if statement about L7 retries
BUG/MINOR: vars: Be sure to have a session to get checks variables
BUG/MAJOR: stream-int: Release SI endpoint on server side ASAP on retry
BUG/MEDIUM: compression: Fix loop skipping unused blocks to get the next
block
BUG/MEDIUM: compression: Properly get the next block to iterate on payload
BUG/MEDIUM: compression: Add a flag to know the filter is still
processing data
BUG/MAJOR: htx: Fix htx_defrag() when an HTX block is expanded
BUG/MINOR: mux-fcgi: Expose SERVER_SOFTWARE parameter by default
CLEANUP: l7-retries: do not test the buffer before calling b_alloc()
DOC: lua: Add a warning about buffers modification in HTTP
Emeric Brun (4):
BUG/MINOR: resolvers: answser item list was randomly purged or errors
MEDIUM: resolvers: add a ref on server to the used A/AAAA answer item
MEDIUM: resolvers: add a ref between servers and srv request or used SRV
record
BUG/MAJOR: resolvers: segfault using server template without SRV RECORDs
Mark Mullan (1):
DOC: intro: Fix typo in starter guide
Miroslav Zagorac (3):
BUILD/MINOR: opentracing: fixed build when using clang
Revert "BUG/MINOR: opentracing: initialization after establishing daemon
mode"
BUG/MEDIUM: opentracing: initialization before establishing daemon and/or
chroot mode
Remi Tricot-Le Breton (15):
BUG/MEDIUM: ebtree: Invalid read when looking for dup entry
BUG/MINOR: server: Missing calloc return value check in srv_parse_source
BUG/MINOR: peers: Missing calloc return value check in
peers_register_table
BUG/MINOR: ssl: Missing calloc return value check in
ssl_init_single_engine
BUG/MINOR: http: Missing calloc return value check in
parse_http_req_capture
BUG/MINOR: proxy: Missing calloc return value check in proxy_parse_declare
BUG/MINOR: proxy: Missing calloc return value check in proxy_defproxy_cpy
BUG/MINOR: http: Missing calloc return value check while parsing
tcp-request/tcp-response
BUG/MINOR: http: Missing calloc return value check while parsing
tcp-request rule
BUG/MINOR: compression: Missing calloc return value check in
comp_append_type/algo
BUG/MINOR: worker: Missing calloc return value check in
mworker_env_to_proc_list
BUG/MINOR: http: Missing calloc return value check while parsing redirect
rule
BUG/MINOR: http: Missing calloc return value check in make_arg_list
BUG/MINOR: proxy: Missing calloc return value check in
chash_init_server_tree
BUG/MINOR: ssl: OCSP stapling does not work if expire too far in the
future
Tim Duesterhus (1):
MINOR: cfgparse: Fail when encountering extra arguments in macro
William Lallemand (1):
BUILD: make tune.ssl.keylog available again
Willy Tarreau (21):
BUG/MINOR: pools: fix a possible memory leak in the lockless pool_flush()
BUG/MINOR: pools: make DEBUG_UAF always write to the to-be-freed location
MINOR: pools: do not maintain the lock during pool_flush()
MINOR: pools: call malloc_trim() under thread isolation
MEDIUM: pools: use a single pool_gc() function for locked and lockless
BUG/MAJOR: pools: fix possible race with free() in the lockless variant
CLEANUP: pools: remove now unused seq and pool_free_list
BUG/MEDIUM: shctx: use at least thread-based locking on USE_PRIVATE_CACHE
BUG/MINOR: ssl: use atomic ops to update global shctx stats
BUG/MINOR: mworker: fix typo in chroot error message
CLEANUP: global: remove unused definition of stopping_task[]
BUG/MAJOR: queue: set SF_ASSIGNED when setting strm->target on dequeue
MINOR: backend: only skip LB when there are actual connections
BUG/MINOR: mux-h1: do not skip the error response on bad requests
MINOR: connection: add helper conn_append_debug_info()
MINOR: mux-h2/trace: report a few connection-level info during h2_init()
CLEANUP: mux-h2/traces: better align user messages
BUG/MINOR: stats: make "show stat typed desc" work again
MINOR: mux-h2: obey http-ignore-probes during the preface
BUG/MINOR: mux-h2/traces: bring back the lost "rcvd H2 REQ" trace
BUG/MINOR: mux-h2/traces: bring back the lost "sent H2 REQ/RES" traces
---