Hi,
HAProxy 2.8-dev7 was released on 2023/04/08. It added 147 new commits
after version 2.8-dev6.
Freezing features has good virtues. This version attracted a number of
pending commits that will need a bit of testing before the release. Among
the changes:
- Christopher could finally merge a significant part of his rework of
the status flags that moved from the channel to the stream connector.
This was an important change that we've been hoping to do since 2.5
or so, that will greatly help avoid some of the obscure bugs that are
occasionally reported after a minor change that causes never-ending
streams or ignored aborts. It may possibly bring a bug or two caused
by mistakes during the conversion, and it may possibly wake up some
such older bugs, though the risk is quite low and the patches were
carefully reviewed. But testing and reports are welcome. There's a
second part to this that we're still wondering whether a part can
still be merged or not, we'll see soon.
- Olivier implemented support for compressing requests. While it can
sound surprising at first, it's very useful when the front LB nodes
are selected by DNS and need to route large requests to a remote
server that is reached over a limited link or when outgoing traffic
is expensive.
- Aurélien merged his event handler API. This is publish/subscribe
mechanism used to broadcast notifications about state changes to
internal subsystems. For now, only server state change is supported,
and such events may be subscribed to from Lua. This means that some
Lua code can be notified about added/removed/up/down servers. A mid-
term goal will be to reimplement the mailers entirely in Lua, allowing
unlimited customizing.
- Aurélien addressed a CPU usage issue when stopping; pool_gc() was
called too often, resulting in stick-tables possibly consuming a lot
of CPU during such periods, which was even worse when malloc_trim()
was called to free memory as this call involves locking inside the
libc, hence severe contention.
- Thierry's changes to make Lua support dynamic servers were finally
merged. In the past, Lua could take a long time to start when dealing
with very large configs as it was learning the servers, and wouldn't
be aware of servers added on the fly. This is no more a limitation.
- Fred and Amaury improved the QUIC stack in various areas: less memory
consumption by removing one tree lookup, fixed some RTT calculations
and corner cases in congestion control algorithms, added more info to
"show quic", added a dummy congestion control algorithm with a fixed
window that may help us diagnose some issues in field.
- William managed to improve acme.sh to directly manage haproxy at
runtime via the CLI, and to start a config without certificates.
This means that once his pull request will be merged, Let's Encrypt
support will be totally seamless. In case it wouldn't be merged (there
are many PRs pending there), we'd find a different way to host this
change, either by integrating it as a "plugin" with haproxy, or by
forking the repository and providing it under the haproxy github
organization. More info in the PR here:
https://github.com/acmesh-official/acme.sh/pull/4581
- Martin, our intern for one week, implemented the support for case
insensitive argument match in urlp/url_param (issue 1633). It was a
one year-old feature request that we hoped for 2.6. Not bad at all
for a first contribution ;-)
- the rest is essentially bug fixes, doc and cleanups.
Regarding the pending stuff I'm aware of at the moment:
- Christopher still has changes aiming at making applets much more
reliable by no more stepping over the stream's feet. It's really
desired but possibly risky at the same time. We'll check this
together next week, and possibly take some of it, or maybe insert
just a smaller step towards it in order to ease backports of post-2.9
fixes to 2.8 later.
- Amaury managed to make the QUIC connections behave exactly like
the TCP connections at the lower layers, in that they are migrable
to other threads, giving back the control to listener_accept() like
for TCP. It's only a matter of writing commit messages now.
- My changes to make bind lines support multiple thread groups are
now working, but I was blocked on the QUIC part, which is no more
a problem after Amaury's change above. I've rebased my code on top
of his and will merge it once it's in.
- Aurélien managed to add a working timeout for Lua instructions
that are not yieldable (i.e. busy loops called from sample fetch
functions). The patches were reviewed yesterday afternoon and
will be merged early next week after some cosmetic updates.
And with all this done we'll have to focus more on testing, debugging,
documentation, cleanups and small updates.
I must confess that yesterday I felt like we reached an intersting
milestone with several long-term tasks finally seeing the light at the
end of the tunnel!
As usual, test it, beat it and report any problem!
Have a nice week-end; it's sunny here so I should be silent now ;-)
Willy
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.8/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.8/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 (3):
MINOR: quic: derive first DCID from client ODCID
MINOR: quic: remove ODCID dedicated tree
MINOR: quic: remove address concatenation to ODCID
Aurelien DARRAGON (44):
MINOR: proxy/pool: prevent unnecessary calls to pool_gc()
CLEANUP: proxy: remove stop_time related dead code
BUG/MEDIUM: proxy/sktable: prevent watchdog trigger on soft-stop
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()
MINOR: server: always call ssl->destroy_srv when available
MINOR: server: correctly free servers on deinit()
BUG/MINOR: hlua: hook yield does not behave as expected
MINOR: hlua: properly handle hlua_process_task HLUA_E_ETMOUT
BUG/MINOR: hlua: enforce proper running context for register_x functions
MEDIUM: hlua_fcn/api: remove some old server and proxy attributes
CLEANUP: hlua: fix conflicting comment in hlua_ctx_destroy()
MINOR: hlua: add simple hlua reference handling API
MINOR: hlua: fix return type for hlua_checkfunction() and
hlua_checktable()
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
CLEANUP: hlua: use hlua_ref() instead of luaL_ref()
CLEANUP: hlua: use hlua_pushref() instead of lua_rawgeti()
CLEANUP: hlua: use hlua_unref() instead of luaL_unref()
MINOR: hlua: simplify lua locking
BUG/MEDIUM: hlua: prevent deadlocks with main lua lock
MINOR: hlua_fcn: add server->get_rid() method
MINOR: hlua: support for optional arguments to core.register_task()
DOC: lua: silence "literal block ends without a blank line" Sphinx
warnings
DOC: lua: silence "Unexpected indentation" Sphinx warnings
BUG/MINOR: event_hdl: fix rid storage type
BUG/MINOR: event_hdl: make event_hdl_subscribe thread-safe
MINOR: event_hdl: global sublist management clarification
BUG/MEDIUM: event_hdl: clean soft-stop handling
BUG/MEDIUM: event_hdl: fix async data refcount issue
MINOR: event_hdl: normal tasks support for advanced async mode
MINOR: event_hdl: add event_hdl_async_equeue_isempty() function
MINOR: event_hdl: add event_hdl_async_equeue_size() function
MINOR: event_hdl: pause/resume for subscriptions
MINOR: proxy: add findserver_unique_id() and findserver_unique_name()
MEDIUM: hlua/event_hdl: initial support for event handlers
MINOR: hlua/event_hdl: per-server event subscription
EXAMPLES: add basic event_hdl lua example script
BUG/MINOR: errors: invalid use of memprintf in startup_logs_init()
Christopher Faulet (44):
BUG/MINOR: stats: Don't replace sc_shutr() by SE_FL_EOS flag yet
BUG/MEDIUM: mux-h2: Be able to detect connection error during handshake
BUG/MINOR: tcpcheck: Be able to expect an empty response
BUG/MEDIUM: stconn: Add a missing return statement in sc_app_shutr()
BUG/MINOR: stream: Fix test on channels flags to set clientfin/serverfin
touts
MINOR: applet: Uninline appctx_free()
MEDIUM: applet/trace: Register a new trace source with its events
CLEANUP: stconn: Remove remaining debug messages
BUG/MEDIUM: channel: Improve reports for shut in co_getblk()
BUG/MEDIUM: dns: Properly handle error when a response consumed
MINOR: stconn: Remove unecessary test on SE_FL_EOS before receiving data
MINOR: stconn/channel: Move CF_READ_DONTWAIT into the SC and rename it
MINOR: stconn/channel: Move CF_SEND_DONTWAIT into the SC and rename it
MINOR: stconn/channel: Move CF_NEVER_WAIT into the SC and rename it
MINOR: stconn/channel: Move CF_EXPECT_MORE into the SC and rename it
MINOR: mux-pt: Report end-of-input with the end-of-stream after a read
BUG/MINOR: mux-h1: Properly report EOI/ERROR on read0 in h1_rcv_pipe()
CLEANUP: mux-h1/mux-pt: Remove useless test on SE_FL_SHR/SE_FL_SHW flags
MINOR: mux-h1: Report an error to the SE descriptor on truncated message
MINOR: stconn: Always ack EOS at the end of sc_conn_recv()
MINOR: stconn/applet: Handle EOI in the applet .wake callback function
MINOR: applet: No longer set EOI on the SC
MINOR: stconn/applet: Handle EOS in the applet .wake callback function
MEDIUM: cache: Use the sedesc to report and detect end of processing
MEDIUM: cli: Use the sedesc to report and detect end of processing
MINOR: dns: Remove the test on the opposite SC state to send requests
MEDIUM: dns: Use the sedesc to report and detect end of processing
MEDIUM: spoe: Use the sedesc to report and detect end of processing
MEDIUM: hlua/applet: Use the sedesc to report and detect end of processing
MEDIUM: log: Use the sedesc to report and detect end of processing
MEDIUM: peers: Use the sedesc to report and detect end of processing
MINOR: sink: Remove the tests on the opposite SC state to process messages
MEDIUM: sink: Use the sedesc to report and detect end of processing
MEDIUM: stats: Use the sedesc to report and detect end of processing
MEDIUM: promex: Use the sedesc to report and detect end of processing
MEDIUM: http_client: Use the sedesc to report and detect end of processing
MINOR: stconn/channel: Move CF_EOI into the SC and rename it
MEDIUM: tree-wide: Move flags about shut from the channel to the SC
MINOR: tree-wide: Simplifiy some tests on SHUT flags by accessing SCs
directly
MINOR: stconn/applet: Add BUG_ON_HOT() to be sure SE_FL_EOS is never set
alone
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
MINOR: applet: Use unsafe version to get stream from SC in the trace
function
BUG/MUNOR: http-ana: Use an unsigned integer for http_msg flags
Frédéric Lécaille (22):
BUG/MINOR: quic: Missing padding in very short probe packets
BUG/MINOR: quic: Wrong use of now_ms timestamps (cubic algo)
MINOR: quic: Add recovery related information to "show quic"
BUG/MINOR: quic: Wrong use of now_ms timestamps (newreno algo)
BUG/MINOR: quic: Missing max_idle_timeout initialization for the
connection
MINOR: quic: Implement cubic state trace callback
MINOR: quic: Adjustments for generic control congestion traces
MINOR: quic: Traces adjustments at proto level.
MEDIUM: quic: Ack delay implementation
BUG/MINOR: quic: Wrong rtt variance computing
MINOR: quic: Add a fake congestion control algorithm named "nocc"
BUG/MINOR: quic: Remaining useless statements in cubic slow start callback
BUG/MINOR: quic: Cubic congestion control window may wrap
MINOR: quic: Add missing traces in cubic algorithm implementation
BUG/MAJOR: quic: Congestion algorithms states shared between the
connection
BUG/MINOR: quic: Remove useless BUG_ON() in newreno and cubic algo
implementation
MINOR: quic: Add trace to debug idle timer task issues
BUG/MINOR: quic: Unexpected connection closures upon idle timer task
execution
BUG/MINOR: quic: Wrong idle timer expiration (during 20s)
BUILD: quic: 32bits compilation issue in cli_io_handler_dump_quic()
BUG/MINOR: quic: Possible wrong PTO computing
BUG/MINOR: quic: Possible crashes in qc_idle_timer_task()
Ilya Shipitsin (3):
CI: run smoke tests on config syntax to check memory related issues
CLEANUP: assorted typo fixes in the code and comments
CI: exclude doc/{design-thoughts,internals} from spell check
Marcos de Oliveira (1):
DOC/MINOR: reformat configuration.txt's "quoting and escaping" table
Martin DOLEZ (4):
MINOR: http_fetch: Add support for empty delim in url_param
MINOR: http_fetch: add case insensitive support for smp_fetch_url_param
MINOR: http_fetch: Add case-insensitive argument for url_param/urlp_val
REGTESTS : Add test support for case insentitive for url_param
Olivier Houchard (6):
MINOR: compression: Make compression offload a flag
MINOR: compression: Prepare compression code for request compression
MINOR: compression: Store algo and type for both request and response
MINOR: compression: Count separately request and response compression
MEDIUM: compression: Make it so we can compress requests as well.
BUG/MEDIUM: listeners: Use the right parameters for strlcpy2().
Remi Tricot-Le Breton (4):
BUG/MINOR: ssl: Remove dead code in cli_parse_update_ocsp_response
BUG/MINOR: ssl: Fix potential leak in cli_parse_update_ocsp_response
BUG/MINOR: ssl: ssl-(min|max)-ver parameter not duplicated for bundles in
crt-list
BUG/MINOR: ssl: Undefined reference when building with
OPENSSL_NO_DEPRECATED
Thierry Fournier (4):
MINOR: hlua: Fix two functions that return nothing useful
MEDIUM: hlua: Dynamic list of frontend/backend in Lua
MINOR: hlua_fcn: alternative to old proxy and server attributes
MEDIUM: hlua_fcn: dynamic server iteration and indexing
William Lallemand (2):
DOC: config: strict-sni allows to start without certificate
BUG/MINOR: mworker: unset more internal variables from program section
Willy Tarreau (10):
MINOR: cli: support filtering on FD types in "show fd"
MINOR: http-act: emit a warning when a header field name contains
forbidden chars
BUG/MINOR: lua: remove incorrect usage of strncat()
CLEANUP: tcpcheck: remove the only occurrence of sprintf() in the code
CLEANUP: ocsp: do no use strpcy() to copy a path!
CLEANUP: tree-wide: remove strpcy() from constant strings
CLEANUP: opentracing: remove the last two occurrences of strncat()
BUILD: compiler: fix __equals_1() on older compilers
MINOR: compiler: define a __attribute__warning() macro
BUILD: bug.h: add a warning in the base API when unsafe functions are used
---