Hi,

HAProxy 2.7-dev8 was released on 2022/10/14. It added 81 new commits
after version 2.7-dev7.

Not much changed since dev7, we're seeing a few fixes and twice as many
cleanup and doc patches. That's nice. Other improvements are roughly
spread like this:

  - master-cli: the "reload" command now reports the operation status and
    dumps the startup logs. This is particularly useful in environments
    like systemd where there's normally no feedback reload on actions.
    The feature requires shm_open() and is currently only enabled on the
    linux-glibc target, though I could verify that it does also work on
    freebsd. Testers are welcome, just pass USE_SHM_OPEN=1 to the make
    command for this.

  - health checks: the checks were being scheduled on any thread, which
    caused all threads to periodically wake up and compete on the shared
    wait queue lock. I noticed that on a machine with 48 threads, only 40
    servers were enough to cause fast wakeups and 2% CPU! And as a side
    effect, threads were picking many checks at once, causing a significant
    imbalance that was directly responsible for some of the higher latency
    tails in tests. This was modified so that a check is now rescheduled
    on a random thread if that other thread is les loaded. This resulted
    in significantly smoothing the load over just a few seconds, and
    eliminating the latency spikes and the CPU load since there's no more
    contention on the shared lock. However, checks are now run by more
    threads, which may cause more CPU usage to be reported in a very
    specific case (many servers with very short check interval, ~10ms),
    because threads do not have the time to sleep a full time slice
    anymore. Such setups are clearly unlikely (and even less likely to
    run idle with no load at all) so that's normally not a problem,
    considering how it improves a number of shortcomings. But I'm
    interested in any reports of increased idle CPU usage if that would
    happen.

  - quic: the "thread" keyword on bind lines was not respected, all
    threads were always used. This was now changed so that it becomes
    possible to dedicate only certain threads to QUIC, or possibly to
    start several listeners on different thread groups.

  - quic: the frontend's destination address was not retrieved previously
    due to limitations of the BSD socket API. One of the limitations is
    that having a listener on 0.0.0.0 doesn't work if several addresses
    are present on the machine, as the response will take the source
    address that can reach the target from the routing table. Switching
    to recvmsg() allows on certain systems to receive packet info with
    datagrams, and among these info is the packet's destination address.
    This is automatically detected at build time, and we could verify
    that Linux and FreeBSD both work (IPv4 + IPv6). Maybe we should add
    an entry for this in "haproxy -vv" to help diagnose incompatible
    setups. There were also various other low-level improvements.

  - stick-tables: since 1.8, all the locking needed to protect against
    concurrent accesses from different threads was being performed using
    spinlocks. This doesn't scale with many threads, as can be seen when
    using track-sc on a large-scale machine. The code was adapted to
    support R/W locks and that completely unleashed the unused performance.
    A 48-thread machine jumped from 180k to 2.1M requests per second with
    3 track-sc, that's a 11x improvement!

  - init: we've seen a few reports of strange errors in certain docker
    setups roughly saying "impossible to set the FD limit to 8k, leaving
    it to 1 billion". This sounds absurd, but might be caused by certain
    syscall restrictions in such environments. There's no point reducing
    the number of FDs, it's just a limit. So the code was adjusted so
    that we only try to raise the limit but do nothing in case where we
    need to lower it.

  - lua: some fixes to better match what the doc says, and to avoid
    a risk of crash when passing wrong arguments to certain functions
    related to stick-tables.

I'm also aware of an upcoming improvement in the Lua area to speed up
startup of large configs (Lua even if unused builds a table of all
backends and servers, and that takes time). And some updates to QUIC
should happen soon to better deal with packet drops, polling and reloads.

With the haproxyconf in less than one month and the amazing amount of time
it takes to the speakers to prepare their talks, I'm anticipating a bit of
slowdown on new patches and bug fixes for the forthcoming weeks (it has
already started for me), so we need to keep reasonable expectations and
goals for the upcoming release to keep a target on end of November, and
at the same time test reports are more than ever well appreciated.

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 (17):
      CLEANUP: mux-quic: remove usage of non-standard ull type
      CLEANUP: quic: remove global var definition in quic_tls header
      BUG/MINOR: quic: adjust quic_tls prototypes
      CLEANUP: quic: fix headers
      CLEANUP: quic: remove unused function prototype
      CLEANUP: quic: remove duplicated varint code from xprt_quic.h
      CLEANUP: quic: create a dedicated quic_conn module
      BUG/MINOR: mux-quic: ignore STOP_SENDING for locally closed stream
      MINOR: quic: limit usage of ssl_sock_ctx in favor of quic_conn
      MINOR: mux-quic: check quic-conn return code on Tx
      CLEANUP: quic: fix indentation
      MEDIUM: quic: retrieve frontend destination address
      BUG/MINOR: quic: set IP_PKTINFO socket option for QUIC receivers only
      BUG/MINOR: stick-table: fix build with DEBUG_THREAD
      CLEANUP: quic: remove unused rxbufs member in receiver
      CLEANUP: quic: improve naming for rxbuf/datagrams handling
      MINOR: quic: implement datagram cleanup for quic_receiver_buf

Aurelien DARRAGON (7):
      BUG/MINOR: hlua: hlua_channel_insert_data() behavior conflicts with 
documentation
      MINOR: hlua: some luaL_checktype() calls were not guarded with MAY_LJMP
      DOC: configuration: missing 'if' in tcp-request content example
      MINOR: hlua: removing ambiguous lua_pushvalue with 0 index
      DOC/CLEANUP: lua-api: some minor corrections
      DOC: lua-api: updating toolbox link
      DOC/CLEANUP: lua-api: removing duplicate core.proxies attribute

Christopher Faulet (8):
      DOC: config: Fix pgsql-check documentation to make user param mandatory
      BUG/MINOR: http-fetch: Update method after a prefetch in smp_fetch_meth()
      REORG: mux-fcgi: Extract flags and enums into mux_fcgi-t.h
      MINOR: flags/mux-fcgi: Decode FCGI connection and stream flags
      BUG/MEDIUM: mux-h1: Add connection error handling when reading/sending on 
a pipe
      BUG/MEDIUM: mux-h1: Handle abort with an incomplete message during parsing
      BUG/MEDIUM: httpclient: Don't set EOM flag on an empty HTX message
      MINOR: httpclient/lua: Don't set req_payload callback if body is empty

Fatih Acar (1):
      BUG/MINOR: checks: update pgsql regex on auth packet

Frédéric Lécaille (6):
      MINOR: quic: New quic_cstream object implementation
      MINOR: quic: Extract CRYPTO frame parsing from qc_parse_pkt_frms()
      MINOR: quic: Use a non-contiguous buffer for RX CRYPTO data
      BUG/MINOR: quic: Stalled 0RTT connections with big ClientHello TLS message
      MINOR: quic: Split the secrets key allocation in two parts
      BUILD: ssl_sock: bind_conf uninitialized in ssl_sock_bind_verifycbk()

Ilya Shipitsin (2):
      CI: SSL: use proper version generating when "latest" semantic is used
      CI: SSL: temporarily stick to LibreSSL=3.5.3

Olivier Houchard (2):
      BUG/MEDIUM: lua: Don't crash in hlua_lua2arg_check on failure
      BUG/MEDIUM: lua: handle stick table implicit arguments right.

Tim Duesterhus (4):
      CLEANUP: Reapply ist.cocci (2)
      CLEANUP: Reapply strcmp.cocci
      CI: Replace the deprecated `::set-output` command by writing to 
$GITHUB_OUTPUT in matrix.py
      CI: Replace the deprecated `::set-output` command by writing to 
$GITHUB_OUTPUT in workflow definition

William Lallemand (7):
      MINOR: ring: ring_cast_from_area() cast from an allocated area
      MINOR: buffers: split b_force_xfer() into b_cpy() and b_force_xfer()
      MINOR: logs: startup-logs can use a shm for logging the reload
      MINOR: mworker/cli: reload command displays the startup-logs
      DOC: management: update the "reload" command of the master CLI
      DOC: management: add forgotten "show startup-logs"
      DOC: management: "show startup-logs" for master CLI

Willy Tarreau (27):
      BUILD: h1: silence an initiialized warning with gcc-4.7 and -Os
      MINOR: fd: add a new function to only raise RLIMIT_NOFILE
      MINOR: init: do not try to shrink existing RLIMIT_NOFIlE
      BUILD: http_fetch: silence an uninitiialized warning with gcc-4/5/6 at -Os
      CLEANUP: quic/receiver: remove the now unused tx_qring list
      BUG/MAJOR: stick-tables: do not try to index a server name for applets
      MINOR: plock: support disabling exponential back-off
      MINOR: freq_ctr: use the thread's local time whenever possible
      MEDIUM: stick-table: switch the table lock to rwlock
      MINOR: stick-table: do not take an exclusive lock when downing ref_cnt
      MINOR: stick-table: move the write lock inside stktable_touch_with_exp()
      MEDIUM: stick-table: only take the lock when needed in 
stktable_touch_with_exp()
      MEDIUM: stick-table: make stksess_kill_if_expired() avoid the exclusive 
lock
      MEDIUM: stick-table: return inserted entry in __stktable_store()
      MEDIUM: stick-table: free newly allocated stkess if it couldn't be 
inserted
      MEDIUM: stick-table: switch to rdlock in stktable_lookup() and 
lookup_key()
      MEDIUM: stick-table: make stktable_get_entry() look up under a read lock
      MEDIUM: stick-table: do not take a lock to update t->current anymore.
      MEDIUM: stick-table: make stktable_set_entry() look up under a read lock
      MEDIUM: stick-table: requeue the expiration task out of the exclusive lock
      MINOR: stick-table: split stktable_store() between key and requeue
      MEDIUM: stick-table: always use atomic ops to requeue the table's task
      MEDIUM: stick-table: requeue the wakeup task out of the write lock
      BUG/MINOR: server: make sure "show servers state" hides private bits
      MINOR: checks: use the lighter PRNG for spread checks
      MEDIUM: checks: spread the checks load over random threads
      MEDIUM: quic: respect the threads assigned to a bind line

---

Reply via email to