Hi,
HAProxy 2.6.13 was released on 2023/05/02. It added 97 new commits
after version 2.6.12.
This update is essentially equivalent to the update from 2.7.6 to 2.7.8
so I'm mostly copy-pasting and adjusting the relevant descriptions from
Christopher's 2.7.7 announce (he did all the backports, we just wanted
to grant a few more days to catch possible regressions).
On the QUIC front, which represents ~25 commits, there were essentially
three issues that could lead to visible problems:
* The Congestion algorithms state was shared between connections
instead of being private. This could trigger BUG_ON() and cause
crashes.
* Some contradictions in code could lead to very long loops sending
empty packets (PADDING only packets). One visible effect was a very
low throughput performance when the client serialized its requests.
* The control window in congestion algorithms could be zero because of
a wrong calculation and could lead to a SIGFPE crash.
On soft-stop or reload, idle DNS session are now killed. Since 2.6.11,
these sessions were no longer killed, preventing the process from
finishing. In addition, we now force the connect timeout for the DNS
resolution. The "resolve" timeout is used to set its value. Have no
connect timeout was an issue for resolution over TCP. Connection
failures might take quite long to report, leading to an excess of
unusable DNS sessions in connecting state. It was especially visible on
soft-stop because this prevented the process to quickly exit. Still on
the DNS, errors are now properly handled when a response is
consumed. This was an issue for truncated responses followed by an
abort. The applet could ignore the abort and loop waiting for more data
until a timeout is triggered. A similar issue was fixed in the syslog
applet.
Several bugs in lua part were fixed. First, except for lua tasks, it is
no longer possible to register functions at runtime. It was clearly
stated in the documentation, but nothing forbidden it in the code. An
error is now triggered if this happens, preventing potential
segfaults. Memory leaks on references were fixed and the lua locking was
simplified to be re-entrant to prevent deadlocks.
Aurélien fixed several issues on the servers management. The "visible"
server list consistency was fixed. It was possible, at least in theory,
to access an invalid server if several dynamic server deletions were
performed while the list was accessed. For instance it might happen when
the server list was dumped in the stats. He also fixed wrong report for
tracking servers leaving drain state. Finally, he centralized proxy and
server stats updates on server state transition to be sure to not miss
an update on some transitions.
The pool_gc() calls that were made a bit too often on stopping proxies
were relaxed. Sometimes they were causing excess memory contention and
were even competing against malloc_trim().
Aurélien has extended the internal listener API to better handle the
resume operation. One noticeable effect is that listeners that have an
ABNS abstract namespace socket can now support reload without crashing
haproxy. (Note: this was already merged in 2.7 prior to 2.7.7, and left
under observation for two versions before backporting to 2.6).
The remaining are the usual bunch of bug fixes:
* It was possible to trigger the watchdog purging stick-tables on
soft-stop. To not spend too much time purging expired entries, we now
enforce a budget limitation and the purge is performed in several
steps. In addition, memory is reclaimed only when entries are
released. Indeed, this operation involves a call to malloc_trim() on
glibc, which is rather expensive.
* It was possible for a thread to wait forever (well, till the watchdog
notices) to become the exclusive owner of a file descriptor after it
had lost it; this could happen with synchronous errors met in the
DNS for example.
* NUMA topology detection on FreeBSD was fixed.
* It was not possible to use the lua filter API if used in conjunction
with a "wait-for-body" action. Switching the HTTP message in DATA
state preventing the call to most of lua filter functions. It was
fixed by keep the HTTP message in BODY state at this stage.
* The read expiration date is now updated on synchronous sends for all
streams except independent ones. This fixed an old bug when a filter
is configured. Write activities on synchronous sends were lost. With
slow clients uploading large object, it was possible to reach the
server timeout.
* ssl-min-ver and ss-max-ver parameters are now duplicated for bundles
in crt-list.
* An error is reported during configuration parsing if when the "len"
argument of a stick table type contains incorrect characters.
* DeviceAtlas compile options were updated to support the API v3 from
3.1.7 and onwards.
* The strict-sni documentation was updated to state it is possible to
start without certificate on a bind line.
Thanks to all those who helped with these fixes and to Christopher for
dealing with the backports.
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.6/src/
Git repository : https://git.haproxy.org/git/haproxy-2.6.git/
Git Web browsing : https://git.haproxy.org/?p=haproxy-2.6.git
Changelog : https://www.haproxy.org/download/2.6/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: task: allow to use tasklet_wakeup_after with tid -1
BUG/MINOR: quic: transform qc_set_timer() as a reentrant function
BUG/MINOR: mux-quic: properly handle STREAM frame alloc failure
BUG/MINOR: quic: prevent buggy memcpy for empty STREAM
MINOR: mux-quic: do not set buffer for empty STREAM frame
MINOR: mux-quic: do not allocate Tx buf for empty STREAM frame
Aurelien DARRAGON (33):
MINOR: proxy/pool: prevent unnecessary calls to pool_gc()
BUG/MINOR: backend: make be_usable_srv() consistent when stopping
MINOR: server: add SRV_F_DELETED flag
BUG/MINOR: server/del: fix srv->next pointer consistency
BUG/MINOR: stats: properly handle server stats dumping resumption
BUG/MINOR: sink: free forward_px on deinit()
BUG/MINOR: log: free log forward proxies on deinit()
BUG/MINOR: hlua: enforce proper running context for register_x functions
CLEANUP: hlua: fix conflicting comment in hlua_ctx_destroy()
MINOR: proto_uxst: add resume method
MINOR: listener/api: add lli hint to listener functions
MINOR: listener: add relax_listener() function
MINOR: listener: workaround for closing a tiny race between
resume_listener() and stopping
MINOR: listener: make sure we don't pause/resume bypassed listeners
BUG/MEDIUM: listener: fix pause_listener() suspend return value handling
BUG/MINOR: listener: fix resume_listener() resume return value handling
BUG/MEDIUM: resume from LI_ASSIGNED in default_resume_listener()
MINOR: listener: pause_listener() becomes suspend_listener()
BUG/MEDIUM: listener/proxy: fix listeners notify for proxy resume
MEDIUM: proto_ux: properly suspend named UNIX listeners
MINOR: proto_ux: ability to dump ABNS names in error messages
MINOR: hlua: add simple hlua reference handling API
BUG/MINOR: hlua: fix reference leak in core.register_task()
BUG/MINOR: hlua: fix reference leak in hlua_post_init_state()
BUG/MINOR: hlua: prevent function and table reference leaks on errors
MINOR: hlua: simplify lua locking
BUG/MEDIUM: hlua: prevent deadlocks with main lua lock
BUG/MEDIUM: proxy/sktable: prevent watchdog trigger on soft-stop
BUG/MINOR: server: incorrect report for tracking servers leaving drain
MINOR: server: explicitly commit state change in srv_update_status()
BUG/MINOR: server: don't miss proxy stats update on server state
transitions
BUG/MINOR: server: don't miss server stats update on server state
transitions
BUG/MINOR: server: don't use date when restoring last_change from state
file
Christopher Faulet (13):
Revert "BUG/MEDIUM: stconn: Don't rearm the read expiration date if EOI
was reached"
BUG/MEDIUM: channel: Improve reports for shut in co_getblk()
BUG/MEDIUM: dns: Properly handle error when a response consumed
MINOR: http-ana: Add a HTTP_MSGF flag to state the Expect header was
checked
BUG/MINOR: http-ana: Don't switch message to DATA when waiting for payload
BUG/MEDIUM: dns: Kill idle DNS sessions during stopping stage
BUG/MINOR: resolvers: Wakeup DNS idle task on stopping
BUG/MEDIUM: resolvers: Force the connect timeout for DNS resolutions
BUG/MINOR: stream: Fix test on SE_FL_ERROR on the wrong entity
REGTESTS: fix the race conditions in log_uri.vtc
BUG/MEDIUM: log: Properly handle client aborts in syslog applet
CLEANUP: backend: Remove useless debug message in assign_server()
BUG/MEDIUM: Update read expiration date on synchronous send
David Carlier (1):
BUILD: da: extends CFLAGS to support API v3 from 3.1.7 and onwards.
Frédéric Lécaille (33):
BUG/MINOR: quic: Wrong use of now_ms timestamps (cubic algo)
BUG/MINOR: quic: Wrong use of now_ms timestamps (newreno algo)
BUG/MINOR: quic: Missing max_idle_timeout initialization for the
connection
BUG/MINOR: quic: Wrong rtt variance computing
BUG/MINOR: quic: Cubic congestion control window may wrap
MINOR: quic: Add missing traces in cubic algorithm implementation
BUG/MINOR: quic: Remaining useless statements in cubic slow start callback
BUG/MAJOR: quic: Congestion algorithms states shared between the
connection
BUG/MINOR: quic: Remove useless BUG_ON() in newreno and cubic algo
implementation
BUG/MINOR: quic: Possible wrong PTO computing
MINOR: quic: Trace fix in quic_pto_pktns() (handshaske status)
BUG/MINOR: quic: Wrong packet number space probing before confirmed
handshake
MINOR: quic: Modify qc_try_rm_hp() traces
MINOR: quic: Dump more information at proto level when building packets
MINOR: quic: Add a trace for packet with an ACK frame
BUG/MINOR: quic: Ignored less than 1ms RTTs
MINOR: quic: Add connection flags to traces
BUG/MINOR: quic: Possible wrapped values used as ACK tree purging limit.
BUG/MINOR: quic: SIGFPE in quic_cubic_update()
MINOR: quic: Remove a useless test about probing in qc_prep_pkts()
BUG/MINOR: quic: Wrong Application encryption level selection when probing
BUG/MINOR: quic: Stop removing ACK ranges when building packets
MINOR: quic: Do not allocate too much ack ranges
BUG/MINOR: quic: Unchecked buffer length when building the token
BUG/MINOR: quic: Wrong Retry token generation timestamp computing
MINOR: quic: Add traces to qc_kill_conn()
MINOR: quic: Add trace to debug idle timer task issues
BUG/MINOR: quic: Possible crashes in qc_idle_timer_task()
BUG/MEDIUM: quic: Code sanitization about acknowledgements requirements
MINOR: quic: Add <pto_count> to the traces
MINOR: quic: Display the packet number space flags in traces
MINOR: quic: Move traces at proto level
BUG/MINOR: quic: Useless probing retransmission in draining or killing
state
Ilya Shipitsin (2):
CI: bump "actions/checkout" to v3 for cross zoo matrix
CI: cirrus-ci: bump FreeBSD image to 13-1
Marcos de Oliveira (1):
DOC/MINOR: reformat configuration.txt's "quoting and escaping" table
Olivier Houchard (1):
BUG/MEDIUM: fd: don't wait for tmask to stabilize if we're not in it.
Remi Tricot-Le Breton (1):
BUG/MINOR: ssl: ssl-(min|max)-ver parameter not duplicated for bundles in
crt-list
William Lallemand (2):
DOC: config: strict-sni allows to start without certificate
BUG/MINOR: stick_table: alert when type len has incorrect characters
Willy Tarreau (4):
BUG/MINOR: cfgparse: make sure to include openssl-compat
BUG/MINOR: config: fix NUMA topology detection on FreeBSD
BUILD: sock_inet: forward-declare struct receiver
BUILD: proto_tcp: export the correct names for proto_tcpv[46]
---