Hi,

HAProxy 3.3-dev4 was released on 2025/07/26. It added 98 new commits
after version 3.3-dev3.

This one contains an average number of fixes (27) sprayed over mostly
quic/h3, lua, acme, applets. Nothing scary here.

For the rest:
  - all remaining applets have been reworked to use their own buffers
    according to the modern API and not share them with the stream's
    channel anymore. This touches DNS, http-client, Lua, logs, peers,
    Prometheus. If you happen to maintain your own patches to add your own
    applets and have not converted them, you may see a warning indicating
    they're working in legacy mode.

  - configs involving many proxies will use much less memory, as the
    storage for the "default-server" settings was now extracted from
    the proxy struct and is released after the section is parsed (~4kB
    saved per proxy)

  - some configs using lots of servers with a "track" keyword should now
    start faster. Ditto for "use-server". It happens that these mechanisms
    were still using the outdated O(N) server list traversal instead of
    the tree to look up the designated server's name.

  - SSL traces now contain the ciphers, curves and sigalgs when known.

  - QUIC on the backend side now supports connection reuse, but only in
    private mode for now (i.e. no sharing yet between multiple front
    connections)

  - debugging: "show dev" now reports the thread->CPU bindings, and
    haproxy+OS versions are now reported in panic dumps to help sort
    out deployment issues and confusion that sometimes stems from using
    a different binary than believed in containers. ACME is also listed
    in the output of haproxy -vv's feature list.

  - stats: a performance degradation caused by one extra pointer dereference
    was observed since the introduction of counters sharding. It was now
    addressed and the original performance is recovered (and even slightly
    surpassed)

  - the HTTP client will now try to be nicer to servers by sending both
    headers and body at once when available.

Then there are some cleanups, mostly in the server code, developers doc
and extra tools.

Overall there's nothing absolutely amazing nor scary here. The only
slightly sensitive area are the applets, so if you'd observe new issues
with the ones mentioned above, as usual, please do report!

On a side note, the site is now being crawled by AI bots a lot, and the
access to the dynamic git stuff induces high CPU and I/O usage that could
even cause some regular git access to fail. We've mitigated the effects
by better adjusting the queue management so that git clone/pull always
has priority and for now it's OK. But this also means that visiting the
gitweb pages can occasionally experience long delays (I've seen up to
more than 300 concurrent requests there, as if there were so many people
interested in suddenly reading some objects!). I don't want to go towards
more defensive measures for now, but if you're experiencing difficulties
to access some resource, just please let me know so that we can figure
better solutions.

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
   Q&A from devs    : https://github.com/orgs/haproxy/discussions
   Sources          : https://www.haproxy.org/download/3.3/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/3.3/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 (20):
      BUG/MEDIUM: h3: do not overwrite interim with final response
      BUG/MINOR: h3: properly realloc buffer after interim response encoding
      BUG/MINOR: h3: ensure that invalid status code are not encoded (FE side)
      MINOR: qmux: change API for snd_buf FIN transmission
      BUG/MEDIUM: h3: handle interim response properly on FE side
      BUG/MINOR: h3: properly handle interim response on BE side
      MINOR: h3: remove unused outbuf in h3_resp_headers_send()
      BUG/MINOR: hq-interop: fix FIN transmission
      MINOR: h3: use smallbuf for request header emission
      MINOR: h3: add traces to h3_req_headers_send()
      BUG/MINOR: h3: fix uninitialized value in h3_req_headers_send()
      BUG/MINOR mux-quic: apply correctly timeout on output pending data
      BUG/MINOR: mux-quic: ensure close-spread-time is properly applied
      MINOR: mux-quic: refactor timeout code
      MINOR: mux-quic: correctly implement backend timeout
      MINOR: mux-quic: disable glitch on backend side
      MINOR: mux-quic: store session in QCS instance
      MEDIUM: mux-quic: implement be connection reuse
      MINOR: mux-quic: do not reuse connection if app already shut
      MEDIUM: mux-quic: support backend private connection

Aurelien DARRAGON (6):
      BUG/MINOR: logs: fix log-steps extra log origins selection
      MINOR: log: explicitly ignore "log-steps" on backends
      BUG/MEDIUM: logs: fix sess_build_logline_orig() recursion with options
      MEDIUM: stats: avoid 1 indirection by storing the shared stats directly 
in counters struct
      CLEANUP: peers: remove unused peer_session_target()
      OPTIM: stats: store fast sharded counters pointers at session and stream 
level

Ben Kallus (2):
      CLEANUP: compiler: prefer char * over void * for pointer arithmetic
      CLEANUP: include: replace hand-rolled offsetof to avoid UB

Christopher Faulet (29):
      BUG/MINOR: applet: Don't trigger BUG_ON if the tid is not on appctx init
      BUG/MINOR: hlua: Skip headers when a receive is performed on an HTTP 
applet
      BUG/MEDIUM: applet: State inbuf is no longer full if input data are 
skipped
      BUG/MEDIUM: stconn: Fix conditions to know an applet can get data from 
stream
      BUG/MINOR: applet: Fix applet_getword() to not return one extra byte
      BUG/MEDIUM: Remove sync sends from streams to applets
      MINOR: applet: Add HTX versions for applet_input_data() and 
applet_output_room()
      MINOR: applet: Improve applet API to take care of inbuf/outbuf alloc 
failures
      MEDIUM: hlua: Update the tcp applet to use its own buffers
      MINOR: hlua: Fill the request array on the first HTTP applet run
      MINOR: hlua: Use the buffer instead of the HTTP message to get HTTP 
headers
      MEDIUM: hlua: Update the http applet to use its own buffers
      BUG/MEDIUM: hlua: Report to SC when data were consumed on a lua socket
      BUG/MEDIUM: hlua: Report to SC when output data are blocked on a lua 
socket
      MEDIUM: hlua: Update the socket applet to use its own buffers
      BUG/MEDIUM: dns: Reset reconnect tempo when connection is finally 
established
      MEDIUM: dns: Update the dns_session applet to use its own buffers
      CLEANUP: http-client: Remove useless indentation when sending request body
      MINOR: http-client: Try to send request body with headers if possible
      MINOR: http-client: Trigger an error if first response block isn't a 
start-line
      BUG/MINOR: httpclient-cli: Don't try to dump raw headers in HTX mode
      MINOR: httpclient-cli: Reset httpclient HTX buffer instead of removing 
blocks
      MEDIUM: http-client: Update the http-client applet to use its own buffers
      MEDIUM: log: Update the log applet to use its own buffers
      MEDIUM: sink: Update the sink applets to use their own buffers
      MEDIUM: peers: Update the peer applet to use its own buffers
      MEDIUM: promex: Update the promex applet to use their own buffers
      MINOR: applet: Add support for flags on applets with a flag about the new 
API
      MEDIUM: applet: Emit a warning when a legacy applet is spawned

Frederic Lecaille (4):
      BUG/MINOR: quic: Wrong source address use on FreeBSD
      MINOR: quic: Get rid of qc_is_listener()
      BUG/MEDIUM: quic-be: CC buffer released from wrong pool
      MINOR: quic: Remove pool_head_quic_be_cc_buf pool

Ilia Shipitsin (1):
      CLEANUP: acme: fix wrong spelling of "resources"

Olivier Houchard (1):
      BUG/MEDIUM: threads: Disable the workaround to load libgcc_s on macOS

Remi Tricot-Le Breton (6):
      MINOR: ssl: Add ciphers in ssl traces
      MINOR: ssl: Add curve id to curve name table and mapping functions
      MINOR: ssl: Add curves in ssl traces
      MINOR: ssl: Dump ciphers and sigalgs details in trace with 'advanced' 
verbosity
      MINOR: ssl: Remove ClientHello specific traces if 
!HAVE_SSL_CLIENT_HELLO_CB
      CLEANUP: ssl: Use only NIDs in curve name to id table

Valentine Krasnobaeva (6):
      BUG/MINOR: halog: exit with error when some output filters are set 
simultaneosly
      MINOR: cpu-topo: split cpu_dump_topology() to show its summary in show dev
      MINOR: cpu-topo: write thread-cpu bindings into trash buffer
      MINOR: debug: align output style of debug_parse_cli_show_dev with 
cpu_dump_topology
      MINOR: debug: add thread-cpu bindings info in 'show dev' output
      BUILD: debug: add missed guard USE_CPU_AFFINITY to show cpu bindings

William Lallemand (4):
      BUG/MEDIUM: acme: use POST-as-GET instead of GET for resources
      MINOR: acme: remove acme_req_auth() and use acme_post_as_get() instead
      BUG/MINOR: acme: allow "processing" in challenge requests
      MINOR: acme: add ACME to the haproxy -vv feature list

Willy Tarreau (19):
      CLEANUP: server: do not check for duplicates anymore in findserver()
      REORG: server: move findserver() from proxy.c to server.c
      MINOR: server: use the tree to look up the server name in findserver()
      CLEANUP: server: rename server_find_by_name() to server_find()
      CLEANUP: server: rename findserver() to server_find_by_name()
      CLEANUP: server: use server_find_by_name() where relevant
      CLEANUP: cfgparse: lookup proxy ID using existing functions
      CLEANUP: stream: lookup server ID using standard functions
      CLEANUP: server: simplify server_find_by_id()
      CLEANUP: server: add server_find_by_addr()
      CLEANUP: stream: use server_find_by_addr() in sticking_rule_find_target()
      CLEANUP: server: be sure never to compare src against a non-existing 
defsrv
      MEDIUM: proxy: take the defsrv out of the struct proxy
      MINOR: proxy: add checks for defsrv's validity
      MEDIUM: proxy: no longer allocate the default-server entry by default
      MEDIUM: proxy: register a post-section cleanup function
      MINOR: debug: report haproxy and operating system info in panic dumps
      DEV: gdb: add a memprofile decoder to the debug tools
      DOC: connection: explain the rules for idle/safe/avail connections

---


Reply via email to