Hi,
HAProxy 2.6.3 was released on 2022/08/19. It added 60 new commits
after version 2.6.2.
This release contains assorted fixes for issues discovered after the
previous 2.6.2 release, and there are quite a few annoying ones so I
preferred not to let them rot too long:
- there was an issue with the log-forward section, where a missing
initialization due to code duplication caused some settings from
"bind" lines to be ignored (ssl, thread, a few such things).
- the late cleanup of the CLI keyword processing in 2.6 caused some
breakage when certain commands are chained using a semi-colon, due
to a command context that was not reset between commands and could
then be misused. For example "show version; show sess" could crash
the process.
- some ugly crashes saying "offset > buf->data" were reported when
using the DNS (e.g. issue #1781) , and it was found that it was using
uninitialized fields in a structure. A pool_zalloc() was used to paper
over it, since it's not even impossible that others fields are affected
and that this part requires a deep breath before being dived into.
- there was a logic but in processing of option http-restrict-req-hdr-names
that could cause deletion of a wrong header or a crash when facing
multiple forbidden chars. This was reported in issue #1822, analysed
and fixed by Mateusz Malek.
- an old bug in the H2 mux may cause spurious stream resets when uploading
and downloading at the same time from the same stream, due to the window
update frames having to be delayed when the output is full, and sent
later after the stream ID was reset. Those using POST to servers might
have experienced such occasional issues and might want to check for any
improvement there. This was reported in issue #1830 and diagnosed by
David le Blanc.
- during atomic map updates of entries based on prefix length ("_ip" and
"_beg"), if a new finer entry was added and matched an input before being
committed, it was naturally ignored, but the lookup would continue with
next keys without rechecking the key, possibly returning an incorrect
match. This was reported by Miroslav in issue #1802.
- Tim reported in issue #1799 that upon reload, and old process that failed
to synchronize its tables with the new one could loop for a while without
any pause and waste a lot of CPU doing this.
- the recently added assertion in fd_delete() already spotted a long
existing bug on reload, where the FD that was used by the pipe of an
exiting thread could be instantly reused as a socket by another thread
and be incorrectly inserted in the table. Most of the time it remained
unnoticed as these were mostly health checks on a reloading process, but
since the assertion a few users started to see logs of a crash of the
exiting process. This was reported both by Christian Ruppert in issue
#1807 and by Cedric Paillet.
- there was an undesired sharing of data between default-servers that
could lead to double-frees concretized by crashes when checking the
config. This was reported in issue #1804 by Fabiano Nunes.
- when a server had numerous requests waiting in queue, it was possible
for a thread to spend its time picking requests from this queue while
all other threads were working at refilling it, and the time spent
doing this was unbounded, which could 1) add high processing latencies,
and 2) even trigger the watchdog if the thread worked too long. I could
trigger the watchdog a few times on a 48-thread machine. I think it's
the same issue that was reported 2 years ago by Jaroslaw Rzeszotko in
issue #880.
- the ring section's "size" parser was too lax and would take "1M" for "1"
without even issuing a warning... Also error messages regarding incorrect
values would copy the input string instead of the parsed value, providing
no way to diagnose.
- there was a problem with the ring forwarding that's not very clear to me
(I have no idea about the impact, commit 96417f3 in master).
- I managed to trigger an error on reload where the old process died saying
"t->tid >= 0 && t->tid != tid". This is caused by the deinit code that
needs to stop stuff initialized on other threads, and as such it violates
some consistency checks. The check was relaxed to ignore the stopping
condition.
- reading from the rings could also occasionally freeze at high rate if
the reader had to stop due to a buffer full while the writer had already
stopped due to a ring full.
- Tim reported in issue #1803 that sometimes a new process would fail to
get the sockets from the old one on reload, due to a flag that was not
correctly updated before switching to wait mode.
- the function used to send FDs to the new process was using a wrong error
code on failure, leading to the failure not being detected.
- and a usual lot of QUIC fixes and updates, but more on that below.
A few build issues were addressed (essentially warnings with older compilers).
Two new converters were backported, table_expire() and table_idle() which
look up a key in a table and respectively report how long is left before the
entry expires and how long the entry was left untouched. They're trivial,
harmless and we've faced they were missing quite a few times already in
environments that want to emit a retry-after for example (issue #1535 opened
6 months ago already).
Regarding QUIC, there are roughly 25 fixes in this version, and we have
prepared the 80 missing ones to match the state of 2.7-dev that's getting
good according to our kind testers (mainly Tristan). I didn't want to add
them into this release, but they will be merged into 2.6.4 so that those
who want to use it have something more reliable that doesn't risk to take
their process down too fast. Thus if you're impatient about QUIC, better
jump to 2.7-dev or wait for 2.6.4.
Thanks to all participants, these were two quite busy weeks but it was
worth it!
Please find the usual URLs below :
Site index : http://www.haproxy.org/
Documentation : http://docs.haproxy.org/
Wiki : https://github.com/haproxy/wiki/wiki
Discourse : http://discourse.haproxy.org/
Slack channel : https://slack.haproxy.org/
Issue tracker : https://github.com/haproxy/haproxy/issues
Sources : http://www.haproxy.org/download/2.6/src/
Git repository : http://git.haproxy.org/git/haproxy-2.6.git/
Git Web browsing : http://git.haproxy.org/?p=haproxy-2.6.git
Changelog : http://www.haproxy.org/download/2.6/src/CHANGELOG
Pending bugs : http://www.haproxy.org/l/pending-bugs
Reviewed bugs : http://www.haproxy.org/l/reviewed-bugs
Code reports : http://www.haproxy.org/l/code-reports
Latest builds : http://www.haproxy.org/l/dev-packages
Willy
---
Complete changelog :
Amaury Denoyelle (6):
BUG/MEDIUM: mux-quic: fix missing EOI flag to prevent streams leaks
BUG/MINOR: mux-quic: prevent crash if conn released during IO callback
CLEANUP: mux-quic: remove useless app_ops is_active callback
BUG/MINOR: mux-quic: do not free conn if attached streams
MINOR: quic: explicitely ignore sendto error
CLEANUP: mux-quic: remove loop on sending frames
Christopher Faulet (11):
Revert "BUG/MINOR: peers: set the proxy's name to the peers section name"
MINOR: peers: Use a dedicated reconnect timeout when stopping the local
peer
BUG/MEDIUM: peers: limit reconnect attempts of the old process on reload
BUG/MINOR: peers: Use right channel flag to consider the peer as connected
BUG/MEDIUM: dns: Properly initialize new DNS session
BUG/MINOR: backend: Don't increment conn_retries counter too early
MINOR: server: Constify source server to copy its settings
REORG: server: Export srv_settings_cpy() function
BUG/MEDIUM: proxy: Perform a custom copy for default server settings
MINOR: peers: Add a warning about incompatible SSL config for the local
peer
BUG/MEDIUM: sink: Set the sink ref for forwarders created during ring
parsing
Emeric Brun (2):
BUG/MAJOR: log-forward: Fix log-forward proxies not fully initialized
BUG/MAJOR: log-forward: Fix ssl layer not initialized on bind even if
configured
Frédéric Lécaille (17):
MINOR: quic: Congestion control architecture refactoring
MEDIUM: quic: Cubic congestion control algorithm implementation
MINOR: quic: New "quic-cc-algo" bind keyword
BUG/MINOR: quic: loss time limit variable computed but not used
MINOR: quic: Stop looking for packet loss asap
BUG/MAJOR: quic: Useless resource intensive loop qc_ackrng_pkts()
MINOR: quic: Send packets as much as possible from qc_send_app_pkts()
BUG/MINOR: quic: Missing in flight ack eliciting packet counter decrement
BUG/MEDIUM: quic: Floating point exception in cubic_root()
BUG/MINOR: quic: Avoid sending truncated datagrams
BUG/MINOR: quic: Missing Initial packet dropping case
BUG/MEDIUM: quic: Wrong packet length check in qc_do_rm_hp()
MINOR: quic: Too much useless traces in qc_build_frms()
BUG/MEDIUM: quic: Missing AEAD TAG check after removing header protection
BUG/MINOR: quic: Possible infinite loop in
quic_build_post_handshake_frames()
BUG/MINOR: quic: memleak on wrong datagram receipt
MINOR: stick-table: Add table_expire() and table_idle() new converters
Ilya Shipitsin (1):
CLEANUP: assorted typo fixes in the code and comments
Mateusz Malek (1):
BUG/MEDIUM: http-ana: fix crash or wrong header deletion by
http-restrict-req-hdr-names
William Lallemand (4):
BUG/MINOR: sockpair: wrong return value for fd_send_uxst()
DEBUG: fd: split the fd check
MEDIUM: resolvers: continue startup if network is unavailable
BUG/MINOR: mworker: PROC_O_LEAVING used but not updated
Willy Tarreau (18):
BUG/MEDIUM: queue/threads: limit the number of entries dequeued at once
MINOR: ebtree: add ebmb_lookup_shorter() to pursue lookups
BUG/MEDIUM: pattern: only visit equivalent nodes when skipping versions
BUILD: http: silence an uninitialized warning affecting gcc-5
BUG/MINOR: ring/cli: fix a race condition between the writer and the
reader
BUG/MINOR: sink: fix a race condition between the writer and the reader
BUG/MINOR: quic: do not reject datagrams matching minimum permitted size
BUG/MEDIUM: quic: break out of the loop in quic_lstnr_dghdlr
BUILD: cfgparse: always defined _GNU_SOURCE for sched.h and crypt.h
BUG/MEDIUM: quic: always remove the connection from the accept list on
close
BUG/MEDIUM: poller: use fd_delete() to release the poller pipes
BUG/MEDIUM: task: relax one thread consistency check in task_unlink_wq()
BUILD: stconn: fix build warning at -O3 about possible null sc
BUILD: debug: silence warning on gcc-5
BUG/MEDIUM: ring: fix too lax 'size' parser
MINOR: applet: add a function to reset the svcctx of an applet
BUG/MEDIUM: cli: always reset the service context between commands
BUG/MEDIUM: mux-h2: do not fiddle with ->dsi to indicate demux is idle
---