Hi,
HAProxy 2.7.9 was released on 2023/06/07. It added 118 new commits
after version 2.7.8.
This release, as the previous one, is a bit huge. We were busy to release
the 2.8.0. It is high time for us to emit new releases for other stable
versions. The 2.7.9 is the first one of a long series.
In this release, Amaury and Fred continued to stabilize the QUIC stack. It
is now pretty stable, but it is probably better to deploy the 2.8 to use QUIC
in production because it is a LTS version. The 2.7 will still receive bug
fixes, but most of improvements will not be backported. In this release, some
patches fixed the report of the end of the request to upper layer, mainly to
conform to the stream-connector layer refactoring. Few minor bugs on error
paths were also addressed, and comments were added at various places to help
understand some BUG_ON(). Fred also added a number of event counters that
had been missing over the last few troubleshooting sessions.
The SPOE was fixed to limit the number of idle applets on edge cases. On
sporadic bursts, it was possible to systematically start new applets because
the SPOE processing frequency was lower than the messages rate, and this
independently on the number of idle applets. The idle applets tracking was
improved to be able to properly reuse them.
This fix revealed a flaw in the way synchronous frames were handled, leading
to a raise of the message processing latency. To fix this issue, in
synchronous mode, a SPOE applet will now systematically try to send a frame
when it is woken up, except if it is still waiting for a ACK frame after a
receive attempt.
Finally, a crash for engines configured on disabled proxies was fixed. SPOE
engines must not be released for such proxies during the startup because
some resources may be shared with other engines, for instance the ACLs.
Two issues were fixes in the H2 multiplexer:
* First, we now take care to not refresh the idle timeout when control
frames are received. Because of this bug, it was possible to keep a
connection alive by sending periodically control frames, like PING or
PRIORITY, even after GOAWAY frame was sent. Among other things, it was
possible to hit this bug during a soft-stop or a reload.
* Then, the request state at the H2 stream level is now properly reported
to upper layer when the stream-connector is created. This bug was
introduced in 2.4. A request may be fully received when the
stream-connector is created. In this case, all subsequent receives may
be skipped. It was an issue when an error was also detected because the
upper layer was not aware of it and the session could be frozen.
The FCGI multiplexer was fixed to be sure to never request more room to the
channel when the mux is waiting for more data. It is especially important to
not do so if the channel buffer is empty. Otherwise, the situation cannot
evolved and the session remains stuck.
A race condition was fixed in the thread isolation that can allow a thread
that was running under isolation to continue running while another one
enters isolation.
The total boot time is now measured. It is used to postpone the startup of
health checks. It is pretty useful for very large configurations taking up
few seconds to start, to not schedule some servers' checks in past. This
also helps to have a better distribution of health-checks when
"spread-checks" option is used. In addition, the spread-checks is also used
at boot time, making the load much smoother from the start.
More actions were added to the "http-after-response" (set-map,
set-log-level, sc-inc-gpc etc)
Finally, as usual, several minor bugs were fixed. The doc was improved. Most
notably, a section about side format was added in the configuration
manual. And the development tools were extended. A script to decode most
flags in the "show sess all" output was added.
If you are running a 2.7, please upgrade. But keep in mind it is not a LTS
version. Now the 2.8.0 was released, it could be good to start to evaluate
it. However keep cool, there is no rush to upgrade. You have 1 year to do
so ;)
Thanks everyone for you help and your contributions !
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.7/src/
Git repository : https://git.haproxy.org/git/haproxy-2.7.git/
Git Web browsing : https://git.haproxy.org/?p=haproxy-2.7.git
Changelog : https://www.haproxy.org/download/2.7/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
---
Complete changelog :
Aleksandar Lazic (1):
DOC: configuration: add info about ssl-engine for 2.6
Amaury Denoyelle (47):
MINOR: quic: use real sending rate measurement
BUG/MINOR: mux-quic: prevent quic_conn error code to be overwritten
MINOR: mux-quic: add trace event for local error
MINOR: mux-quic: wake up after recv only if avail data
MINOR: mux-quic: adjust local error API
MINOR: mux-quic: report local error on stream endpoint asap
MINOR: mux-quic: close connection asap on local error
MINOR: quic: add format argument for "show quic"
MINOR: quic: implement oneline format for "show quic"
BUG/MINOR: mux-quic: fix transport VS app CONNECTION_CLOSE
BUG/MEDIUM: mux-quic: wakeup tasklet to close on error
BUG/MINOR: mux-quic: do not prevent shutw on error
BUG/MINOR: mux-quic: do not free frame already released by quic-conn
BUG/MINOR: mux-quic: no need to subscribe for detach streams
MINOR: mux-quic: add traces for stream wake
MINOR: mux-quic: do not send STREAM frames if already subscribe
MINOR: mux-quic: factorize send subscribing
MINOR: mux-quic: simplify return path of qc_send()
MEDIUM: quic: streamline error notification
MEDIUM: mux-quic: adjust transport layer error handling
MINOR: htx: add function to set EOM reliably
MINOR: mux-quic: remove dedicated function to handle standalone FIN
BUG/MINOR: mux-quic: properly handle buf alloc failure
BUG/MINOR: mux-quic: handle properly recv ncbuf alloc failure
BUG/MINOR: quic: do not alloc buf count on alloc failure
BUG/MINOR: mux-quic: differentiate failure on qc_stream_desc alloc
BUG/MINOR: mux-quic: free task on qc_init() app ops failure
BUG/MINOR: mux-quic: handle properly Tx buf exhaustion
BUG/MINOR: h3: missing goto on buf alloc failure
MINOR: mux-quic: add trace to stream rcv_buf operation
MINOR: mux-quic: properly report end-of-stream on recv
MINOR: mux-quic: uninline qc_attach_sc()
BUG/MEDIUM: mux-quic: fix EOI for request without payload
CLEANUP: mux-quic/h3: complete BUG_ON with comments
MINOR: quic: remove return val of quic_aead_iv_build()
MINOR: quic: use WARN_ON for encrypt failures
BUG/MINOR: quic: handle Tx packet allocation failure properly
MINOR: quic: fix alignment of oneline show quic
MINOR: mux-quic: set both EOI EOS for stream fin
MINOR: mux-quic: only set EOS on RESET_STREAM recv
MINOR: mux-quic: report error on stream-endpoint earlier
CLEANUP: mux-quic: remove unneeded fields in qcc
MINOR: mux-quic: remove nb_streams from qcc
MINOR: quic: fix stats naming for flow control BLOCKED frames
BUG/MEDIUM: mux-quic: only set EOI on FIN
CLEANUP: mux-quic: rename functions for mux_ops
CLEANUP: mux-quic: rename internal functions
Artur Pydo (1):
DOC: quic: fix misspelled tune.quic.socket-owner
Aurelien DARRAGON (9):
BUG/MINOR: proxy: missing free in free_proxy for redirect rules
MINOR: proxy: add http_free_redirect_rule() function
BUG/MINOR: http_rules: fix errors paths in http_parse_redirect_rule()
BUG/MINOR: errors: handle malloc failure in usermsgs_put()
BUG/MINOR: log: fix memory error handling in parse_logsrv()
BUG/MINOR: hlua: unsafe hlua_lua2smp() usage
DOC: config: fix jwt_verify() example using var()
BUG/MINOR: cfgparse-tcp: leak when re-declaring interface from bind line
BUG/MINOR: proxy: add missing interface bind free in free_proxy
Christopher Faulet (16):
BUG/MEDIUM: spoe: Don't start new applet if there are enough idle ones
BUG/MINOR: resolvers: Use sc_need_room() to wait more room when dumping
stats
BUILD: mjson: Fix warning about unused variables
MINOR: spoe: Don't stop disabled proxies
BUG/MEDIUM: filters: Don't deinit filters for disabled proxies during
startup
MINOR: http-rules: Add missing actions in http-after-response ruleset
BUG/MEDIUM: mux-fcgi: Don't request more room if mux is waiting for more
data
BUG/MINOR: tcp-rules: Don't shortened the inspect-delay when EOI is set
REGTESTS: log: Reduce response inspect-delay for last_rule.vtc
DOC: config: Clarify conditions to shorten the inspect-delay for TCP rules
REGTESTS: log: Reduce again response inspect-delay for last_rule.vtc
MINOR: mux-h2: Set H2_SF_ES_RCVD flag when decoding the HEADERS frame
MINOR: mux-h2: Add a function to propagate termination flags from h2s to
SE
BUG/MEDIUM: mux-h2: Propagate termination flags when frontend SC is
created
DOC: config: Fix bind/server/peer documentation in the peers section
BUG/MINOR: spoe: Only skip sending new frame after a receive attempt
Daniel Epperson (1):
DOC: add size format section to manual
Frédéric Lécaille (18):
CLEANUP: quic: No more used q_buf structure
CLEANUP: quic: Rename several <buf> variables in quic_frame.(c|h)
CLEANUP: quic: Typo fix for quic_connection_id pool
BUG/MINOR: quic: Wrong key update cipher context initialization for
encryption
BUG/MINOR: quic: Possible crash when dumping version information
BUG/MINOR: quic: Buggy acknowlegments of acknowlegments function
BUG/MINOR: quic: Wrong redispatch for external data on connection socket
MINOR: quic: Add low level traces (addresses, DCID)
BUG/MINOR: quic: Wrong token length check (quic_generate_retry_token())
BUG/MINOR: quic: Missing Retry token length on receipt
MINOR: quic: Align "show quic" command help information
CLEANUP: quic: Indentation fix quic_rx_pkt_retrieve_conn()
CLEANUP: quic: Useless tests in qc_rx_pkt_handle()
MINOR: quic: Add some counters at QUIC connection level
MINOR: quic: Add a counter for sent packets
MINOR: quic: Add QUIC connection statistical counters values to "show
quic"
BUG/MINOR: quic: Possible crash when SSL session init fails
CONTRIB: Add vi file extensions to .gitignore
Ilia Shipitsin (2):
CI: switch to Fastly CDN to download LibreSSL
BUILD: ssl: switch LibreSSL to Fastly CDN
Ilya Shipitsin (1):
CI: drop Fedora m32 pipeline in favour of cross matrix
Mariam John (1):
DOC/MINOR: config: Fix typo in description for `ssl_bc` in
configuration.txt
William Lallemand (2):
BUG/MINOR: ssl/sample: x509_v_err_str converter output when not found
BUILD: ssl: buggy -Werror=dangling-pointer since gcc 13.0
Willy Tarreau (19):
DEV: haring: automatically disable DEBUG_STRICT
DEV: haring: update readme to suggest using the same build options for
haring
BUG/MINOR: debug: fix incorrect profiling status reporting in show threads
BUG/MINOR: debug: do not emit empty lines in thread dumps
BUILD: debug: do not check the isolated_thread variable in non-threaded
builds
BUILD: quic: fix build warning when threads are disabled
BUILD: thread: implement thread_harmless_end_sig() for threadless builds
BUG/MEDIUM: mux-h2: make sure control frames do not refresh the idle
timeout
MINOR: clock: measure the total boot time
BUG/MINOR: checks: postpone the startup of health checks by the boot time
MINOR: checks: make sure spread-checks is used also at boot time
DEV: flags: add a script to decode most flags in the "show sess all"
output
DEV: flags: add missing stream flags to show-sess-to-flags
DEV: flags/show-sess-to-flags: only retrieve hex digits from hex fields
DEV: flags/show-sess-to-flags: add support for color output
SCRIPTS: publish-release: update the umask to keep group write access
BUG/MEDIUM: threads: fix a tiny race in thread_isolate()
BUG/MINOR: mux-h2: refresh the idle_timer when the mux is empty
MINOR: quic/cli: clarify the "show quic" help message
--
Christopher Faulet