Hi,

HAProxy 2.7-dev2 was released on 2022/07/16. It added 176 new commits
after version 2.7-dev1.

This version essentially brings progress in two areas:
  - QUIC/h3: improved management of connection closure. We now send GOAWAY
    H3 frames along with CONNECTION_CLOSE QUIC frames on connection timeout
    in order to improve the situation with browsers that could hang after
    an idle timeout. The QUIC Rx buffer was also increased to avoid the
    risk of dropping packets on Rx, and the packet processing latency was
    shortened, which should both further reduce the loss rate and increase
    performance.

  - threads: the scheduler, listeners, file descriptors, watchdog and
    thread debugger have now be made thread-group aware, which allows to
    lift the thread-group limit to 64 (set to 16 by default), and the
    maximum total number of threads that is limited to 64 per group may
    be increased accordingly to 4096 (not yet changed by default though).
    Note that a lot of work remains needed here for efficient operation.
    Pools, load balancing, server queues need to be made per-group. But
    in this state, the contention caused by shared data significantly
    reduces already: I could observe a performance improvement of 40-45%
    on a 24-core AMD processor made of 8 clusters of 3 cores where
    previous versions suffer from the cache latency.

The rest of the changes were fixes for a wide variety of issues, that
will be backported, probably next week.

A lot of tests were run and shortcomings addressed, but regressions are
still possible regarding the change in threads, especially if groups are
enabled (they're never enabled by default). As usual we're interested in
any feedback.

Please find the usual URLs below :
   Site index       : http://www.haproxy.org/
   Documentation    : http://docs.haproxy.org/
   Wiki             : https://github.com/haproxy/wiki/wiki
   Discourse        : http://discourse.haproxy.org/
   Slack channel    : https://slack.haproxy.org/
   Issue tracker    : https://github.com/haproxy/haproxy/issues
   Sources          : http://www.haproxy.org/download/2.7/src/
   Git repository   : http://git.haproxy.org/git/haproxy.git/
   Git Web browsing : http://git.haproxy.org/?p=haproxy.git
   Changelog        : http://www.haproxy.org/download/2.7/src/CHANGELOG
   Pending bugs     : http://www.haproxy.org/l/pending-bugs
   Reviewed bugs    : http://www.haproxy.org/l/reviewed-bugs
   Code reports     : http://www.haproxy.org/l/code-reports
   Latest builds    : http://www.haproxy.org/l/dev-packages

Willy
---
Complete changelog :
Amaury Denoyelle (35):
      BUG/MINOR: qpack: fix build with QPACK_DEBUG
      MINOR: h3: handle errors on HEADERS parsing/QPACK decoding
      BUG/MINOR: qpack: abort on dynamic index field line decoding
      MINOR: qpack: properly handle invalid dynamic table references
      CLEANUP: mux-quic: adjust comment on qcs_consume()
      MINOR: ncbuf: implement ncb_is_fragmented()
      BUG/MINOR: mux-quic: do not signal FIN if gap in buffer
      CLEANUP: mux-quic: do not export qc_get_ncbuf
      REORG: mux-quic: reorganize flow-control fields
      MINOR: mux-quic: implement accessor for sedesc
      MEDIUM: mux-quic: refactor streams opening
      MINOR: mux-quic: rename qcs flag FIN_RECV to SIZE_KNOWN
      MINOR: mux-quic: emit FINAL_SIZE_ERROR on invalid STREAM size
      BUG/MEDIUM: mux-quic: fix server chunked encoding response
      REORG: mux-quic: rename stream initialization function
      MINOR: mux-quic: rename stream purge function
      MINOR: mux-quic: add traces on frame parsing functions
      MINOR: mux-quic: implement qcs_alert()
      MINOR: mux-quic: filter send/receive-only streams on frame parsing
      MINOR: mux-quic: do not ack STREAM frames on unrecoverable error
      MINOR: mux-quic: support stream opening via MAX_STREAM_DATA
      MINOR: mux-quic: define basic stream states
      MINOR: mux-quic: use stream states to mark as detached
      MEDIUM: mux-quic: implement RESET_STREAM emission
      MEDIUM: mux-quic: implement STOP_SENDING handling
      BUG/MINOR: quic: fix closing state on NO_ERROR code sent
      CLEANUP: quic: clean up include on quic_frame-t.h
      MINOR: quic: define a generic QUIC error type
      MINOR: mux-quic: support app graceful shutdown
      MINOR: mux-quic/h3: prepare CONNECTION_CLOSE on release
      MEDIUM: quic: send CONNECTION_CLOSE on released MUX
      CLEANUP: mux-quic: move qc_release()
      MINOR: mux-quic: send one last time before release
      MINOR: h3: store control stream in h3c
      MINOR: h3: implement graceful shutdown with GOAWAY

Christian Ruppert (1):
      BUILD: Makefile: Add Lua 5.4 autodetect

Christopher Faulet (13):
      CLEANUP: bwlim: Set pointers to NULL when memory is released
      BUG/MINOR: http-check: Preserve headers if not redefined by an implicit 
rule
      BUG/MINOR: http-act: Properly generate 103 responses when several rules 
are used
      BUG/MINOR: http-htx: Fix scheme based normalization for URIs wih userinfo
      MINOR: http: Add function to get port part of a host
      MINOR: http: Add function to detect default port
      BUG/MEDIUM: h1: Improve authority validation for CONNCET request
      MINOR: http-htx: Use new HTTP functions for the scheme based normalization
      BUG/MEDIUM: http-fetch: Don't fetch the method if there is no stream
      REGTEESTS: filters: Fix CONNECT request in random-forwarding script
      BUG/MINOR: mux-h1: Be sure to commit htx changes in the demux buffer
      BUG/MEDIUM: http-ana: Don't wait to have an empty buf to switch in TUNNEL 
state
      BUG/MEDIUM: mux-h1: Handle connection error after a synchronous send

Emeric Brun (3):
      MINOR: fd: add a new FD_DISOWN flag to prevent from closing a deleted FD
      BUG/MEDIUM: ssl/fd: unexpected fd close using async engine
      MINOR: fd: Add BUG_ON checks on fd_insert()

Frédéric Lécaille (7):
      MINOR: task: Add tasklet_wakeup_after()
      BUG/MINOR: quic: Dropped packets not counted (with RX buffers full)
      MINOR: quic: Add new stats counter to diagnose RX buffer overrun
      MINOR: quic: Duplicated QUIC_RX_BUFSZ definition
      MINOR: quic: Improvements for the datagrams receipt
      CLEANUP: h2: Typo fix in h2_unsubcribe() traces
      MINOR: quic: Increase the QUIC connections RX buffer size (upto 64Kb)

Ilya Shipitsin (1):
      CI: re-enable gcc asan builds

William Lallemand (4):
      MEDIUM: mworker: set the iocb of the socketpair without using fd_insert()
      CLEANUP: mworker: rename mworker_pipe to mworker_sockpair
      BUG/MINOR: peers: fix possible NULL dereferences at config parsing
      MEDIUM: mworker/systemd: send STATUS over sd_notify

Willy Tarreau (112):
      MINOR: tinfo: make tid temporarily still reflect global ID
      CLEANUP: config: remove unused proc_mask()
      MINOR: debug: remove mask support from "debug dev sched"
      MEDIUM: task: add and preset a thread ID in the task struct
      MEDIUM: task/debug: move the ->thread_mask integrity checks to ->tid
      MAJOR: task: use t->tid instead of ffsl(t->thread_mask) to take the 
thread ID
      MAJOR: task: replace t->thread_mask with 1<<t->tid when thread mask is 
needed
      CLEANUP: task: remove thread_mask from the struct task
      MEDIUM: applet: only keep appctx_new_*() and drop appctx_new()
      MEDIUM: task: only keep task_new_*() and drop task_new()
      MINOR: applet: always use task_new_on() on applet creation
      MEDIUM: task: remove TASK_SHARED_WQ and only use t->tid
      MINOR: task: replace task_set_affinity() with task_set_thread()
      CLEANUP: task: remove the unused task_unlink_rq()
      CLEANUP: task: remove the now unused TASK_GLOBAL flag
      MINOR: task: make rqueue_ticks atomic
      MEDIUM: task: move the shared runqueue to one per thread
      MEDIUM: task: replace the global rq_lock with a per-rq one
      MINOR: task: remove grq_total and use rq_total instead
      MINOR: task: replace global_tasks_mask with a check for tree's emptiness
      MEDIUM: task: use regular eb32 trees for the run queues
      MEDIUM: queue: revert to regular inter-task wakeups
      MINOR: thread: make wake_thread() take care of the sleeping threads mask
      MINOR: thread: move the flags to the shared cache line
      MINOR: thread: only use atomic ops to touch the flags
      MINOR: poller: centralize poll return handling
      MEDIUM: polling: make update_fd_polling() not care about sleeping threads
      MINOR: poller: update_fd_polling: wake a random other thread
      MEDIUM: thread: add a new per-thread flag TH_FL_NOTIFIED to remember 
wakeups
      MEDIUM: tasks/fd: replace sleeping_thread_mask with a TH_FL_SLEEPING flag
      MINOR: tinfo: add the tgid to the thread_info struct
      MINOR: tinfo: replace the tgid with tgid_bit in tgroup_info
      MINOR: tinfo: add the mask of enabled threads in each group
      MINOR: debug: use ltid_bit in ha_thread_dump()
      MINOR: wdt: use ltid_bit in wdt_handler()
      MINOR: clock: use ltid_bit in clock_report_idle()
      MINOR: thread: use ltid_bit in ha_tkillall()
      MINOR: thread: add a new all_tgroups_mask variable to know about active 
tgroups
      CLEANUP: thread: remove thread_sync_release() and thread_sync_mask
      MEDIUM: tinfo: add a dynamic thread-group context
      MEDIUM: thread: make stopping_threads per-group and add stopping_tgroups
      MAJOR: threads: change thread_isolate to support inter-group 
synchronization
      MINOR: thread: add is_thread_harmless() to know if a thread already is 
harmless
      MINOR: debug: mark oneself harmless while waiting for threads to finish
      MINOR: wdt: do not rely on threads_to_dump anymore
      MEDIUM: debug: make the thread dumper not rely on a thread mask anymore
      BUILD: debug: fix build issue on clang with previous commit
      BUILD: debug: re-export thread_dump_state
      BUG/MEDIUM: threads: fix incorrect thread group being used on soft-stop
      BUG/MEDIUM: thread: check stopping thread against local bit and not 
global one
      MINOR: proxy: use tg->threads_enabled in hard_stop() to detect stopped 
threads
      BUG/MINOR: peers/config: always fill the bind_conf's argument
      BUG/MEDIUM: peers/config: properly set the thread mask
      BUG/MEDIUM: thread: mask stopping_threads with threads_enabled when 
checking it
      CLEANUP: thread: also remove a thread's bit from stopping_threads on stop
      MEDIUM: epoll: don't synchronously delete migrated FDs
      BUILD: debug: silence warning on gcc-5
      BUILD: http: silence an uninitialized warning affecting gcc-5
      BUG/MEDIUM: debug: fix possible hang when multiple threads dump at once
      BUG/MINOR: threads: produce correct global mask for tgroup > 1
      BUG/MEDIUM: cli/threads: make "show threads" more robust on applets
      BUG/MINOR: thread: use the correct thread's group in ha_tkillall()
      BUG/MINOR: debug: enter ha_panic() only once
      BUG/MEDIUM: debug: fix parallel thread dumps again
      MINOR: cli/streams: show a stream's tgid next to its thread ID
      DEBUG: cli: add a new "debug dev deadlock" expert command
      MINOR: cli/activity: add a thread number argument to "show activity"
      CLEANUP: applet: remove the obsolete command context from the appctx
      MEDIUM: config: remove deprecated "bind-process" directives from frontends
      MEDIUM: config: remove the "process" keyword on "bind" lines
      MINOR: listener/config: make "thread" always support up to LONGBITS
      CLEANUP: fd: get rid of the __GET_{NEXT,PREV} macros
      MEDIUM: debug/threads: make the lock debugging take tgroups into account
      MEDIUM: proto: stop protocols under thread isolation during soft stop
      MEDIUM: poller: program the update in fd_update_events() for a migrated FD
      MEDIUM: poller: disable thread-groups for poll() and select()
      MINOR: thread: remove MAX_THREADS limitation
      MEDIUM: cpu-map: replace the process number with the thread group number
      MINOR: mworker/threads: limit the mworker sockets to group 1
      MINOR: cli/threads: always bind CLI to thread group 1
      MINOR: fd/thread: get rid of thread_mask()
      MEDIUM: task/thread: move the task shared wait queues per thread group
      MINOR: task: move the niced_tasks counter to the thread group context
      DOC: design: add some thoughts about how to handle the update_list
      MEDIUM: conn: make conn_backend_get always scan the same group
      MAJOR: fd: remove pending updates upon real close
      MEDIUM: fd/poller: make the update-list per-group
      MINOR: fd: delete unused updates on close()
      MINOR: fd: make fd_insert() apply the thread mask itself
      MEDIUM: fd: add the tgid to the fd and pass it to fd_insert()
      MINOR: cli/fd: show fd's tgid and refcount in "show fd"
      MINOR: fd: add functions to manipulate the FD's tgid
      MINOR: fd: add fd_get_running() to atomically return the running mask
      MAJOR: fd: grab the tgid before manipulating running
      MEDIUM: fd/poller: turn polled_mask to group-local IDs
      MEDIUM: fd/poller: turn update_mask to group-local IDs
      MEDIUM: fd/poller: turn running_mask to group-local IDs
      MINOR: fd: make fd_clr_running() return the previous value instead
      MEDIUM: fd: make thread_mask now represent group-local IDs
      MEDIUM: fd: make fd_insert() take local thread masks
      MEDIUM: fd: make fd_insert/fd_delete atomically update fd.tgid
      MEDIUM: fd: quit fd_update_events() when FD is closed
      MEDIUM: thread: change thread_resolve_group_mask() to return group-local 
values
      MEDIUM: listener: switch bind_thread from global to group-local
      MINOR: fd: add fd_reregister_all() to deal with boot-time FDs
      MEDIUM: fd: support stopping FDs during starting
      MAJOR: pollers: rely on fd_reregister_all() at boot time
      MAJOR: poller: only touch/inspect the update_mask under tgid protection
      MEDIUM: fd: support broadcasting updates for foreign groups in 
updt_fd_polling
      CLEANUP: threads: remove the now unused all_threads_mask and tid_bit
      MINOR: config: change default MAX_TGROUPS to 16
      BUG/MEDIUM: tools: avoid calling dlsym() in static builds

---

Reply via email to