mirror of
https://github.com/haproxy/haproxy.git
synced 2026-04-26 00:27:54 -04:00
HAProxy - Load balancer
Some STREAM frame lengths were not updated before being duplicated, built of requeued contrary to their ack offsets. This leads haproxy to crash when receiving acknowledgements for such frames with this thread #1 backtrace: Thread 1 (Thread 0x7211b6ffd640 (LWP 986141)): #0 ha_crash_now () at include/haproxy/bug.h:52 No locals. #1 b_del (b=<optimized out>, del=<optimized out>) at include/haproxy/buf.h:436 No locals. #2 qc_stream_desc_ack (stream=stream@entry=0x7211b6fd9bc8, offset=offset@entry=53176, len=len@entry=1122) at src/quic_stream.c:111 Thank you to @Tristan971 for having provided such traces which reveal this issue: [04|quic|5|c_conn.c:1865] qc_requeue_nacked_pkt_tx_frms(): entering : qc@0x72119c22cfe0 [04|quic|5|_frame.c:1179] qc_frm_unref(): entering : qc@0x72119c22cfe0 [04|quic|5|_frame.c:1186] qc_frm_unref(): remove frame reference : qc@0x72119c22cfe0 frm@0x72118863d260 STREAM_F uni=0 fin=1 id=460 off=52957 len=1122 3244 [04|quic|5|_frame.c:1194] qc_frm_unref(): leaving : qc@0x72119c22cfe0 [04|quic|5|c_conn.c:1902] qc_requeue_nacked_pkt_tx_frms(): updated partially acked frame : qc@0x72119c22cfe0 frm@0x72119c472290 STREAM_F uni=0 fin=1 id=460 off=53176 len=1122 Note that haproxy has much more chance to crash if this frame is the last one (fin bit set). But another condition must be fullfilled to update the ack offset. A previous STREAM frame from the same stream with the same offset but with less data must be acknowledged by the peer. This is the condition to update the ack offset. For others frames without fin bit in the same conditions, I guess the stream may be truncated because too much data are removed from the stream when they are acknowledged. Must be backported to 2.6 and 2.7. |
||
|---|---|---|
| .github | ||
| addons | ||
| admin | ||
| dev | ||
| doc | ||
| examples | ||
| include | ||
| reg-tests | ||
| scripts | ||
| src | ||
| tests | ||
| .cirrus.yml | ||
| .gitattributes | ||
| .gitignore | ||
| .mailmap | ||
| .travis.yml | ||
| BRANCHES | ||
| CHANGELOG | ||
| CONTRIBUTING | ||
| INSTALL | ||
| LICENSE | ||
| MAINTAINERS | ||
| Makefile | ||
| README | ||
| SUBVERS | ||
| VERDATE | ||
| VERSION | ||
The HAProxy documentation has been split into a number of different files for ease of use. 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)