tasklets were originally designed to alway run on only one thread, so it was not possible to have it run on 2 threads concurrently. The API has been extended so that another thread may wake the tasklet, the idea was still that we wanted to have it run on one thread only. However, the way it's been done meant that unless a tasklet was bound to a specific tid with tasklet_set_tid(), or we explicitely used tasklet_wakeup_on() to specify the thread for the target to run on, it would be scheduled to run on the current thread. This is in fact a desirable feature. There is however a race condition in which the tasklet would be scheduled on a thread, while it is running on another. This could lead to the same tasklet to run on multiple threads, which we do not want. To fix this, just do what we already do for regular tasks, set the "TASK_RUNNING" flag, and when it's time to execute the tasklet, wait until that flag is gone. Only one case has been found in the current code, where the tasklet could run on different threads depending on who wakes it up, in the leastconn load balancer, since commit 627280e15f03755b8f59f0191cd6d6bcad5afeb3. It should not be a problem in practice, as the function called can be called concurrently. If a bug is eventually found in relation to this problem, and this patch should be backported, the following patches should be backported too : MEDIUM: quic: Make sure we return the tasklet from quic_accept_run MEDIUM: quic: Make sure we return NULL in quic_conn_app_io_cb if needed MEDIUM: quic: Make sure we return the tasklet from qcc_io_cb MEDIUM: mux_fcgi: Make sure we return the tasklet from fcgi_deferred_shut MEDIUM: listener: Make sure w ereturn the tasklet from accept_queue_process MEDIUM: checks: Make sure we return the tasklet from srv_chk_io_cb
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.
