mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-04-17 12:35:37 +00:00
haproxy public development tree
At some moments expired stick table records stop being removed. This happens when the internal time wraps around the 32-bit limit, or every 49.7 days. What precisely happens is that some elements that are collected close to the end of the time window (2^32 - table's "expire" setting) might have been updated and will be requeued further, at the beginning of the next window. Here, three bad situations happen: - the incorrect integer-based comparison that is not aware of wrapping will result in the scan to restart from the freshly requeued element, skipping all those at the end of the window. The net effect of this is that at each wakeup of the expiration task, only one element from the end of the window will be expired, and other ones will remain there for a very long time, especially if they have to wait for all the predecessors to be picked one at a time after slow wakeups due to a long expiration ; this is what was observed in issue #2034 making the table fill up and appear as not expiring at all, and it seems that issue #2024 reports the same problem at the same moment (since such issues happen for everyone roughly at the same time when the clock doesn't drift too much). - the elements that were placed at the beginning of the next window are skipped as well for as long as there are refreshed entries at the end of the previous window, so these ones participate to filling the table as well. This is cause by the restart from the current, updated node that is generally placed after most other less recently updated elements. - once the last element at the end of the window is picked, suddenly there is a large amount of expired entries at the beginning of the next window that all have to be requeued. If the expiration delay is large, the number can be big and it can take a long time, which can very likely explain the periodic crashes reported in issue #2025. Limiting the batch size as done in commit |
||
---|---|---|
.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)