Hi,

HAProxy 2.6-dev3 was released on 2022/03/11. It added 119 new commits
after version 2.6-dev2.

A few issues (~25) were fixed at various places in the code. A few of
them will probably warrant new stable versions next week, we'll see; it
was found that there's a risk of connection leaks on TCP backends which
take time to connect if the client gives up before the end. This could
happen with a server whose network access is flaky for example.

  - dynamic servers got a small change. The syntax was chosen very close to
    the one from the config file but this raised some concerns about long-
    term issues since some options are implicit (or work in combination),
    and while that's inevitable in a two-decade human-readable file format,
    it's not a good idea at all to maintain such problems with commands
    that will mostly be set by programs. Typically, setting SSL used to
    implicitly turn on SSL for health checks, and the "addr" and "port"
    values would implicitly apply both to "check" and "agent". It will
    be impossible for a program to try to replicate the internal logic
    to adjust such settings, so we preferred to make all of them explicit
    (essentially "ssl" vs "check" part above, as the rest was already
    correct). The "experimental" status of the option was dropped and
    the examples updated in the doc, as the mechanism should be stable
    now.

  - the HTTP client could loop forever in Lua when reusing an existing
    client instance for a second POST request due to a transfer counter
    that was not properly reset

  - usual bunch of QUIC updates, this time mostly focusing on the outgoing
    traffic and overall correctness of internal representation. I've been
    pleased to see that the interop tests start to regularly report full-
    green status with certain client implementations. It's a bit random due
    to loss/corruption tests, and the fact that it's all green doesn't mean
    it's prod-ready yet, but a good indication that things are progressing
    at a pace that's encouraging for 2.6.

  - a new global "no-memory-trimming" setting was added; we've seen a
    report of a user running with tens of GB of RAM and for whom the call
    to malloc_trim() on reload took so long that it managed to trigger
    the watchdog. That was a good enough indication that malloc_trim()
    may hurt more than it helps on certain setups, hence the new option
    to turn it off.
    
  - some debugging assertions were added at various places in the code
    to try to catch certain classes of bugs more easily. Now the
    DEBUG_STRICT macro supports a new value (2) to enable checks in the
    hot path, which means that value 1 now only enables those which do
    not have any measurable performance impact. As such it was turned on
    by default, hoping to stop certain bugs earlier. The work of adding
    more of these at sensitive places continues.

  - a tiny UDP proxy dedicated to fault injection was added to help
    testing QUIC. It could be reused for DNS and syslog. For now it
    only reorders/loses/duplicates packets, which is sufficient for
    datagram-oriented services. More options should be added (truncation
    and bit flipping), and if some are interested in having fun playing
    with that, they're welcome to have a look.

  - some core cleanups that also aim at limiting the risk of introducing
    new bugs (e.g. switch to struct ist for a number of config strings).

  - a new pair of sample fetch functions "last_rule_file" and
    "last_rule_line" which will locate in the config file which tcp/http
    rule was the last one to give a final verdict (accept/deny/redirect
    etc). They can be added to logs via log-format to help figure which
    rule is causing a 403 for example. If there's interest for this, it
    should be backportable to 2.5.

  - the dark mode of the "socket" rows in the stats page was finally fixed!

  - usual lot of build cleanups, CI and doc updates

In addition I'm planning on performing a small change soon in the way
the timeouts are handled in H2, and depending on the difficulty, it may
or may not be backported: Christian described me a situation where an
H2 connection that only gets control traffic will not timeout (this may
be between applications using PING frames for a heartbeat for example).
In this case when there's no stream, only "show fd" will show what is
happening but the timeouts cannot be exploited to force such a connection
to be closed after some time as only client/server are used and there's
periodic traffic. After discussing with him and Christopher, I got
convinced that this is *exactly* the same as what we do in HTTP/1 using
"timeout http-request" and "timeout http-keep-alive". Indeed, the former
is used to indicate how long we'll wait for a full request on a new
connection, and how long we'll let a client send a full request once
a new one is started. The later indicates how long we keep the connection
open after a response was sent, waiting for a new request.

And it totally makes sense to have these in H2. Indeed, some users might
want to close pre-connect early because that takes lots of resources, but
probably don't want to shrink the client timeout. Others might want to
allow a reasonable time for the first request but not after the first
response as they know that most connections perform only one request.
While requests in H2 are sent in parallel, the activity graph of a client
is exactly the same as with H1: periods of activity with 1 or more stream
(only one with H1) and idle periods during which the connection is not
interesting anymore for the client.

The doc from 1.8 states that the http-keep-alive timeout is not used in
H2, to allow users to keep a low keep-alive timeout in H1 and a long one
in H2. But after a second thought, this is absurd and mostly comes from
a technical limitation from 1.8 (and inexperience with H2 back then).
When you configure such a timeout it's in order to preserve precious
resources (connections, memory, file descriptors), and the protocol is
irrelevant here. The proof is that nowadays users do not really decide
what protocol they receive, and it would be nice that the behavior of
a given option is consistent between all protocols.

So unless anyone has extremely good insights about this or wants to
share some return of experience from the field about similar issues,
I'm going to work on this next week, trying to make this backportable
to 2.5 at least.

Another thing I want to do is that we share among the french dev team
a local list of future small items to work on that remained internal as
it's written in french with little description, but that I want to add
to the issue tracker as feature requests with a bit more description;
it's happened quite a few times already that someone asked for things
that I remembered discussing and that were instead in our internal todo
list. As this reached the point of extreme irritation to me, I'll work
on this painful task as time permits but with a high priority in order
to kill that distracting and partially duplicate list.

OK too long chatting already, usual links below, now you know the song,
have a nice week-end :-)

Please find the usual URLs below :
   Site index       : http://www.haproxy.org/
   Discourse        : http://discourse.haproxy.org/
   Slack channel    : https://slack.haproxy.org/
   Issue tracker    : https://github.com/haproxy/haproxy/issues
   Wiki             : https://github.com/haproxy/wiki/wiki
   Sources          : http://www.haproxy.org/download/2.6/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.6/src/CHANGELOG
   Cyril's HTML doc : http://cbonte.github.io/haproxy-dconv/

Willy
---
Complete changelog :
Amaury Denoyelle (22):
      CLEANUP: adjust indentation in bidir STREAM handling function
      MINOR: quic: simplify copy of STREAM frames to RX buffer
      MINOR: quic: handle partially received buffered stream frame
      MINOR: mux-quic: define flag for last received frame
      BUG/MINOR: quic: support FIN on Rx-buffered STREAM frames
      MEDIUM: quic: rearchitecture Rx path for bidirectional STREAM frames
      BUG/MINOR: quic: fix segfault on CC if mux uninitialized
      CLEANUP: quic: complete ABORT_NOW with a TODO comment
      MINOR: mux-quic: refactor transport parameters init
      MINOR: mux-quic: complete functions to detect stream type
      MINOR: mux-quic: define new unions for flow-control fields
      MEDIUM: mux-quic: use direct send transport API for STREAMs
      MINOR: mux-quic: retry send opportunistically for remaining frames
      MEDIUM: mux-quic: implement MAX_STREAMS emission for bidir streams
      BUG/MEDIUM: quic: do not drop packet on duplicate stream/decoding error
      MINOR: mux-quic: prevent push frame for unidir streams
      MINOR: mux-quic: improve opportunistic retry sending for STREAM frames
      MINOR: quic: implement sending confirmation
      MEDIUM: mux-quic: improve bidir STREAM frames sending
      MEDIUM: check: do not auto configure SSL/PROXY for dynamic servers
      REGTESTS: server: test SSL/PROXY with checks for dynamic servers
      MEDIUM: server: remove experimental-mode for dynamic servers

Christopher Faulet (21):
      MINOR: conn-stream: Improve API to have safe/unsafe accessors
      MEDIUM: tree-wide: Use unsafe conn-stream API when it is relevant
      CLEANUP: stream-int: Make si_cs_send() function static
      REORG: stream-int: Uninline si_sync_recv() and make si_cs_recv() private
      BUG/MEDIUM: mux-fcgi: Don't rely on SI src/dst addresses for FCGI 
health-checks
      BUG/MEDIUM: htx: Fix a possible null derefs in htx_xfer_blks()
      REGTESTS: fix the race conditions in normalize_uri.vtc
      DEBUG: stream-int: Fix BUG_ON used to test appctx in si_applet_ops 
callbacks
      REGTESTS: fix the race conditions in secure_memcmp.vtc
      CLEANUP: stream: Remove useless tests on conn-stream in stream_dump()
      BUG/MINOR: httpclient: Set conn-stream/channel EOI flags at the end of 
request
      BUG/MINOR: hlua: Set conn-stream/channel EOI flags at the end of request
      BUG/MINOR: stats: Set conn-stream/channel EOI flags at the end of request
      BUG/MINOR: cache: Set conn-stream/channel EOI flags at the end of request
      BUG/MINOR: promex: Set conn-stream/channel EOI flags at the end of request
      BUG/MEDIUM: stream: Use the front analyzers for new listener-less streams
      DEBUG: cache: Update underlying buffer when loading HTX message in cache 
applet
      BUG/MEDIUM: mcli: Properly handle errors and timeouts during reponse 
processing
      DEBUG: stream: Add the missing descriptions for stream trace events
      DEBUG: stream: Fix stream trace message to print response buffer state
      BUG/MAJOR: mux-pt: Always destroy the backend connection on detach

David Carlier (2):
      BUILD: fix kFreeBSD build.
      BUILD: fix recent build breakage of freebsd caused by kFreeBSD build fix

Frédéric Lécaille (29):
      MINOR: quic: Ensure PTO timer is not set in the past
      MINOR: quic: Post handshake I/O callback switching
      MINOR: quic: Drop the packets of discarded packet number spaces
      CLEANUP: quic: Useless tests in qc_try_rm_hp()
      CLEANUP: quic: Indentation fix in qc_prep_pkts()
      MINOR: quic: Assemble QUIC TLS flags at the same level
      MINOR: quic: qc_prep_app_pkts() implementation
      MINOR: quic: Send short packet from a frame list
      MINOR: quic: Make qc_build_frms() build ack-eliciting frames from a list
      MINOR: quic: Export qc_send_app_pkts()
      MINOR: quic: Retry on qc_build_pkt() failures
      BUG/MINOR: quic: Missing recovery start timer reset
      CLEANUP: quic: Remove QUIC path manipulations out of the congestion 
controller
      MINOR: quic: Add a "slow start" callback to congestion controller
      MINOR: quic: Persistent congestion detection outside of controllers
      CLEANUP: quic: Remove useless definitions from quic_cc_event struct
      BUG/MINOR: quic: Confusion betwen "in_flight" and "prep_in_flight" in 
quic_path_prep_data()
      MINOR: quic: More precise window update calculation
      CLEANUP: quic: Remove window redundant variable from NewReno algorithm 
state struct
      MINOR: quic: Add quic_max_int_by_size() function
      BUG/MAJOR: quic: Wrong quic_max_available_room() returned value
      MINOR: quic: Add max_idle_timeout advertisement handling
      MEDIUM: quic: Remove the QUIC connection reference counter
      BUG/MINOR: quic: ACK_REQUIRED and ACK_RECEIVED flag collision
      BUG/MINOR: quic: Missing check when setting the anti-amplification limit 
as reached
      MINOR: quic: Add a function to compute the current PTO
      MEDIUM: quic: Implement the idle timeout feature
      BUG/MEDIUM: quic: qc_prep_app_pkts() retries on qc_build_pkt() failures
      CLEANUP: quic: Comments fix for qc_prep_(app)pkts() functions

Julien Thomas (1):
      BUILD: ssl: another build warning on LIBRESSL_VERSION_NUMBER

Marno Krahmer (1):
      MINOR: stats: Add dark mode support for socket rows

Tim Duesterhus (9):
      CLEANUP: connection: Indicate unreachability to the compiler in 
conn_recv_proxy
      MINOR: connection: Transform safety check in PROXYv2 parsing into BUG_ON()
      MINOR: queue: Replace if() + abort() with BUG_ON()
      MINOR: proxy: Store monitor_uri as a `struct ist`
      MINOR: proxy: Store fwdfor_hdr_name as a `struct ist`
      MINOR: proxy: Store orgto_hdr_name as a `struct ist`
      MEDIUM: proxy: Store server_id_hdr_name as a `struct ist`
      CLEANUP: fcgi: Replace memcpy() on ist by istcat()
      CLEANUP: fcgi: Use `istadv()` in `fcgi_strm_send_params`

William Lallemand (3):
      BUG/MEDIUM: httpclient/lua: infinite appctx loop with POST
      BUG/MINOR: add missing modes in proxy_mode_str()
      BUG/MINOR: cli: shows correct mode in "show sess"

Willy Tarreau (31):
      DEBUG: rename WARN_ON_ONCE() to CHECK_IF()
      DEBUG: improve BUG_ON output message accuracy
      DEBUG: implement 4 levels of choices between warn and crash.
      DEBUG: add two new macros to enable debugging in hot paths
      DEBUG: buf: replace some sensitive BUG_ON() with BUG_ON_HOT()
      DEBUG: buf: add BUG_ON_HOT() to most buffer management functions
      MINOR: channel: don't use co_set_data() to decrement output
      DEBUG: channel: add consistency checks using BUG_ON_HOT() in some key 
functions
      BUILD: debug: fix build warning on older compilers around 
DEBUG_STRICT_ACTION
      DOC: install: it's DEBUG_CFLAGS, not DEBUG, which is set to -g
      DOC: install: describe the DEP variable
      DOC: install: describe how to choose options used in the DEBUG variable
      BUILD: conn_stream: avoid null-deref warnings on gcc 6
      BUILD: connection: do not declare register_mux_proto() inline
      BUILD: http_rules: do not declare http_*_keywords_registre() inline
      BUILD: trace: do not declare trace_registre_source() inline
      BUILD: tcpcheck: do not declare tcp_check_keywords_register() inline
      DEBUG: reduce the footprint of BUG_ON() calls
      BUG/MINOR: pool: always align pool_heads to 64 bytes
      DEV: udp: add a tiny UDP proxy for testing
      DEV: udp: implement pseudo-random reordering/loss
      DEV: udp: add an optional argument to set the prng seed
      BUG/MEDIUM: pools: fix ha_free() on area in the process of being freed
      CLEANUP: tree-wide: remove a few rare non-ASCII chars
      CI: coverity: simplify debugging options
      MINOR: pools: add a new global option "no-memory-trimming"
      DOC: sample fetch methods: move distcc_* to the right locations
      MINOR: rules: record the last http/tcp rule that gave a final verdict
      MINOR: stream: add "last_rule_file" and "last_rule_line" samples
      BUG/MINOR: session: fix theoretical risk of memleak in session_accept_fd()
      BUG/MINOR: buffer: fix debugging condition in b_peek_varint()

---

Reply via email to