QUIC MUX emission has been optimized recently by recycling STREAM frames list between emission cycles. This is done via qcc frms list member. If new data is available, frames list must be cleared before the next emission to force the encoding of new STREAM frames. If a refresh frames list is missed, it would lead to incomplete data emission on the next transfer. In most cases, this is detected via a BUG_ON() inside qcc_io_send(), as qcs instances remains in send_list after a qcc_send_frames() full emission. A bug was recently found which causes this BUG_ON() crash. This is directly related to flow control. Indeed, when sending credit is increased on the connection or a stream, frames list should be cleared as new larger STREAM frames could be encoded. This was already performed on MAX_DATA/MAX_STREAM_DATA reception but only if flow-control limit was unblocked. However this is not the proper condition and it may lead to insufficient frames refresh and thus this BUG_ON() crash. Fix this by adjusting the condition for frames refresh on flow control credit increase. Now, frames list is cleared if real offset is not blocked and soft offset was equal or greater to the previous limit. Indeed, this is the only case in which frames refreshing is necessary as it would result in bigger encoded STREAM frames. This bug was detected on QUIC interop with go-x-net client. It can also be reproduced, albeit not systematically, using the following command : $ ngtcp2-client -q --no-quic-dump --no-http-dump \ --exit-on-all-streams-close --max-data 10 \ 127.0.0.1 20443 -n10 "http://127.0.0.1:20443/?s=10k" This bug appeared with the following patch. As it is scheduled for 3.1 backporting, the current fix should be backported with it. 14710b5e6bf76834343d58db22e00b72590b16fe MEDIUM/OPTIM: mux-quic: do not rebuild frms list on every send
HAProxy
HAProxy is a free, very fast and reliable reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.
Installation
The INSTALL file describes how to build HAProxy. A list of packages is also available on the wiki.
Getting help
The discourse and the mailing-list are available for questions or configuration assistance. You can also use the slack or IRC channel. Please don't use the issue tracker for these.
The issue tracker is only for bug reports or feature requests.
Documentation
The HAProxy documentation has been split into a number of different files for ease of use. It is available in text format as well as HTML. The wiki is also meant to replace the old architecture guide.
Please refer to the following files depending on what you're looking for:
- INSTALL for instructions on how to build and install HAProxy
- BRANCHES to understand the project's life cycle and what version to use
- LICENSE for the project's license
- CONTRIBUTING for the process to follow to submit contributions
The more detailed documentation is located into the doc/ directory:
- doc/intro.txt for a quick introduction on HAProxy
- doc/configuration.txt for the configuration's reference manual
- doc/lua.txt for the Lua's reference manual
- doc/SPOE.txt for how to use the SPOE engine
- doc/network-namespaces.txt for how to use network namespaces under Linux
- doc/management.txt for the management guide
- doc/regression-testing.txt for how to use the regression testing suite
- doc/peers.txt for the peers protocol reference
- doc/coding-style.txt for how to adopt HAProxy's coding style
- doc/internals for developer-specific documentation (not all up to date)
License
HAProxy is licensed under GPL 2 or any later version, the headers under LGPL 2.1. See the LICENSE file for a more detailed explanation.