]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
17 years ago[BUG] fix wrong timeout computation in event_accept()
Willy Tarreau [Mon, 15 Oct 2007 18:36:37 +0000 (20:36 +0200)] 
[BUG] fix wrong timeout computation in event_accept()

In case the incoming socket is set for write and not for read (very
unlikely, except in HEALTH mode), the timeout may remain eternity due
to a copy-paste typo.

17 years ago[BUG] fix segfault on exit in new appsession code
Willy Tarreau [Mon, 15 Oct 2007 18:04:22 +0000 (20:04 +0200)] 
[BUG] fix segfault on exit in new appsession code

The new appsession code didn't like it when appsession_hash_destroy()
was called with an empty hash table. Simply add the check.

17 years ago[MEDIUM] fixed call to chroot() during startup
Willy Tarreau [Mon, 15 Oct 2007 16:57:08 +0000 (18:57 +0200)] 
[MEDIUM] fixed call to chroot() during startup

It wasn't very wise to chroot() early during the startup. Also,
the exit() was missing if the chroot() failed.

17 years ago[MEDIUM] moved the sockaddr pointer to the fdtab structure
Willy Tarreau [Tue, 9 Oct 2007 15:14:37 +0000 (17:14 +0200)] 
[MEDIUM] moved the sockaddr pointer to the fdtab structure

The stream_sock_* functions had to know about sessions just in
order to get the server's address for a connect() operation. This
is not desirable, particularly for non-IP protocols (eg: PF_UNIX).

Put a pointer to the peer's sockaddr_storage or sockaddr address
in the fdtab structure so that we never need to look further.

With this small change, the stream_sock.c file is now 100% protocol
independant.

17 years ago[MINOR] report haproxy's version by default on the stats page
Krzysztof Oledzki [Mon, 15 Oct 2007 08:05:11 +0000 (10:05 +0200)] 
[MINOR] report haproxy's version by default on the stats page

For people who manage many haproxies, it is sometimes convenient
to be informed of their version. This patch adds this, with the
option to disable this report by specifying "stats hide-version".

Also, the feature may be permanently disabled by setting the
STATS_VERSION_STRING to "" (empty string), or the format can
simply be adjusted.

17 years ago[DOC] document spread-checks
Willy Tarreau [Sun, 14 Oct 2007 21:09:26 +0000 (23:09 +0200)] 
[DOC] document spread-checks

17 years ago[MINOR] spread checks also when the server is OK.
Willy Tarreau [Sun, 14 Oct 2007 21:47:04 +0000 (23:47 +0200)] 
[MINOR] spread checks also when the server is OK.

Initial patch only managed to spread the checks when the checks
failed. The randomization code needs to be added also in the path
where the server is going fine.

17 years ago[MEDIUM] only consider slow checks when looking for the common interval
Willy Tarreau [Sun, 14 Oct 2007 21:05:39 +0000 (23:05 +0200)] 
[MEDIUM] only consider slow checks when looking for the common interval

When one server in one backend has a very low check interval, it imposes
its value as the minimal interval, causing all other servers to start
their checks close to each other, thus partially voiding the benefits of
the spread checks.

The solution consists in ignoring intervals lower than a given value
(SRV_CHK_INTER_THRES = 1000 ms) when computing the minimal interval,
and then assigning them a start date relative to their own interval
and not the global one.

With this change, the checks distribution clearly looks better.

17 years ago[MEDIUM] Spread health checks even more
Krzysztof Oledzki [Sun, 14 Oct 2007 21:40:01 +0000 (23:40 +0200)] 
[MEDIUM] Spread health checks even more

When one server appears at the same position in multiple backends, it
receives all the checks from all the backends exactly at the same time
because the health-checks are only spread within a backend but not
globally.

Attached patch implements per-server start delay in a different way.
Checks are now spread globally - not locally to one backend. It also makes
them start faster - IMHO there is no need to add a 'server->inter' when
calculating first execution. Calculation were moved from cfgparse.c to
checks.c. There is a new function start_checks() and now it is not called
when haproxy is started in MODE_CHECK.

With this patch it is also possible to set a global 'spread-checks'
parameter. It takes a percentage value (1..50, probably something near
5..10 is a good idea) so haproxy adds or removes that many percent to the
original interval after each check. My test shows that with 18 backends,
54 servers total and 10000ms/5% it takes about 45m to mix them completely.

I decided to use rand/srand pseudo-random number generator. I am aware it
is not recommend for a good randomness but a) we do not need a good random
generator here b) it is probably the most portable one.

17 years ago[MINOR] add the "nolinger" option to disable data lingering
Alexandre Cassen [Thu, 11 Oct 2007 18:48:58 +0000 (20:48 +0200)] 
[MINOR] add the "nolinger" option to disable data lingering

The following patch will give the ability to tweak socket linger mode.
You can use this option with "option nolinger" inside fronted or backend
configuration declaration.

This will help in environments where lots of FIN_WAIT sockets are
encountered.

17 years ago[MEDIUM] do not add a cache-control: header when on non-cacheable responses
Krzysztof Oledzki [Thu, 11 Oct 2007 16:56:27 +0000 (18:56 +0200)] 
[MEDIUM] do not add a cache-control: header when on non-cacheable responses

I noticed that haproxy, with "cookie (...) nocache" option, always adds
"Cache-control: private" at the end of a header list received from this
server:

Cache-Control: no-cache
(...)
Set-Cookie: SERVERID=s6; path=/
Cache-control: private

or:

Set-Cookie: ASPSESSIONIDCSRCTSSB=HCCBGGACGBHDHMMKIOILPHNG; path=/
Cache-control: private
Set-Cookie: SERVERID=s5; path=/
Cache-control: private

It may be just redundant (two "Cache-control: private"), but sometimes it
may be quite confused as we may end with two different, more and less
restricted directions (no-cache & private) and even quite conflicting
directions (eg. public & private):

So, I added and rearranged a code, so now haproxy adds a "Cache-control:
private" header only when there is no the same (private) or more
restrictive (no-cache) one. It was done in three steps:

1. Use check_response_for_cacheability to check if response is
not cacheable. I simply moved this call before http_header_add_tail2.

2. Use TX_CACHEABLE (not TX_CACHE_COOK - apache <= 1.3.26) to check if we
need to add a Cache-control header. If we add it, clear TX_CACHEABLE and
TX_CACHE_COOK.

3. Check cacheability not only with PR_O_CHK_CACHE but also with
PR_O_COOK_NOC, so:

-                           unlikely(t->be->options & PR_O_CHK_CACHE))
+                           (t->be->options & (PR_O_CHK_CACHE|PR_O_COOK_NOC)))
                                txn->flags |= TX_CACHEABLE | TX_CACHE_COOK;

I removed this unlikely since I believe that now it is not so unlikely.

The patch is definitely not perfect, proxy should probably also remove
"Cache-control: public". Unfortunately, I do not know the code good enough
to do in myself, yet. ;)

Anyway, I think that even now, it should be very useful.

17 years ago[MINOR] prevent the system from sending an RST when closing health-checks
Krzysztof Oledzki [Thu, 11 Oct 2007 16:41:08 +0000 (18:41 +0200)] 
[MINOR] prevent the system from sending an RST when closing health-checks

On Sat, 22 Sep 2007, Willy Tarreau wrote:
> On Sun, Sep 23, 2007 at 03:23:38AM +0200, Krzysztof Oledzki wrote:
> > I noticed that with httpchk, haproxy generates TCP RST at end of a check.
> > IMHO, it would be more polite to send FIN to a server, especially that
> > each TCP RST found by a tcpdump makes me concerned that something is
> > wrong, as it is hard to distinguish between a RST from a httpchk and from
> > a normal request, forwarded for a client.
>
> I have also noticed it very recently. In fact, it's never the
> application (here haproxy) which decides to send an RST, it's the
> system. It does so because the server returns data on a terminated
> socket. I guess it's because the health-check code does not read much
> of the response. In fact, we just need to read enough to process common
> responses. If people are dumb enough to check with something like "GET
> /image.iso", they should expect to get an RST after a few kbytes
> instead of reading the whole file!

Right, that was easy. Attached patch changed what you described. Now
haproxy finishes http checks with FIN.

17 years ago[BUG] fix double-free during clean exit
Krzysztof Oledzki [Thu, 11 Oct 2007 16:30:14 +0000 (18:30 +0200)] 
[BUG] fix double-free during clean exit

This patch fixes a nasty bug raported by both glibc and valgrind, which
leads into a problem that haproxy does not exit when a new instace
starts ap (-sf/-st).

==9299== Invalid free() / delete / delete[]
==9299==    at 0x401D095: free (in
/usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==9299==    by 0x804A377: deinit (haproxy.c:721)
==9299==    by 0x804A883: main (haproxy.c:1014)
==9299==  Address 0x41859E0 is 0 bytes inside a block of size 21 free'd
==9299==    at 0x401D095: free (in
/usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==9299==    by 0x804A84B: main (haproxy.c:985)
==9299==

6542  open("/dev/tty", O_RDWR|O_NONBLOCK|O_NOCTTY) = -1 ENOENT (No such file
or directory)
6542  writev(2, [{"*** glibc detected *** ", 23}, {"corrupted double-linked
list", 28}, {": 0x", 4}, {"6ff91878", 8}, {" ***\n", 5}], 5) = -1 EBADF (Bad
file descriptor)

I found this bug trying to find why, after one week with many restarts, I
finished with >100 haproxy process running. ;)

17 years ago[TESTS] added a file to check that "retries" works.
Willy Tarreau [Tue, 18 Sep 2007 17:52:58 +0000 (19:52 +0200)] 
[TESTS] added a file to check that "retries" works.

17 years ago[MAJOR] timeouts and retries could be ignored when switching backend
Willy Tarreau [Tue, 18 Sep 2007 16:36:05 +0000 (18:36 +0200)] 
[MAJOR] timeouts and retries could be ignored when switching backend

When switching from a frontend to a backend, the "retries" parameter
was not kept, resulting in the impossibility to reconnect after the
first connection failure. This problem was reported and analyzed by
Krzysztof Oledzki.

While fixing the code, it appeared that some of the backend's timeouts
were not updated in the session when using "use_backend" or "default_backend".
It seems this had no impact but just in case, it's better to set them as
they should have been.

17 years ago[DOC] added missing keywords from haproxy.vim
Willy Tarreau [Mon, 17 Sep 2007 09:30:23 +0000 (11:30 +0200)] 
[DOC] added missing keywords from haproxy.vim

Pawel Golaszewski from pld-linux sent an update for the syntax highlight
in haproxy.vim.

17 years ago[MINOR] fix the SIGHUP message not to alert on server-less proxies
Willy Tarreau [Mon, 17 Sep 2007 09:27:09 +0000 (11:27 +0200)] 
[MINOR] fix the SIGHUP message not to alert on server-less proxies

The SIGHUP message was designed long before it was possible to have no
server in a proxy. Remove the alert in case there's no server.

17 years ago[MEDIUM] pre-initialize timeouts to infinity, not zero
Willy Tarreau [Mon, 17 Sep 2007 09:12:40 +0000 (11:12 +0200)] 
[MEDIUM] pre-initialize timeouts to infinity, not zero

Since the timers have been changed, the timeouts for the default instance
have not been adjusted. This results in unspecified timeouts becoming zero
instead of infinite.

17 years ago[MINOR] set the log socket receive window to zero bytes
Willy Tarreau [Mon, 17 Sep 2007 08:56:13 +0000 (10:56 +0200)] 
[MINOR] set the log socket receive window to zero bytes

The syslog UDP socket may receive data, which is not cool because those
data accumulate in the system buffers up to the receive socket buffer size.
To prevent this, we set the receive window to zero and try to shutdown(SHUT_RD)
the socket.

17 years ago[MEDIUM] fix configuration sanity checks for TCP listeners
Willy Tarreau [Mon, 17 Sep 2007 08:17:23 +0000 (10:17 +0200)] 
[MEDIUM] fix configuration sanity checks for TCP listeners

A log chain of if/else prevented many sanity checks from being
performed on TCP listeners, resulting in dangerous configs being
accepted. Removed the offending 'else'.

17 years ago[DOC] fixed 2 typos in haproxy-en/fr
Willy Tarreau [Sun, 9 Sep 2007 21:49:18 +0000 (23:49 +0200)] 
[DOC] fixed 2 typos in haproxy-en/fr

-st was indicated instead of -sf, and the pidfile was wrong.

17 years ago[BUILD] centralize version and date into one file for each
Willy Tarreau [Sun, 9 Sep 2007 21:31:11 +0000 (23:31 +0200)] 
[BUILD] centralize version and date into one file for each

The version does not appear anymore in the Makefiles nor in
the include files. It was a nightmare to maintain. Now there
is a VERSION file which contains the major version, a VERDATE
file which contains the date for this version and a SUBVERS
file which may contain a sub-version.

A "make version" target has been added to all makefiles to
check the version. The GNU Makefile also has an update-version
target to update those files. This should never be used.

It is still possible to override those values by specifying
them in the equivalent make variables. By default, the GNU
makefile tries to detect a GIT repository and always uses the
version and date from the current repository. This can be
disabled by setting IGNOREGIT to a non-void value.

17 years ago[DOC] added a small man page
Willy Tarreau [Sun, 9 Sep 2007 20:40:07 +0000 (22:40 +0200)] 
[DOC] added a small man page

Arnaud Cornet has started a small man page based on some information
gathered from the docs. I've completed it a bit.

17 years ago[MAJOR] remove files distributed under an obscure license
Willy Tarreau [Sun, 9 Sep 2007 19:56:53 +0000 (21:56 +0200)] 
[MAJOR] remove files distributed under an obscure license

src/chtbl.c, src/hashpjw.c and src/list.c are distributed under
an obscure license. While Aleks and I believe that this license
is OK for haproxy, other people think it is not compatible with
the GPL.

Whether it is or not is not the problem. The fact that it rises
a doubt is sufficient for this problem to be addressed. Arnaud
Cornet rewrote the unclear parts with clean GPLv2 and LGPL code.
The hash algorithm has changed too and the code has been slightly
simplified in the process. A lot of care has been taken in order
to respect the original API as much as possible, including the
LGPL for the exportable parts.

The new code has not been thoroughly tested but it looks OK now.

17 years ago[TESTS] added a new hash algorithm
Willy Tarreau [Sun, 9 Sep 2007 19:13:47 +0000 (21:13 +0200)] 
[TESTS] added a new hash algorithm

added "wt_hash" which shows only 60 collisions in 575k values, which
sets it between hashword() and djbx33(). It's also between both in
terms of performance, but the most important part is that its variable
length rotation mechanism should make it really harder to predict and
attack than the other ones.

17 years ago[MAJOR] spec I/O: fix allocations of spec entries for an FD
Willy Tarreau [Fri, 31 Aug 2007 15:01:18 +0000 (17:01 +0200)] 
[MAJOR] spec I/O: fix allocations of spec entries for an FD

Under some circumstances, it was possible with speculative I/O to
reallocate multiple entries for the same FD if an fd_{set,clr,set}
or fd_{clr,set,clr} sequences were performed before a schedule.

Fix this by keeping a an allocation flag for each fd.

17 years ago[MEDIUM] stats page: added links for 'refresh' and 'hide down'
Willy Tarreau [Wed, 25 Jul 2007 12:43:32 +0000 (14:43 +0200)] 
[MEDIUM] stats page: added links for 'refresh' and 'hide down'

The stats page now supports an option to hide servers which are DOWN
and to enable/disable automatic refresh. It is also possible to ask
for an immediate refresh.

17 years ago[MEDIUM] ensure we never overflow in chunk_printf()
Willy Tarreau [Wed, 25 Jul 2007 12:38:45 +0000 (14:38 +0200)] 
[MEDIUM] ensure we never overflow in chunk_printf()

The result of the vsnprintf() called in chunk_printf() must be checked,
and should be added only if lower than the requested size. We simply
return zero if we cannot write the chunk.

17 years ago[TESTS] provide a test configuration file for stats and checks
Willy Tarreau [Wed, 25 Jul 2007 05:37:40 +0000 (07:37 +0200)] 
[TESTS] provide a test configuration file for stats and checks

A file with 1000 servers and a stats interface has been added.

17 years ago[MINOR] add support for "stats refresh <interval>"
Willy Tarreau [Wed, 25 Jul 2007 05:26:38 +0000 (07:26 +0200)] 
[MINOR] add support for "stats refresh <interval>"

Sometimes it may be desirable to automatically refresh the
stats page. Most browsers support the "Refresh:" header with
an interval in seconds. Specifying "stats refresh xxx" will
automatically add this header.

17 years ago[DOC] the "stats" keyword is not allowed in a pure frontend.
Willy Tarreau [Tue, 24 Jul 2007 21:43:37 +0000 (23:43 +0200)] 
[DOC] the "stats" keyword is not allowed in a pure frontend.

17 years ago[DOC] started a new configuration manual
Willy Tarreau [Sun, 15 Jul 2007 18:15:28 +0000 (20:15 +0200)] 
[DOC] started a new configuration manual

This new configuration manual intends to document every known keyword
of the configuration language. Right now, it enumerates them all and
describes how to use ACLs.

17 years ago[MINOR] fix backend's weight in the stats page.
Willy Tarreau [Tue, 24 Jul 2007 22:28:06 +0000 (00:28 +0200)] 
[MINOR] fix backend's weight in the stats page.

The GCD used when computing the servers' weights causes the total
weight of the backend to appear lower than expected because it is
divided by the GCD. Easy solution consists in recomputing the GCD
from the first server and apply it to the global weight.

17 years ago[MEDIUM] improve behaviour with large number of servers per proxy
Willy Tarreau [Tue, 24 Jul 2007 21:32:33 +0000 (23:32 +0200)] 
[MEDIUM] improve behaviour with large number of servers per proxy

When a very large number of servers is configured (thousands),
shutting down many of them at once could lead to large number
of calls to recalc_server_map() which already takes some time.
This would result in an O(N^3) computation time, leading to
noticeable pauses on slow embedded CPUs on test platforms.

Instead, mark the map as dirty and recalc it only when needed.

18 years ago[MEDIUM] fade out memory usage when stopping proxies
Willy Tarreau [Wed, 11 Jul 2007 08:42:35 +0000 (10:42 +0200)] 
[MEDIUM] fade out memory usage when stopping proxies

Now we try to free as many pools as possible when a proxy is stopping.
The reason is that we want to ease the process replacement when applying
a new configuration, without keeping too many unused memory allocated.

18 years ago[MEDIUM] Added easier support for Doug Lea's malloc (dlmalloc)
Willy Tarreau [Wed, 11 Jul 2007 07:19:31 +0000 (09:19 +0200)] 
[MEDIUM] Added easier support for Doug Lea's malloc (dlmalloc)

It's now as easy as passing "DLMALLOC_SRC=<path_to_dlmalloc.c>" to
build with support for dlmalloc. The dlmalloc source is not provided
with haproxy in order to ensure that people will use either the most
recent, or the most suited version for their platform. The minimal
mmap size is specified in DLMALLOC_THRES, which defaults to 4096. It
should be increased on platforms with larger pages (eg: 8 kB on some
64 bit systems).

18 years ago[RELEASE] Released version 1.3.12 with the following main changes : v1.3.12
Willy Tarreau [Sun, 17 Jun 2007 21:41:40 +0000 (23:41 +0200)] 
[RELEASE] Released version 1.3.12 with the following main changes :

    - acl: smarter integer comparison support in ACLs
    - acl: specify the direction during fetches
    - acl: provide the argument length for fetch functions
    - acl: provide a reference to the expr to fetch()
    - acl: implement matching on header values
    - acl: support maching on 'path' component
    - acl: permit to return any header when no name specified
    - errorfile: use a local file to feed error messages
    - negation in ACL conds was not cleared between terms
    - fix segfault at exit when using captures
    - improve memory freeing upon exit
    - acl: support '-i' to ignore case when matching
    - str2net() must not change the const char *
    - provide default ACLs
    - acl: distinguish between request and response headers
    - added the 'use_backend' keyword for full content-switching
    - acl: added the TRUE and FALSE ACLs.
    - shut warnings 'is*' macros from ctype.h on solaris

18 years ago[CLEANUP] shut warnings 'is*' macros from ctype.h on solaris
Willy Tarreau [Sun, 17 Jun 2007 19:51:38 +0000 (21:51 +0200)] 
[CLEANUP] shut warnings 'is*' macros from ctype.h on solaris

Solaris visibly uses an array for is*, which returns warnings
about the use of signed chars as indexes. Good opportunity to
put casts everywhere.

18 years ago[MEDIUM] acl: added the TRUE and FALSE ACLs.
Willy Tarreau [Sun, 17 Jun 2007 18:40:25 +0000 (20:40 +0200)] 
[MEDIUM] acl: added the TRUE and FALSE ACLs.

Those ACLs are sometimes useful for troubleshooting. Two ACL subjects
"always_true" and "always_false" have been added too. They return what
their subject says for every pattern. Also, acl_match_pst() has been
removed.

18 years ago[MAJOR] added the 'use_backend' keyword for full content-switching
Willy Tarreau [Sun, 17 Jun 2007 17:56:27 +0000 (19:56 +0200)] 
[MAJOR] added the 'use_backend' keyword for full content-switching

The new "use_backend" keyword permits full content switching by the
use of ACLs. Its usage is simple :

   use_backend <backend_name> {if|unless} <acl_cond>

18 years ago[MEDIUM] acl: distinguish between request and response headers
Willy Tarreau [Sun, 17 Jun 2007 14:58:38 +0000 (16:58 +0200)] 
[MEDIUM] acl: distinguish between request and response headers

hdr(x) will now still be used for request headers, and shdr(x) for
server headers (response).

18 years ago[MEDIUM] provide default ACLs
Willy Tarreau [Sun, 17 Jun 2007 09:54:31 +0000 (11:54 +0200)] 
[MEDIUM] provide default ACLs

The following ACLs are predefined :

  LOCALHOST      = src 127.0.0.1/8
  HTTP_1.0       = req_ver 1.0
  HTTP_1.1       = req_ver 1.1
  METH_CONNECT   = method CONNECT
  METH_GET       = method GET HEAD
  METH_HEAD      = method HEAD
  METH_OPTIONS   = method OPTIONS
  METH_POST      = method POST
  METH_TRACE     = method TRACE
  HTTP_URL_ABS   = url_reg ^[^/:]*://
  HTTP_URL_SLASH = url_beg /
  HTTP_URL_STAR  = url *
  HTTP_CONTENT   = hdr_val(content-length) gt 0

18 years ago[BUG] str2net() must not change the const char *
Willy Tarreau [Sun, 17 Jun 2007 09:42:08 +0000 (11:42 +0200)] 
[BUG] str2net() must not change the const char *

str2net needs to put \0 in a const char *. Use strdup() for that.

18 years ago[MEDIUM] acl: support '-i' to ignore case when matching
Willy Tarreau [Sun, 17 Jun 2007 06:20:33 +0000 (08:20 +0200)] 
[MEDIUM] acl: support '-i' to ignore case when matching

Implemented the "-i" option on ACLs to state that the matching
will have to be performed for all patterns ignoring case. The
usage is :

   acl <aclname> <aclsubject> -i pattern1 ...

If a pattern must begin with "-", either it must not be the first one,
or the "--" option should be specified first.

18 years ago[MINOR] improve memory freeing upon exit
Willy Tarreau [Sat, 16 Jun 2007 22:36:03 +0000 (00:36 +0200)] 
[MINOR] improve memory freeing upon exit

The deinit() function is specialized in memory area freeing.
There were a ton of information that were not released at the
exit time, which made valgrind complain. Now, most of the entries
are freed. However, it seems like regfree() does not completely
free a regex (12 bytes lost per regex).

18 years ago[BUG] fix segfault at exit when using captures
Willy Tarreau [Sat, 16 Jun 2007 21:19:53 +0000 (23:19 +0200)] 
[BUG] fix segfault at exit when using captures

since pools v2, the way pools were destroyed at exit is incorrect
because it ought to account for users of those pools before freeing
them. This test also ensures there is no double free.

18 years ago[BUG] negation in ACL conds was not cleared between terms
Willy Tarreau [Sat, 16 Jun 2007 17:35:18 +0000 (19:35 +0200)] 
[BUG] negation in ACL conds was not cleared between terms

The exclamation mark (!) in front of an ACL condition was propagated
to the whole line instead of being flushed after parsing an acl name.

18 years ago[MEDIUM] errorfile: use a local file to feed error messages
Willy Tarreau [Sun, 10 Jun 2007 22:29:26 +0000 (00:29 +0200)] 
[MEDIUM] errorfile: use a local file to feed error messages

It is now possible to read error messages from local files,
using the 'errorfile' keyword. Those files are read during
parsing, so there's no I/O involved. They make it possible
to return custom error messages with custom status and headers.

18 years ago[MINOR] acl: permit to return any header when no name specified
Willy Tarreau [Sun, 10 Jun 2007 19:42:55 +0000 (21:42 +0200)] 
[MINOR] acl: permit to return any header when no name specified

Having the ability to match on hdr_xxx in addition to hdr_xxx(yyy)
makes it possible to match any value or to count the headers easily.

18 years ago[MEDIUM] acl: support maching on 'path' component
Willy Tarreau [Sun, 10 Jun 2007 19:28:46 +0000 (21:28 +0200)] 
[MEDIUM] acl: support maching on 'path' component

'path', 'path_reg', 'path_beg', 'path_end', 'path_sub', 'path_dir'
and 'path_dom' have been implemented to process the path component
of the URI. It starts after the host part, and stops before the
question mark.

18 years ago[MEDIUM] acl: implement matching on header values
Willy Tarreau [Sun, 10 Jun 2007 17:45:56 +0000 (19:45 +0200)] 
[MEDIUM] acl: implement matching on header values

hdr(x), hdr_reg(x), hdr_beg(x), hdr_end(x), hdr_sub(x), hdr_dir(x),
hdr_dom(x), hdr_cnt(x) and hdr_val(x) have been implemented. They
apply to any of the possibly multiple values of header <x>.

Right now, hdr_val() is limited to integer matching, but it should
reasonably be upgraded to match long long ints.

18 years ago[MINOR] acl: provide a reference to the expr to fetch()
Willy Tarreau [Sun, 10 Jun 2007 09:47:14 +0000 (11:47 +0200)] 
[MINOR] acl: provide a reference to the expr to fetch()

The fetch() functions may need to access the full expr to get
their args. Turn the void *arg into a struct acl_expr *expr.

18 years ago[MINOR] acl: provide the argument length for fetch functions
Willy Tarreau [Sun, 10 Jun 2007 09:17:01 +0000 (11:17 +0200)] 
[MINOR] acl: provide the argument length for fetch functions

Some fetch() functions will require an argument (eg: header).
It's wise to provide the argument size to optimize string
comparisons.

18 years ago[MINOR] acl: specify the direction during fetches
Willy Tarreau [Sun, 10 Jun 2007 08:06:18 +0000 (10:06 +0200)] 
[MINOR] acl: specify the direction during fetches

Some fetches such as 'line' or 'hdr' need to know the direction of
the test (request or response). A new 'dir' parameter is now
propagated from the caller to achieve this.

18 years ago[MEDIUM] smarter integer comparison support in ACLs
Willy Tarreau [Sat, 9 Jun 2007 21:10:04 +0000 (23:10 +0200)] 
[MEDIUM] smarter integer comparison support in ACLs

ACLs now support operators such as 'eq', 'le', 'lt', 'ge' and 'gt'
in order to give more flexibility to the language. Because of this
change, the 'dst_limit' keyword changed to 'dst_conn' and now requires
either a range or a test such as 'dst_conn lt 1000' which is more
understandable.

18 years ago[RELEASE] Released version 1.3.11.4 with the following main changes : v1.3.11.4
Willy Tarreau [Sun, 3 Jun 2007 15:27:07 +0000 (17:27 +0200)] 
[RELEASE] Released version 1.3.11.4 with the following main changes :

    - do not re-arm read timeout in SHUTR state
    - optimize I/O by detecting system starvation
    - the epoll FD must not be shared between processes
    - limit the number of events returned by *poll*

18 years ago[MEDIUM] limit the number of events returned by *poll*
Willy Tarreau [Sun, 3 Jun 2007 15:16:49 +0000 (17:16 +0200)] 
[MEDIUM] limit the number of events returned by *poll*

By default, epoll/kqueue used to return as many events as possible.
This could sometimes cause huge latencies (latencies of up to 400 ms
have been observed with many thousands of fds at once). Limiting the
number of events returned also reduces the latency by avoiding too
many blind processing. The value is set to 200 by default and can be
changed in the global section using the tune.maxpollevents parameter.

18 years ago[BUG] the epoll FD must not be shared between processes
Willy Tarreau [Sun, 3 Jun 2007 14:40:44 +0000 (16:40 +0200)] 
[BUG] the epoll FD must not be shared between processes

Recreate the epoll file descriptor after a fork(). It will ensure
that all processes will not share their epoll_fd. Some side effects
were encountered because of this, such as epoll_wait() returning an
FD which was previously deleted, in multi-process mode.

18 years ago[MEDIUM] optimize I/O by detecting system starvation
Willy Tarreau [Sun, 3 Jun 2007 12:10:36 +0000 (14:10 +0200)] 
[MEDIUM] optimize I/O by detecting system starvation

Compare the results of recv/send with the parameter passed and
detect whether the system has no free buffer space for send()
or has no data anymore for recv(). This dramatically reduces
the number of syscalls (by about 23%).

18 years ago[BUG] do not re-arm read timeout after writing data
Willy Tarreau [Sun, 3 Jun 2007 13:59:52 +0000 (15:59 +0200)] 
[BUG] do not re-arm read timeout after writing data

A second occurrence of read-timeout rearming was present in stream_sock.c.
To fix the problem, it was necessary to put the shutdown information in
the buffer (already planned).

18 years ago[BUG] do not re-arm read timeout in SHUTR state !
Willy Tarreau [Sun, 3 Jun 2007 13:25:37 +0000 (15:25 +0200)] 
[BUG] do not re-arm read timeout in SHUTR state !

There is a long-time bug causing busy loops when either client-side
or server-side enters a SHUTR state. When writing data to the FD,
it was possible to re-arm the read side if the write had been paused.

18 years ago[RELEASE] Released version 1.3.11.3 with the following main changes : v1.3.11.3
Willy Tarreau [Mon, 14 May 2007 12:40:25 +0000 (14:40 +0200)] 
[RELEASE] Released version 1.3.11.3 with the following main changes :

    - pre-initialize timeouts with tv_eternity during parsing

18 years ago[BUG] pre-initialize timeouts with tv_eternity during parsing
Willy Tarreau [Mon, 14 May 2007 12:37:50 +0000 (14:37 +0200)] 
[BUG] pre-initialize timeouts with tv_eternity during parsing

ETERNITY is not 0 anymore, so all timeouts will not be initialized
to ETERNITY by a simple calloc(). We have to explictly assign them.

This bug caused random session aborts.

18 years ago[RELEASE] Released version 1.3.11.2 with the following main changes : v1.3.11.2
Willy Tarreau [Mon, 14 May 2007 01:42:47 +0000 (03:42 +0200)] 
[RELEASE] Released version 1.3.11.2 with the following main changes :

    - fixed broken health-checks since switch to timeval

18 years ago[BUG] fix broken health-checks since switch to timeval
Willy Tarreau [Mon, 14 May 2007 01:40:11 +0000 (03:40 +0200)] 
[BUG] fix broken health-checks since switch to timeval

Health-checks were broken because of a return which was unexpectedly removed.

18 years ago[RELEASE] Released version 1.3.11.1 with the following main changes : v1.3.11.1
Willy Tarreau [Mon, 14 May 2007 01:18:43 +0000 (03:18 +0200)] 
[RELEASE] Released version 1.3.11.1 with the following main changes :

    - fixed ev_kqueue which was forgotten during the switch to timeval
    - allowed null timeouts for past events in select

18 years ago[MINOR] allow null timeouts for past events in select
Willy Tarreau [Mon, 14 May 2007 01:16:06 +0000 (03:16 +0200)] 
[MINOR] allow null timeouts for past events in select

18 years ago[BUG] ev_kqueue was forgotten during the switch to timeval
Willy Tarreau [Mon, 14 May 2007 01:15:46 +0000 (03:15 +0200)] 
[BUG] ev_kqueue was forgotten during the switch to timeval

18 years ago[RELEASE] Released version 1.3.11 with the following main changes : v1.3.11
Willy Tarreau [Mon, 14 May 2007 00:42:33 +0000 (02:42 +0200)] 
[RELEASE] Released version 1.3.11 with the following main changes :

    - fixed ev_sepoll again by rewriting the state machine
    - switched all timeouts to timevals instead of milliseconds
    - improved memory management using mempools v2.
    - several minor optimizations

18 years agoMerge branch 'pools' into merge-pools
Willy Tarreau [Mon, 14 May 2007 00:11:56 +0000 (02:11 +0200)] 
Merge branch 'pools' into merge-pools

18 years ago[MINOR] disable useless hint in wake_expired_tasks
Willy Tarreau [Mon, 14 May 2007 00:11:39 +0000 (02:11 +0200)] 
[MINOR] disable useless hint in wake_expired_tasks

wake_expired_tasks() used a hint to avoid scanning the tree in most cases,
but it looks like the hint is more expensive than reaching the first node
in the tree. Disable it for now.

18 years ago[BUG] fix buggy timeout computation in wake_expired_tasks
Willy Tarreau [Mon, 14 May 2007 00:03:47 +0000 (02:03 +0200)] 
[BUG] fix buggy timeout computation in wake_expired_tasks

Wake_expired_tasks is supposed to return a date, not an interval. It
was causing busy loops in pollers.

18 years ago[BUG] fix null timeouts in *poll-based pollers
Willy Tarreau [Mon, 14 May 2007 00:02:04 +0000 (02:02 +0200)] 
[BUG] fix null timeouts in *poll-based pollers

Introduction of timeval timers broke *poll-based pollers, because the call to
tv_ms_remain may return 0 while the event is not elapsed yet. Now we carefully
check for those cases and round the result up by 1 ms.

18 years ago[MAJOR] call garbage collector when doing soft stop
Willy Tarreau [Sun, 13 May 2007 22:39:29 +0000 (00:39 +0200)] 
[MAJOR] call garbage collector when doing soft stop

When we're interrupted by another instance, it is very likely
that the other one will need some memory. Now we know how to
free what is not used, so let's do it.

Also only free non-null pointers. Previously, pool_destroy()
did implicitly check for this case which was incidentely
needed.

18 years ago[MEDIUM] enhance behaviour of mempools v2
Willy Tarreau [Sun, 13 May 2007 22:16:13 +0000 (00:16 +0200)] 
[MEDIUM] enhance behaviour of mempools v2

- keep the number of users of each pool
- call the garbage collector on out of memory conditions
- sort the pools by size for faster creation
- force the alignment size to 16 bytes instead of 4*sizeof(void *)

18 years ago[MAJOR] convert the header indexes to use mempool v2
Willy Tarreau [Sun, 13 May 2007 20:57:02 +0000 (22:57 +0200)] 
[MAJOR] convert the header indexes to use mempool v2

18 years ago[MAJOR] last bunch of capture changes for mempool v2
Willy Tarreau [Sun, 13 May 2007 20:46:04 +0000 (22:46 +0200)] 
[MAJOR] last bunch of capture changes for mempool v2

The header captures had lots of pools. They have all been transformed.

18 years ago[MAJOR] ported the captures to use the new mempool v2
Willy Tarreau [Sun, 13 May 2007 19:45:51 +0000 (21:45 +0200)] 
[MAJOR] ported the captures to use the new mempool v2

The "capture.c" file has also been removed since it was empty.

18 years ago[MAJOR] ported requri to use mempools v2
Willy Tarreau [Sun, 13 May 2007 19:36:56 +0000 (21:36 +0200)] 
[MAJOR] ported requri to use mempools v2

18 years ago[MAJOR] ported appsession to use mempools v2
Willy Tarreau [Sun, 13 May 2007 19:29:55 +0000 (21:29 +0200)] 
[MAJOR] ported appsession to use mempools v2

Also during this process, a bug was found in appsession_refresh().
It would not automatically requeue the task in the queue, so the
old sessions would not vanish.

18 years ago[MAJOR] ported pendconn to mempools v2
Willy Tarreau [Sun, 13 May 2007 18:19:55 +0000 (20:19 +0200)] 
[MAJOR] ported pendconn to mempools v2

A pool_destroy() was also missing in deinit()

18 years ago[MAJOR] switched buffers to mempools v2
Willy Tarreau [Sun, 13 May 2007 17:56:02 +0000 (19:56 +0200)] 
[MAJOR] switched buffers to mempools v2

18 years ago[MAJOR] migrated task, tree64 and session to pool2
Willy Tarreau [Sun, 13 May 2007 17:43:47 +0000 (19:43 +0200)] 
[MAJOR] migrated task, tree64 and session to pool2

task and tree64 are already very close in size and are merged together.
Overall performance gained slightly by this simple change.

18 years ago[MEDIUM] add new memory management functions
Willy Tarreau [Sun, 13 May 2007 17:38:49 +0000 (19:38 +0200)] 
[MEDIUM] add new memory management functions

Implement pool_destroy2, pool_flush2, pool_gc2. It is safe to call
pool_gc2 to free whatever memory possible.

18 years ago[MEDIUM] implement memory pools version 2
Willy Tarreau [Sun, 13 May 2007 16:26:08 +0000 (18:26 +0200)] 
[MEDIUM] implement memory pools version 2

The new pools know about their size and usage. Malloc is not used
anymore, instead a dedicated function to refill the entries is used.

18 years agoMerge branch 'timers' into merge-timers
Willy Tarreau [Sun, 13 May 2007 14:10:04 +0000 (16:10 +0200)] 
Merge branch 'timers' into merge-timers

18 years ago[MINOR] use non-inline tv_* functions in many locations
Willy Tarreau [Sun, 13 May 2007 14:08:19 +0000 (16:08 +0200)] 
[MINOR] use non-inline tv_* functions in many locations

The __tv_* functions were abused. They are not that small and it is not
always worth using them.

18 years ago[MINOR] avoid inlining in task.c
Willy Tarreau [Sun, 13 May 2007 14:07:06 +0000 (16:07 +0200)] 
[MINOR] avoid inlining in task.c

The task management functions used to call __tv_* which is not really
optimal given the size of the functions.

18 years ago[MINOR] add new tv_* functions
Willy Tarreau [Sun, 13 May 2007 14:03:27 +0000 (16:03 +0200)] 
[MINOR] add new tv_* functions

The most useful, tv_add_ifset only adds the increment if it is set. It
is designed for use in expiration computation.

18 years agoMerge branch 'master' into timers
Willy Tarreau [Sun, 13 May 2007 12:51:41 +0000 (14:51 +0200)] 
Merge branch 'master' into timers

18 years ago[TESTS] updates to hash experimentations
Willy Tarreau [Sun, 13 May 2007 09:40:04 +0000 (11:40 +0200)] 
[TESTS] updates to hash experimentations

Aleksandar Lazic has collected many hashing algorithms and put them
in one file to ease benchmarking. Some algos look promising, some
of them have been checked further with uri_hash. Some results on
various systems/hardware are stored in hash_results.txt.

18 years ago[BUG] fix ev_sepoll again, this time with a new state machine
Willy Tarreau [Sat, 12 May 2007 23:52:05 +0000 (01:52 +0200)] 
[BUG] fix ev_sepoll again, this time with a new state machine

It was possible in ev_sepoll() to ignore certain events if
all speculative events had been processed at once, because
the epoll_wait() timeout was not cleared, thus delaying the
events delivery.

The state machine was complicated, it has been rewritten.
It seems faster and more correct right now.

18 years ago[MAJOR] replaced all timeouts with struct timeval
Willy Tarreau [Sat, 12 May 2007 20:35:00 +0000 (22:35 +0200)] 
[MAJOR] replaced all timeouts with struct timeval

The timeout functions were difficult to manipulate because they were
rounding results to the millisecond. Thus, it was difficult to compare
and to check what expired and what did not. Also, the comparison
functions were heavy with multiplies and divides by 1000. Now, all
timeouts are stored in timevals, reducing the number of operations
for updates and leading to cleaner and more efficient code.

18 years ago[MINOR] time.h: added a few tv_* functions to manipulate timevals
Willy Tarreau [Sat, 12 May 2007 20:29:44 +0000 (22:29 +0200)] 
[MINOR] time.h: added a few tv_* functions to manipulate timevals

A few more tv_* functions will be needed to switch from a millisecond-based
scheduler to a struct timeval-based one.

18 years ago[TESTS] test_pools: added support for dlmalloc()
Willy Tarreau [Sat, 12 May 2007 14:14:55 +0000 (16:14 +0200)] 
[TESTS] test_pools: added support for dlmalloc()

18 years ago[TESTS] added test_pools from Aleksandar Lazic
Willy Tarreau [Sat, 12 May 2007 13:51:02 +0000 (15:51 +0200)] 
[TESTS] added test_pools from Aleksandar Lazic

This simple test performs memory allocations using pools and
mallocs and returns the average number of allocations per second.

18 years ago[RELEASE] Released version 1.3.10.2 with the following main changes : v1.3.10.2
Willy Tarreau [Thu, 10 May 2007 05:51:17 +0000 (07:51 +0200)] 
[RELEASE] Released version 1.3.10.2 with the following main changes :

    - fixed build of files including standard.h on OpenBSD

18 years ago[BUILD] fixed build of files including standard.h on OpenBSD
Willy Tarreau [Thu, 10 May 2007 04:39:03 +0000 (06:39 +0200)] 
[BUILD] fixed build of files including standard.h on OpenBSD

The file standard.h included netinet/in.h without including
sys/types.h. This broke build on OpenBSD.

18 years ago[RELEASE] Released version 1.3.10.1 with the following main changes : v1.3.10.1
Willy Tarreau [Wed, 9 May 2007 20:58:28 +0000 (22:58 +0200)] 
[RELEASE] Released version 1.3.10.1 with the following main changes :

    - fixed sepoll transition matrix (two states were missing)

18 years ago[BUG] two missing states in sepoll transition matrix
Willy Tarreau [Wed, 9 May 2007 19:57:51 +0000 (21:57 +0200)] 
[BUG] two missing states in sepoll transition matrix

Two states were missing in the speculative epoll state transition
matrix. This could cause some timeouts and unhandled events. The
problem showed up in TCP mode with a fast server at high session
rates, but could in theory also affect HTTP mode.