Hi, HAProxy 2.7-dev9 was released on 2022/11/18. It added 168 new commits after version 2.7-dev8.
I know, one month has elapsed since -dev8, but some of us were fully busy preparing the haproxyconf and others dealing alone with the bug reports, so now we have to catch up slowly. On the other hand, these efforts were rewarded since many bugs were addressed and the feedback on the conf was generally excellent. No less than 41 bugs were addressed since -dev8, that's about 2 per work day, and most of them are now of low importance so we're converging. However I find that there's still an annoying number of small ones in the issue tracker, which are not necessarily regressions but which deserve being analysed a bit, and this takes time. I'll try to sum up one month of changes below by mostly focusing on user-visible ones (including developers): - USE_SHM_OPEN that is used to preserve startup logs across reloads operated by the master process was extended by default to the linux-musl and freebsd targets. - tree-wide update to the "fallthrough" hint to tell the compiler to shut up on missing breaks between switch/case statements: those who were dealing with preprocessing followed by compiling with compilers starting with gcc 7 were still seeing lots of warnings due to the preprocessor stripping the comments and the compiler not seeing them. This typically happened for those using distcc or ccache (could possibly trigger for some distros using build farms). - xxhash was updated to version 0.8.1 to address the similar fallthrough issue as above (very few other differences so that's OK). - fixed the build issue that was breaking DEBUG_MEM_STATS on old compilers; it was my fault for putting quotes around symbol names where it was inappropriate. - fixed build issues for dev/poll and dev/tcploop which were ignoring changes to the source file, and mis-reporting certain build steps. - various QUIC build fixes on m68k, 32-bit platforms in general, and worked around a wrong warning from gcc-12. Usual number of updates including more counters and code cleanups/refactoring. By the way, we'd like to thank Gabriel Tzagkarakis for his amazing help in fixing the remaining QUIC bugs over the last month. - the support for completely obsolete and abandonned set-cookie2 was finally removed (thanks Tim for the reminder). It was planned for 2.5 already but we forgot it and it was not suitable to break the 2.5->2.6 transition. - mux-h1's connection handling was refined so that the stream code depends less on the low-level connection status. This is part of the permanent quest to report the most accurate errors possible and not to report any when everything went fine. Mux-h2 experienced a similar but smaller cleanup (it's trickier and we don't want to risk regressions now). - SSL certiticate error checking was ignoring decoding errors and was fixed. There is a non-nul risk that errors are now reported at boot time from broken certs that would already not work anyway but would have been silently ignored. - ca-ignore-err and crt-ignore-err can now use an error contant name and not just a value (since openssl found it fun to change the documented values between 1.x and 3.0). In addition, such options were previously limited to the 64 first values, this is no longer the case. - a new "trace" statement can be placed in the global section, using the exact same syntax as on the CLI. It requires that the directive "expose-experimental-directives" is set first because we're not certain it will remain like this, but it significantly improves operations for users willing to share traces with developers during debugging sessions, so we figured that any format would be better than nothing. - a "quick-exit" keyword was added to the global section so that those who absolutely need to skip deinit() on quick reload can do it. The time savings are only marginal, however it could have been a useful workaround a few times in the past when triggering a double-free in deinit(). - the "debug dev memstats" output now also displays where buffers are allocated and released. This should help track leaks when they happen. - the "peers" section now supports a principle of sharding. The idea is that when you have to push lots of updates to some aggregating nodes, the amount of traffic can quickly become a limiting factor. With this it becomes possible to use different targets for different keys. The keys are hashed with the tables' names and only the relevant peers get them. - the stderr logs could exhibit the prefix "CLI" after an "add server" command had been issued on the same thread. Now it will always be properly cleared. However some users who might have been observing the random faulty behavior could notice a difference. - SSL error reporting upon startup was made clearer; previously, some errors could appear ambigous when loading certs and CAs. - "nbthread", "thread-group" and "thread-groups" will now refuse to be changed after any section other than "global". We've indeed identified a number of nasty chicken-and-egg situations where the risk that the thread count or the thread-to-group mapping changes after a "bind" line (or possibly other statements) makes certain things very difficult to deal with. One of them was the need to support "bind" lines spreading over multiple groups, as well as automatic shards. There's very little chance anyone has fun adding an extra "global" section after other ones just to change "nbthread", but just in case we'd rather fire an error now than during the 2.7->2.8 transition. - CI improvements such as 32-bit builds and libreSSL updates. - lots of code cleanups and some flag renames - various small doc updates As you can see there's nothing really outstanding, lots of small stuff that had to be finished and that takes time. On the todo list of things that were not yet added to the issue tracker, I can cite: - need to make the servers' idle conns counter per-thread group. I noticed already that when using thread groups, we were killing connections far too aggressively since they can't be shared between groups and we tend to end up with slightly more than the estimated limit. I finally figured how to address this but that's yet another day of work so it will be in next one. - I found that "timeout check" fails to extend the check delay when running with short checks. I'm pretty sure it used to work and don't know when it broke. This will not hold 2.7 though. The other issues I'm seeing in the tracker are not 2.7-specific for now but I still want to think about some of them with 2.7 in mind to be sure not to face post-release trouble. Hopefully in the second half of next week we can emit a -dev10 if some stuff requires it to ease testing, and if everything goes well it looks reasonable to aim for a release in the middle of the week after to stay on end of month. There's no strict schedule as usual, and I'm fine with slipping a little bit but only if we have good reasons (i.e. not "I found this patch in my tree" nor "I haven't had time to test"). This means that if you'd like to run some tests on your favorite OS, or if you need to boot the old dusty Solaris, OpenBSD or AIX machine that sleeps in the basement and takes one hour to build, now is the best moment for it. 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.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy.git Changelog : https://www.haproxy.org/download/2.7/src/CHANGELOG 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 (24): BUILD: ssl_sock: fix null dereference for QUIC build BUG/MINOR: quic: fix buffer overflow on retry token generation MINOR: quic: add version field on quic_rx_packet MINOR: quic: extend pn_offset field from quic_rx_packet MINOR: quic: define first packet flag MINOR: quic: extract connection retrieval MINOR: quic: split and rename qc_lstnr_pkt_rcv() MINOR: quic: refactor packet drop on reception MINOR: quic: extend Retry token check function BUG/MINOR: mux-quic: complete flow-control for uni streams MINOR: quic: do not crash on unhandled sendto error MINOR: quic: display unknown error sendto counter on stat page MINOR: quic: remove unnecessary quic_session_accept() BUG/MINOR: quic: fix subscribe operation MINOR: quic: add counter for interrupted reception BUG/MINOR: quic: fix race condition on datagram purging CLEANUP: cli: rename dynamic error printing state MINOR: cli: define usermsgs print context MINOR: server: clear prefix on stderr logs after add server BUILD: quic: fix dubious 0-byte overflow on qc_release_lost_pkts MINOR: ncbuf: complete doc for ncb_advance() BUG/MEDIUM: quic: fix unsuccessful handshakes on ncb_advance error BUG/MEDIUM: quic: fix memleak for out-of-order crypto data MINOR: quic: complete traces/debug for handshake Aurelien DARRAGON (6): MINOR: list: fixing typo in MT_LIST_LOCK_ELT DOC/MINOR: list: fixing MT_LIST_LOCK_ELT macro documentation MINOR: list: adding MT_LIST_APPEND_LOCKED macro BUG/MINOR: log: fixing bug in tcp syslog_io_handler Octet-Counting BUG/MEDIUM: wdt/clock: properly handle early task hangs BUG/MINOR: http_ana/txn: don't re-initialize txn and req var lists Christopher Faulet (39): BUG/MINOR: log: Preserve message facility when the log target is a ring buffer BUG/MINOR: ring: Properly parse connect timeout BUG/MEDIUM: compression: handle rewrite errors when updating response headers BUG/MINOR: sink: Only use backend capability for the sink proxies BUG/MINOR: sink: Set default connect/server timeout for implicit ring buffers BUG/MAJOR: stick-table: don't process store-response rules for applets BUG/MINOR: http-htx: Fix error handling during parsing http replies BUG/MINOR: resolvers: Don't wait periodic resolution on healthcheck failure BUG/MINOR: resolvers: Set port before IP address when processing SRV records BUG/MINOR: mux-fcgi: Be sure to send empty STDING record in case of zero-copy BUG/MEDIUM: mux-fcgi: Avoid value length overflow when it doesn't fit at once REG-TESTS: cache: Remove T-E header for 304-Not-Modified responses MINOR: mux-h1: Remove usless code inside shutr callback CLEANUP: mux-h1; Rename H1S_F_ERROR flag into H1S_F_ERROR_MASK REORG: mux-h1: Reorg the H1C structure CLEANUP: mux-h1: Rename H1C_F_ST_ERROR and H1C_F_ST_SILENT_SHUT flags MINOR: mux-h1: Add a dedicated enum to deal with H1 connection state MEDIUM: mux-h1: Handle H1C states via its state field instead of H1C_F_ST_* MINOR: mux-h1: Don't handle subscribe for reads in h1_process_demux() CLEANUP: mux-h1: Rename H1C_F_ERR_PENDING into H1C_F_ABRT_PENDING MINOR: mux-h1: Add flag on H1 stream to deal with internal errors MEDIUM: mux-h1: Rely on the H1C to deal with shutdown for reads CLEANUP: mux-h1: Reorder H1 connection flags to avoid holes MEDIUM: mux-h1: Don't report a final error whe a message is aborted MEDIUM: mux-pt: Don't always set a final error on SE on the sending path MEDIUM: mux-h2: Introduce flags to deal with connection read/write errors CLEANUP: mux-h2: Remove unused fields in h2c structures MEDIUM: mux-fcgi: Introduce flags to deal with connection read/write errors MINOR: sconn: Set SE_FL_ERROR only when there is no more data to read MINOR: mux-h1: Rely on a H1S flag to know a WS key was found or not DOC: lua-api: Remove warning about the lua filters BUG/MEDIUM: listener: Fix race condition when updating the global mngmt task CLEANUP: listener: Remove useless task_queue from manage_global_listener_queue BUG/MINOR: mux-h1: Fix error handling when H1S allocation failed on client side CLEANUP: mux-h1: Don't test h1c in h1_shutw_conn() BUG/MEDIUM: raw-sock: Don't report connection error if something was received MINOR: cfgparse: Always check the section position MEDIUM: thread: Restric nbthread/thread-group(s) to very first global sections BUILD: peers: Remove unused variables Dridi Boukelmoune (1): IMPORT: slz: mention the potential header in slz_finish() Emeric Brun (2): MINOR: peers: handle multiple resync requests using shards BUG/MEDIUM: peers: messages about unkown tables not correctly ignored Frédéric Lécaille (3): BUILD: quic: QUIC mux build fix for 32-bit build BUILD: quic: Fix build for m68k cross-compilation MINOR: peers: Support for peer shards Ilya Shipitsin (5): BUILD: scripts: disable tests build on QuicTLS build CI: add monthly gcc cross compile jobs CLEANUP: assorted typo fixes in the code and comments CI: switch to the "latest" LibreSSL CI: enable QUIC for LibreSSL builds Mickael Torres (1): BUG/MINOR: mux-h1: Do not send a last null chunk on body-less answers Miroslav Zagorac (1): BUG/MINOR: httpclient: fixed memory allocation for the SSL ca_file Remi Tricot-Le Breton (6): BUG/MINOR: ssl: Memory leak of DH BIGNUM fields BUG/MINOR: ssl: Memory leak of AUTHORITY_KEYID struct when loading issuer BUG/MINOR: ssl: ocsp structure not freed properly in case of error BUG/MEDIUM: ssl: Verify error codes can exceed 63 BUG/MINOR: ssl: Fix potential overflow BUG/MINOR: ssl: SSL_load_error_strings might not be defined Thierry Fournier (1): BUG/MEDIUM: httpclient: segfault when the httpclient parser fails William Lallemand (22): BUG/MEDIUM: httpclient/lua: crash when the lua task timeout before the httpclient BUG/MEDIUM: httpclient: check if the httpclient was released in the IO handler REGTESTS: httpclient/lua: test the lua task timeout with the httpclient CI: github: dump the backtrace of coredumps in the alpine container BUILD: Makefile: add "USE_SHM_OPEN" on the linux-musl target DOC: lua: add a note about compression w/ httpclient CLEANUP: mworker/cli: rename the status function to loadstatus MINOR: mworker/cli: does no try to dump the startup-logs w/o USE_SHM_OPEN MINOR: ssl: add the SSL error string when failing to load a certificate MINOR: ssl: add the SSL error string before the chain MEDIUM: ssl: be stricter about chain error MINOR: ssl: dump the SSL string error when SSL_CTX_use_PrivateKey() failed. CLEANUP: ssl: remove dead code in ssl_sock_load_pem_into_ckch() MEDIUM: ssl: {ca,crt}-ignore-err can now use error constant name MINOR: ssl: x509_v_err_str converter transforms an integer to a X509_V_ERR name BUG/MINOR: ssl: bind_conf is uncorrectly accessed when using QUIC CLEANUP: ssl: remove printf in bind_parse_ignore_err BUG/MINOR: ssl: crt-ignore-err memory leak with 'all' parameter MINOR: ssl: ssl_sock_load_cert_chain() display error strings MINOR: ssl: reintroduce ERR_GET_LIB(ret) == ERR_LIB_PEM in ssl_sock_load_pem_into_ckch() BUG/MINOR: ssl: don't initialize the keylog callback when not required BUILD: Makefile: enable USE_SHM_OPEN by default on freebsd Willy Tarreau (57): BUILD: ssl_utils: fix build on gcc versions before 8 BUILD: debug: remove unnecessary quotes in HA_WEAK() calls CI: emit the compiler's version in the build reports IMPORT: xxhash: update xxHash to version 0.8.1 IMPORT: slz: declare len to fix debug build when optimal match is enabled IMPORT: slz: define and use a __fallthrough statement for switch/case BUILD: compiler: add a macro to detect if another one is set and equals 1 BUILD: compiler: add a default definition for __has_attribute() BUILD: compiler: define a __fallthrough statement for switch/case BUILD: sample: use __fallthrough in smp_is_rw() and smp_dup() BUILD: quic: use __fallthrough in quic_connect_server() BUILD: ssl/crt-list: use __fallthrough in cli_io_handler_add_crtlist() BUILD: ssl: use __fallthrough in cli_io_handler_commit_{cert,cafile_crlfile}() BUILD: ssl: use __fallthrough in cli_io_handler_tlskeys_files() BUILD: hlua: use __fallthrough in hlua_post_init_state() BUILD: stream: use __fallthrough in stats_dump_full_strm_to_buffer() BUILD: tcpcheck: use __fallthrough in check_proxy_tcpcheck() BUILD: stats: use __fallthrough in stats_dump_proxy_to_buffer() BUILD: peers: use __fallthrough in peer_io_handler() BUILD: hash: use __fallthrough in hash_djb2() BUILD: tools: use __fallthrough in url_decode() BUILD: args: use __fallthrough in make_arg_list() BUILD: acl: use __fallthrough in parse_acl_expr() BUILD: spoe: use __fallthrough in spoe_handle_appctx() BUILD: logs: use __fallthrough in build_log_header() BUILD: check: use __fallthrough in __health_adjust() BUILD: http_act: use __fallthrough in parse_http_del_header() BUILD: h1_htx: use __fallthrough in h1_parse_chunk() BUILD: vars: use __fallthrough in var_accounting_{diff,add}() BUILD: map: use __fallthrough in cli_io_handler_*() BUILD: compression: use __fallthrough in comp_http_payload() BUILD: stconn: use __fallthrough in various shutw() functions BUILD: prometheus: use __fallthrough in promex_dump_metrics() and IO handler() CLEANUP: stick-table: remove the unused table->exp_next OPTIM: stick-table: avoid atomic ops in stktable_requeue_exp() when possible BUG/MEDIUM: stick-table: fix a race condition when updating the expiration task MEDIUM: http-ana: remove set-cookie2 support MINOR: deinit: add a "quick-exit" option to bypass the deinit step OPTIM: ebtree: make ebmb_insert_prefix() keep a copy the new node's pfx OPTIM: ebtree: make ebmb_insert_prefix() keep a copy the new node's key MINOR: pool/debug: create a new pool_alloc_flag() macro MINOR: dynbuf: switch allocation and release to macros to better track users DOC: config: fix alphabetical ordering of global section MINOR: trace: split the CLI "trace" parser in CLI vs statement MEDIUM: trace: create a new "trace" statement in the "global" section BUG/MEDIUM: ring: fix creation of server in uninitialized ring BUILD: makefile: mark poll and tcploop targets as phony BUILD: makefile: properly pass CC to sub-projects BUILD: makefile: move default verbosity settings to include/make/verbose.mk BUILD: makefile: use $(cmd_MAKE) in quiet mode BUILD: makefile: move the compiler option detection stuff to compiler.mk DEV: poll: make the connect() step an action as well DEV: poll: strip the "do_" prefix from reported function names DEV: poll: indicate the FD's side in front of its value BUG/MINOR: pool/cli: use ullong to report total pool usage in bytes DOC: internal: commit notes about polling states and flags DOC: internal: commit notes about polling states and flags on connect() ---