]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
16 years ago[MINOR] buffers: implement buffer_flush()
Willy Tarreau [Sun, 8 Mar 2009 20:12:04 +0000 (21:12 +0100)] 
[MINOR] buffers: implement buffer_flush()

This function will flush the buffer's data, which means that all data
remaining in the buffer will be scheduled for sending.

16 years ago[CLEANUP] buffer_flush() was misleading, rename it as buffer_erase
Willy Tarreau [Sun, 8 Mar 2009 19:33:29 +0000 (20:33 +0100)] 
[CLEANUP] buffer_flush() was misleading, rename it as buffer_erase

16 years ago[CLEANUP] don't enable kernel splicing when socket is closed
Willy Tarreau [Sun, 8 Mar 2009 18:44:29 +0000 (19:44 +0100)] 
[CLEANUP] don't enable kernel splicing when socket is closed

Splicing will not be used when the source socket is closed. Don't
enable it uselessly.

16 years ago[OPTIM] do not re-check req buffer when only response has changed
Willy Tarreau [Sun, 8 Mar 2009 18:20:25 +0000 (19:20 +0100)] 
[OPTIM] do not re-check req buffer when only response has changed

In process_session(), we used to re-run through all the evaluation
loop when only the response had changed. Now we carefully check in
this order :
  - changes to the stream interfaces (only SI_ST_DIS)
  - changes to the request buffer flags
  - changes to the response buffer flags

And we branch to the appropriate section. This saves significant
CPU cycles, which is important since process_session() is one of
the major CPU eaters.

The same changes have been applied to uxst_process_session().

16 years ago[OPTIM] task: reduce the number of calls to task_queue()
Willy Tarreau [Sun, 8 Mar 2009 15:35:27 +0000 (16:35 +0100)] 
[OPTIM] task: reduce the number of calls to task_queue()

Most of the time, task_queue() will immediately return. By extracting
the preliminary checks and putting them in an inline function, we can
significantly reduce the number of calls to the function itself, and
most of the tests can be optimized away due to the caller's context.

Another minor improvement in process_runnable_tasks() consisted in
taking benefit from the processor's branch prediction unit by making
a special case of the process_session() callback which is by far the
most common one.

All this improved performance by about 1%, mainly during the call
from process_runnable_tasks().

16 years ago[CLEANUP] task: distinguish between clock ticks and timers
Willy Tarreau [Sun, 8 Mar 2009 14:53:06 +0000 (15:53 +0100)] 
[CLEANUP] task: distinguish between clock ticks and timers

Timers are unsigned and used as tree positions. Ticks are signed and
used as absolute date within current time frame. While the two are
normally equal (except zero), it's important not to confuse them in
the code as they are not interchangeable.

We add two inline functions to turn each one into the other.

The comments have also been moved to the proper location, as it was
not easy to understand what was a tick and what was a timer unit.

16 years ago[BUG] event_accept() must always wake the task up, even in health mode
Willy Tarreau [Sun, 8 Mar 2009 11:25:07 +0000 (12:25 +0100)] 
[BUG] event_accept() must always wake the task up, even in health mode

event_accept() did not wake the task up in health mode, so that mode was
not working anymore.

16 years ago[MEDIUM] minor update to the task api: let the scheduler queue itself
Willy Tarreau [Sun, 8 Mar 2009 08:38:41 +0000 (09:38 +0100)] 
[MEDIUM] minor update to the task api: let the scheduler queue itself

All the tasks callbacks had to requeue the task themselves, and update
a global timeout. This was not convenient at all. Now the API has been
simplified. The tasks callbacks only have to update their expire timer,
and return either a pointer to the task or NULL if the task has been
deleted. The scheduler will take care of requeuing the task at the
proper place in the wait queue.

16 years ago[OPTIM] displace tasks in the wait queue only if absolutely needed
Willy Tarreau [Sun, 8 Mar 2009 06:46:27 +0000 (07:46 +0100)] 
[OPTIM] displace tasks in the wait queue only if absolutely needed

We don't need to remove then add tasks in the wait queue every time we
update a timeout. We only need to do that when the new timeout is earlier
than previous one. We can rely on wake_expired_tasks() to perform the
proper checks and bounce the misplaced tasks in the rare case where this
happens. The motivation behind this is that we very rarely hit timeouts,
so we save a lot of CPU cycles by moving the tasks very rarely. This now
means we can also find tasks with expiration date set to eternity in the
queue, and that is not a problem.

16 years ago[OPTIM] task: don't unlink a task from a wait queue when waking it up
Willy Tarreau [Sat, 7 Mar 2009 16:25:21 +0000 (17:25 +0100)] 
[OPTIM] task: don't unlink a task from a wait queue when waking it up

In many situations, we wake a task on an I/O event, then queue it
exactly where it was. This is a real waste because we delete/insert
tasks into the wait queue for nothing. The only reason for this is
that there was only one tree node in the task struct.

By adding another tree node, we can have one tree for the timers
(wait queue) and one tree for the priority (run queue). That way,
we can have a task both in the run queue and wait queue at the
same time. The wait queue now really holds timers, which is what
it was designed for.

The net gain is at least 1 delete/insert cycle per session, and up
to 2-3 depending on the workload, since we save one cycle each time
the expiration date is not changed during a wake up.

16 years ago[BUG] task: fix handling of duplicate keys
Willy Tarreau [Sat, 7 Mar 2009 23:26:28 +0000 (00:26 +0100)] 
[BUG] task: fix handling of duplicate keys

A bug was introduced with the ebtree-based scheduler. It seldom causes
some timeouts to last longer than required if they hit an expiration
date which is the same as the last queued date, is also part of a
duplicate tree without being the top of the tree. In this case, the
task will not be expired until after the duplicate tree has been
flushed.

It is easier to reproduce by setting a very short client timeout (1s)
and sending connections and waiting for them to expire with the 408
status. Then in parallel, inject at about 1kh/s. The bug causes the
connections to sometimes wait longer than 1s before timing out.

The cause was the use of eb_insert_dup() on wrong nodes, as this
function is designed to work only on the top of the dup tree. The
solution consists in updating last_timer only when its bit is -1,
and using it only if its bit is still -1 (top of a dup tree).

The fix has not reduced performance because it only fixes the case
where this bug could fire, which is extremely rare.

16 years ago[BUG] rate-limit in defaults section was ignored
Willy Tarreau [Sat, 7 Mar 2009 10:53:44 +0000 (11:53 +0100)] 
[BUG] rate-limit in defaults section was ignored

Just a missing initialisation of the field when creating a proxy.

16 years ago[BUG] disable any analysers for monitoring requests
Willy Tarreau [Fri, 6 Mar 2009 18:16:39 +0000 (19:16 +0100)] 
[BUG] disable any analysers for monitoring requests

We must not parse an HTTP request on a monitoring request. In fact,
we should even create a dedicated monitoring analyser.

16 years ago[OPTIM] freq_ctr: do not rotate the counters when reading
Willy Tarreau [Fri, 6 Mar 2009 13:29:25 +0000 (14:29 +0100)] 
[OPTIM] freq_ctr: do not rotate the counters when reading

It's easier to take the counter's age into account when consulting it
than to rotate it first. It also saves some CPU cycles and avoids the
multiply for outdated counters, finally saving CPU cycles here too
when multiple operations need to read the same counter.

The freq_ctr code has also shrinked by one third consecutively to these
optimizations.

16 years ago[CLEANUP] remove last references to term_trace
Willy Tarreau [Fri, 6 Mar 2009 12:07:40 +0000 (13:07 +0100)] 
[CLEANUP] remove last references to term_trace

term_trace was very useful while reworking the lower layers but has almost
completely been removed from every place it was referenced. Even the few
remaining ones were not accurate, so it's better to completely remove those
references and re-add them from scratch later if needed.

16 years ago[BUG] switch server-side stream interface to close in case of abort
Willy Tarreau [Fri, 6 Mar 2009 11:51:23 +0000 (12:51 +0100)] 
[BUG] switch server-side stream interface to close in case of abort

In pure TCP mode, there is no response analyser to switch the server-side
stream interface from INI to CLO when the output has been closed after an
abort. This caused sessions to remain indefinitely active when they were
aborted by the client during a TCP content analysis.

The proper action is to switch the stream interface to the CLO state from
INI when we have write enable and shutdown write.

16 years ago[OPTIM] rate-limit: cleaner behaviour on low rates and reduce consumption
Willy Tarreau [Fri, 6 Mar 2009 08:18:27 +0000 (09:18 +0100)] 
[OPTIM] rate-limit: cleaner behaviour on low rates and reduce consumption

The rate-limit was applied to the smoothed value which does a special
case for frequencies below 2 events per period. This caused irregular
limitations when set to 1 session per second.

The proper way to handle this is to compute the number of remaining
events that can occur without reaching the limit. This is what has
been added. It also has the benefit that the frequency calculation
is now done once when entering event_accept(), before the accept()
loop, and not once per accept() loop anymore, thus saving a few CPU
cycles during very high loads.

With this fix, rate limits of 1/s are perfectly respected.

16 years ago[OPTIM] maintain_proxies: only wake up when the frontend will be ready
Willy Tarreau [Fri, 6 Mar 2009 07:27:10 +0000 (08:27 +0100)] 
[OPTIM] maintain_proxies: only wake up when the frontend will be ready

It's not needed to try to check the frontend's freq counter every
millisecond, we can precisely compute when to wake up.

16 years ago[BUG] typo in timeout error reporting : report *res and not *err
Willy Tarreau [Fri, 6 Mar 2009 07:05:40 +0000 (08:05 +0100)] 
[BUG] typo in timeout error reporting : report *res and not *err

16 years ago[BUG] interface binding: length must include the trailing zero
Willy Tarreau [Thu, 5 Mar 2009 23:48:23 +0000 (00:48 +0100)] 
[BUG] interface binding: length must include the trailing zero

The interface length passed to the setsockopt(SO_BINDTODEVICE) must
include the trailing \0. Otherwise it will randomly fail.

16 years ago[MEDIUM] implement "rate-limit sessions" for the frontend
Willy Tarreau [Thu, 5 Mar 2009 22:48:25 +0000 (23:48 +0100)] 
[MEDIUM] implement "rate-limit sessions" for the frontend

The new "rate-limit sessions" statement sets a limit on the number of
new connections per second on the frontend. As it is extremely accurate
(about 0.1%), it is efficient at limiting resource abuse or DoS.

16 years ago[MINOR] acl: add 2 new verbs: fe_sess_rate and be_sess_rate
Willy Tarreau [Thu, 5 Mar 2009 20:34:28 +0000 (21:34 +0100)] 
[MINOR] acl: add 2 new verbs: fe_sess_rate and be_sess_rate

These new ACLs match frontend session rate and backend session rate.
Examples are provided in the doc to explain how to use that in order
to limit abuse of service.

16 years ago[BUG] the "connslots" keyword was matched as "connlots"
Willy Tarreau [Thu, 5 Mar 2009 18:15:37 +0000 (19:15 +0100)] 
[BUG] the "connslots" keyword was matched as "connlots"

This bug has been lying there since the patch got merged.

16 years ago[MEDIUM] measure and report session rate on frontend, backends and servers
Willy Tarreau [Thu, 5 Mar 2009 17:43:00 +0000 (18:43 +0100)] 
[MEDIUM] measure and report session rate on frontend, backends and servers

With this change, all frontends, backends, and servers maintain a session
counter and a timer to compute a session rate over the last second. This
value will be very useful because it varies instantly and can be used to
check thresholds. This value is also reported in the stats in a new "rate"
column.

16 years ago[MINOR] add curr_sec_ms and curr_sec_ms_scaled for current second.
Willy Tarreau [Thu, 5 Mar 2009 13:54:50 +0000 (14:54 +0100)] 
[MINOR] add curr_sec_ms and curr_sec_ms_scaled for current second.

Several algorithms will need to know the millisecond value within
the current second. Instead of doing a divide every time it is needed,
it's better to compute it when it changes, which is when now and now_ms
are recomputed.

curr_sec_ms_scaled is the same multiplied by 2^32/1000, which will be
useful to compute some ratios based on the position within last second.

16 years ago[MINOR] time: add __usec_to_1024th to convert usecs to 1024th of second
Willy Tarreau [Wed, 4 Mar 2009 23:34:01 +0000 (00:34 +0100)] 
[MINOR] time: add __usec_to_1024th to convert usecs to 1024th of second

This function performs a fast conversion from usec to 1024th of a second,
and will be useful for many fast sub-second computations.

16 years ago[MINOR] errors dump must use user-visible date, not internal date.
Willy Tarreau [Wed, 4 Mar 2009 19:53:44 +0000 (20:53 +0100)] 
[MINOR] errors dump must use user-visible date, not internal date.

16 years ago[DOC] document "show errors"
Willy Tarreau [Wed, 4 Mar 2009 15:33:10 +0000 (16:33 +0100)] 
[DOC] document "show errors"

16 years ago[MEDIUM] implement error dump on unix socket with "show errors"
Willy Tarreau [Wed, 4 Mar 2009 14:53:18 +0000 (15:53 +0100)] 
[MEDIUM] implement error dump on unix socket with "show errors"

The new "show errors" command sent on a unix socket will dump
all captured request and response errors for all proxies. It is
also possible to bound the log to frontends and backends whose
ID is passed as an optional parameter.

The output provides information about frontend, backend, server,
session ID, source address, error type, and error position along
with a complete dump of the request or response which has caused
the error.

If a new error scratches the one currently being reported, then
the dump is aborted with a warning message, and processing goes
on to next error.

16 years ago[MEDIUM] store a complete dump of request and response errors in proxies
Willy Tarreau [Sun, 1 Mar 2009 22:21:47 +0000 (23:21 +0100)] 
[MEDIUM] store a complete dump of request and response errors in proxies

Each proxy instance, either frontend or backend, now has some room
dedicated to storing a complete dated request or response in case
of parsing error. This will make it possible to consult errors in
order to find the exact cause, which is particularly important for
troubleshooting faulty applications.

16 years ago[MINOR] ensure that http_msg_analyzer updates pointer to invalid char
Willy Tarreau [Sun, 1 Mar 2009 10:10:40 +0000 (11:10 +0100)] 
[MINOR] ensure that http_msg_analyzer updates pointer to invalid char

If an invalid character is encountered while parsing an HTTP message, we
want to get buf->lr updated to reflect it.

Along this change, a few useless __label__ declarations have been removed
because they caused gcc to consume stack space without putting anything
there.

16 years ago[BUG] global.tune.maxaccept must be limited even in mono-process mode
Willy Tarreau [Sun, 1 Mar 2009 07:35:41 +0000 (08:35 +0100)] 
[BUG] global.tune.maxaccept must be limited even in mono-process mode

On overloaded systems, it sometimes happens that hundreds or thousands
of incoming connections are queued in the system's backlog, and all get
dequeued at once. The problem is that when haproxy processes them and
does not apply any limit, this can take some time and the internal date
does not progress, resulting in wrong timer measures for all sessions.

The most common effect of this is that all of these sessions report a
large request time (around several hundreds of ms) which is in fact
caused by the time spent accepting other connections. This might happen
on shared systems when the machine swaps.

For this reason, we finally apply a reasonable limit even in mono-process
mode. Accepting 100 connections at once is fast enough for extreme cases
and will not cause that much of a trouble when the system is saturated.

16 years ago[BUG] the "source" keyword must first clear optional settings
Willy Tarreau [Sun, 1 Mar 2009 07:27:21 +0000 (08:27 +0100)] 
[BUG] the "source" keyword must first clear optional settings

Problem reported by John Lauro. When "source ... usesrc ..." is
set in the defaults section, it is not possible anymore to remove
the "usesrc" part when declaring a more precise "source" in a
backend. The only workaround was to declare it by server.

We need to clear optional settings when declaring a new "source".
The problem was the same with the "interface" declaration.

16 years ago[BUILD] proto_http did not build on gcc-2.95
Willy Tarreau [Tue, 24 Feb 2009 09:48:35 +0000 (10:48 +0100)] 
[BUILD] proto_http did not build on gcc-2.95

move the DPRINTF below the local variable declarations.

16 years ago[DOC] add diagrams of queuing and future ACL design
Willy Tarreau [Sun, 22 Feb 2009 15:46:38 +0000 (16:46 +0100)] 
[DOC] add diagrams of queuing and future ACL design

These ones have remained for many months out of tree. Let's merge them.

16 years ago[BUG] fix unix socket processing of interrupted output
Willy Tarreau [Sun, 22 Feb 2009 14:58:45 +0000 (15:58 +0100)] 
[BUG] fix unix socket processing of interrupted output

Unix socket processing was still quite buggy. It did not properly
handle interrupted output due to a full response buffer. The fix
mainly consists in not trying to prematurely enable write on the
response buffer, just like the standard session works. This also
gets the unix socket code closer to the standard session code
handling.

16 years ago[BUG] fix random memory corruption using "show sess"
Willy Tarreau [Sun, 22 Feb 2009 14:17:24 +0000 (15:17 +0100)] 
[BUG] fix random memory corruption using "show sess"

Commit 8a5c626e73bac905d150185e45110525588d7b4c introduced the sessions
dump on the unix socket. This implementation is buggy because it may try
to link to the sessions list's head after the last session is removed
with a backref. Also, for the LIST_ISEMPTY test to succeed, we have to
proceed with LIST_INIT after LIST_DEL.

16 years ago[DOC] document a few missing info about errorfile
Willy Tarreau [Sun, 22 Feb 2009 11:02:30 +0000 (12:02 +0100)] 
[DOC] document a few missing info about errorfile

16 years ago[DOC] document HTTP status codes
Willy Tarreau [Sun, 22 Feb 2009 10:12:23 +0000 (11:12 +0100)] 
[DOC] document HTTP status codes

16 years ago[DOC] filled the logging section of the configuration manual
Willy Tarreau [Sun, 22 Feb 2009 09:53:55 +0000 (10:53 +0100)] 
[DOC] filled the logging section of the configuration manual

Some parts from the previous doc about logging have been merged and
updated. Most of those parts have been reworked and completed. The
examples are now accurate and reflect recent versions.

16 years ago[DOC] document maxpipes, nosplice, option splice-{auto,request,response}
Willy Tarreau [Fri, 6 Feb 2009 10:28:13 +0000 (11:28 +0100)] 
[DOC] document maxpipes, nosplice, option splice-{auto,request,response}

16 years ago[BUILD] Haproxy won't compile if DEBUG_FULL is defined
Vincenzo Farruggia [Fri, 30 Jan 2009 16:49:10 +0000 (16:49 +0000)] 
[BUILD] Haproxy won't compile if DEBUG_FULL is defined

As subject when i try to compile haproxy with -DDEBUG_FULL it stop at
stream_sock.c file with:
gcc -Iinclude -Wall -O2 -g     -DDEBUG_FULL  -DTPROXY -DENABLE_POLL
-DENABLE_EPOLL -DENABLE_SEPOLL -DNETFILTER -DUSE_GETSOCKNAME
-DCONFIG_HAPROXY_VERSION=\"1.3.15\"
-DCONFIG_HAPROXY_DATE=\"2008/04/19\" -c -o src/stream_sock.o
src/stream_sock.c
src/stream_sock.c: In function 'stream_sock_chk_rcv':
src/stream_sock.c:905: error: 'fd' undeclared (first use in this function)
src/stream_sock.c:905: error: (Each undeclared identifier is reported only once
src/stream_sock.c:905: error: for each function it appears in.)
src/stream_sock.c:905: error: 'ob' undeclared (first use in this function)
src/stream_sock.c: In function 'stream_sock_chk_snd':
src/stream_sock.c:940: error: 'fd' undeclared (first use in this function)
src/stream_sock.c:940: error: 'ib' undeclared (first use in this function)
make: *** [src/stream_sock.o] Error 1

With this patch all build fine:

16 years ago[CRITICAL] fix server state tracking: it was O(n!) instead of O(n)
Krzysztof Piotr Oledzki [Thu, 29 Jan 2009 23:52:49 +0000 (00:52 +0100)] 
[CRITICAL] fix server state tracking: it was O(n!) instead of O(n)

Using the wrong operator (&& instead of &) causes DOWN->UP
transition to take longer than it should and to produce a lot of
redundant logs. With typical "track" usage (1-6 tracking servers) it
shouldn't make a big difference but for heavily tracked servers
this bug leads to hang with 100% CPU usage and extremely big
log spam.

16 years ago[MEDIUM] implement bind-process to limit service presence by process
Willy Tarreau [Wed, 4 Feb 2009 21:05:05 +0000 (22:05 +0100)] 
[MEDIUM] implement bind-process to limit service presence by process

The "bind-process" keyword lets the admin select which instances may
run on which process (in multi-process mode). It makes it easier to
more evenly distribute the load across multiple processes by avoiding
having too many listen to the same IP:ports.

16 years ago[MEDIUM] add support for source interface binding at the server level
Willy Tarreau [Wed, 4 Feb 2009 19:20:58 +0000 (20:20 +0100)] 
[MEDIUM] add support for source interface binding at the server level

Add support for "interface <name>" after the "source" statement on
the server line.

16 years ago[MEDIUM] add support for source interface binding
Willy Tarreau [Wed, 4 Feb 2009 17:46:54 +0000 (18:46 +0100)] 
[MEDIUM] add support for source interface binding

Specifying "interface <name>" after the "source" statement allows
one to bind to a specific interface for proxy<->server traffic.

This makes it possible to use multiple links to reach multiple
servers, and to force traffic to pass via an interface different
from the one the system would have chosen based on the routing
table.

16 years ago[BUG] inform the user when root is expected but not set
Willy Tarreau [Wed, 4 Feb 2009 17:02:48 +0000 (18:02 +0100)] 
[BUG] inform the user when root is expected but not set

When a plain user runs haproxy as non-root but some options require
root, let's inform him.

16 years ago[MINOR] add support for bind interface name
Willy Tarreau [Wed, 4 Feb 2009 16:19:29 +0000 (17:19 +0100)] 
[MINOR] add support for bind interface name

By appending "interface <name>" to a "bind" line, it is now possible
to specifically bind to a physical interface name. Note that this
currently only works on Linux and requires root privileges.

16 years ago[BUG] we must not exit if protocol binding only returns a warning
Willy Tarreau [Wed, 4 Feb 2009 16:05:23 +0000 (17:05 +0100)] 
[BUG] we must not exit if protocol binding only returns a warning

Right now, protocol binding cannot return a warning, but when this
will happen, we must not exit but just print the warning.

16 years ago[DOC] remove buggy comment for use_backend
Krzysztof Piotr Oledzki [Tue, 27 Jan 2009 20:09:41 +0000 (21:09 +0100)] 
[DOC] remove buggy comment for use_backend

"early blocking based on ACLs" is definitely wrong here

16 years ago[BUG] Fix listen & more of 2 couples <ip>:<port>
Krzysztof Piotr Oledzki [Tue, 27 Jan 2009 15:57:08 +0000 (16:57 +0100)] 
[BUG] Fix listen & more of 2 couples <ip>:<port>

Fix "listen www-mutualise 80.248.x.y1:80,80.248.x.y2:80,80.248.x.y3:80":

[ALERT] 309/161509 (15450) : Invalid server address: '80.248.x.y1:80,80.248.x.y2'
[ALERT] 309/161509 (15450) : Error reading configuration file : /etc/haproxy/haproxy.cfg

Bug reported by Laurent Dolosor.

16 years ago[BUILD] add USE_LINUX_SPLICE to enable LINUX_SPLICE on linux 2.6
Willy Tarreau [Sun, 25 Jan 2009 15:13:42 +0000 (16:13 +0100)] 
[BUILD] add USE_LINUX_SPLICE to enable LINUX_SPLICE on linux 2.6

This will provide high performance data forwarding between sockets,
but it is broken on many kernels and will sometimes forward corrupted
data without some kernel patches. Consider this experimental for now.

16 years ago[MEDIUM] splice: add the global "nosplice" option
Willy Tarreau [Sun, 25 Jan 2009 15:03:28 +0000 (16:03 +0100)] 
[MEDIUM] splice: add the global "nosplice" option

Setting "nosplice" in the global section will disable the use of TCP
splicing (both tcpsplice and linux 2.6 splice). The same will be
achieved using the "-dS" parameter on the command line.

16 years ago[MEDIUM] move global tuning options to the global structure
Willy Tarreau [Sun, 25 Jan 2009 14:42:27 +0000 (15:42 +0100)] 
[MEDIUM] move global tuning options to the global structure

The global tuning options right now only concern the polling mechanisms,
and they are not in the global struct itself. It's not very practical to
add other options so let's move them to the global struct and remove
types/polling.h which was not used for anything else.

16 years ago[BUILD] fix snapshot date extraction with negative timezones
Willy Tarreau [Sun, 25 Jan 2009 13:10:48 +0000 (14:10 +0100)] 
[BUILD] fix snapshot date extraction with negative timezones

Building with a last commit having a negative time offset would make
"date" complain.

16 years ago[OPTIM] make global.maxpipes default to global.maxconn/4 when not specified
Willy Tarreau [Sun, 25 Jan 2009 13:06:58 +0000 (14:06 +0100)] 
[OPTIM] make global.maxpipes default to global.maxconn/4 when not specified

global.maxconn/4 seems to be a good hint for global.maxpipes when that
one must be guessed. If the limit is reached, it's still possible to
set it manually in the configuration.

16 years ago[STATS] report pipe usage in the statistics
Willy Tarreau [Sun, 25 Jan 2009 13:02:00 +0000 (14:02 +0100)] 
[STATS] report pipe usage in the statistics

Pipe usage is reported in info and web stats including maxpipes, pipes_free,
and pipes_used.

16 years ago[MEDIUM] splice: make use of pipe pools
Willy Tarreau [Sun, 25 Jan 2009 12:56:13 +0000 (13:56 +0100)] 
[MEDIUM] splice: make use of pipe pools

Using pipe pools makes pipe management a lot easier. It also allows to
remove quite a bunch of #ifdefs in areas which depended on the presence
or not of support for kernel splicing.

The buffer now holds a pointer to a pipe structure which is always NULL
except if there are still data in the pipe. When it needs to use that
pipe, it dynamically allocates it from the pipe pool. When the data is
consumed, the pipe is immediately released.

That way, there is no need anymore to care about pipe closure upon
session termination, nor about pipe creation when trying to use
splice().

Another immediate advantage of this method is that it considerably
reduces the number of pipes needed to use splice(). Tests have shown
that even with 0.2 pipe per connection, almost all sessions can use
splice(), because the same pipe may be used by several consecutive
calls to splice().

16 years ago[MEDIUM] introduce pipe pools
Willy Tarreau [Sun, 25 Jan 2009 12:49:53 +0000 (13:49 +0100)] 
[MEDIUM] introduce pipe pools

A new data type has been added : pipes. Some pre-allocated empty pipes
are maintained in a pool for users such as splice which use them a lot
for very short times.

Pipes are allocated using get_pipe() and released using put_pipe().
Pipes which are released with pending data are immediately killed.
The struct pipe is small (16 to 20 bytes) and may even be further
reduced by unifying ->data and ->next.

It would be nice to have a dedicated cleanup task which would watch
for the pipes usage and destroy a few of them from time to time.

16 years ago[BUILD] fix Makefile.bsd and Makefile.osx for stream_interface
Ross West [Thu, 22 Jan 2009 23:32:41 +0000 (18:32 -0500)] 
[BUILD] fix Makefile.bsd and Makefile.osx for stream_interface

Did a full compile of the 1.3.15.7 - 20081208 snapshot on Freebsd-7.x
recently, and noted that there needs to be a quick patch done on the
Makefile for bsd machines.

This was due to the stream_interface replacing the send data commands
in the rewrite Willy did a while ago.

Simple fix, and it compiled cleanly otherwise.  Thanks for the work
Willy!

Cheers,
  Ross.

-=

16 years ago[MEDIUM] splice: add hints to support older buggy kernels
Willy Tarreau [Sun, 25 Jan 2009 10:11:32 +0000 (11:11 +0100)] 
[MEDIUM] splice: add hints to support older buggy kernels

Kernels before 2.6.27.13 would have splice() return EAGAIN on shutdown.
By adding a few tricks, we can deal with the situation. If splice()
returns EAGAIN and the pipe is empty, then fallback to recv() which
will be able to check if it's an end of connection or not.

The advantage of this method is that it remains transparent for good
kernels since there is no reason that epoll() will return EPOLLIN
without anything to read, and even if it would happen, the recv()
overhead on this check is minimal.

16 years ago[BUG] reserve some pipes for backends with splice enabled
Willy Tarreau [Sun, 25 Jan 2009 09:42:05 +0000 (10:42 +0100)] 
[BUG] reserve some pipes for backends with splice enabled

If splicing is enabled in a backend, we need to guess how many
pipes will be needed. We used to rely on fullconn, but this leads
to non-working splicing when fullconn is not specified. So we now
fallback to global.maxconn.

16 years ago[MAJOR] complete support for linux 2.6 kernel splicing
Willy Tarreau [Sun, 18 Jan 2009 23:32:22 +0000 (00:32 +0100)] 
[MAJOR] complete support for linux 2.6 kernel splicing

This code provides support for linux 2.6 kernel splicing. This feature
appeared in kernel 2.6.25, but initial implementations were awkward and
buggy. A kernel >= 2.6.29-rc1 is recommended, as well as some optimization
patches.

Using pipes, this code is able to pass network data directly between
sockets. The pipes are a bit annoying to manage (fd creation, release,
...) but finally work quite well.

Preliminary tests show that on high bandwidths, there's a substantial
gain (approx +50%, only +20% with kernel workarounds for corruption
bugs). With 2000 concurrent connections, with Myricom NICs, haproxy
now more easily achieves 4.5 Gbps for 1 process and 6 Gbps for two
processes buffers. 8-9 Gbps are easily reached with smaller numbers
of connections.

We also try to splice out immediately after a splice in by making
profit from the new ability for a data producer to notify the
consumer that data are available. Doing this ensures that the
data are immediately transferred between sockets without latency,
and without having to re-poll. Performance on small packets has
considerably increased due to this method.

Earlier kernels return only one TCP segment at a time in non-blocking
splice-in mode, while newer return as many segments as may fit in the
pipe. To work around this limitation without hurting more recent kernels,
we try to collect as much data as possible, but we stop when we believe
we have read 16 segments, then we forward everything at once. It also
ensures that even upon shutdown or EAGAIN the data will be forwarded.

Some tricks were necessary because the splice() syscall does not make
a difference between missing data and a pipe full, it always returns
EAGAIN. The trick consists in stop polling in case of EAGAIN and a non
empty pipe.

The receiver waits for the buffer to be empty before using the pipe.
This is in order to avoid confusion between buffer data and pipe data.
The BF_EMPTY flag now covers the pipe too.

Right now the code is disabled by default. It needs to be built with
CONFIG_HAP_LINUX_SPLICE, and the instances intented to use splice()
must have "option splice-response" (or option splice-request) enabled.

It is probably desirable to keep a pool of pre-allocated pipes to
avoid having to create them for every session. This will be worked
on later.

Preliminary tests show very good results, even with the kernel
workaround causing one memcpy(). At 3000 connections, performance
has moved from 3.2 Gbps to 4.7 Gbps.

16 years ago[MEDIUM] add definitions for Linux kernel splicing
Willy Tarreau [Sun, 18 Jan 2009 20:59:13 +0000 (21:59 +0100)] 
[MEDIUM] add definitions for Linux kernel splicing

Some older libc don't define the splice() syscall, and some even
define a wrong one. For this reason, we try our best to declare
it correctly. These definitions still work with recent glibc.

16 years ago[MINOR] introduce structures required to support Linux kernel splicing
Willy Tarreau [Sun, 18 Jan 2009 20:56:21 +0000 (21:56 +0100)] 
[MINOR] introduce structures required to support Linux kernel splicing

When CONFIG_HAP_LINUX_SPLICE is defined, the buffer structure will be
slightly enlarged to support information needed for kernel splicing
on Linux.

A first attempt consisted in putting this information into the stream
interface, but in the long term, it appeared really awkward. This
version puts the information into the buffer. The platform-dependant
part is conditionally added and will only enlarge the buffers when
compiled in.

One new flag has also been added to the buffers: BF_KERN_SPLICING.
It indicates that the application considers it is appropriate to
use splicing to forward remaining data.

16 years ago[MEDIUM] splice: add configuration options and set global.maxpipes
Willy Tarreau [Sun, 18 Jan 2009 20:44:07 +0000 (21:44 +0100)] 
[MEDIUM] splice: add configuration options and set global.maxpipes

Three new options have been added when CONFIG_HAP_LINUX_SPLICE is
set :
  - splice-request
  - splice-response
  - splice-auto

They are used to enable splicing per frontend/backend. They are also
supported in defaults sections. The "splice-auto" option is meant to
automatically turn splice on for buffers marked as fast streamers.
This should save quite a bunch of file descriptors.

It was required to add a new "options2" field to the proxy structure
because the original "options" is full.

When global.maxpipes is not set, it is automatically adjusted to
the max of the sums of all frontend's and backend's maxconns for
those which have at least one splice option enabled.

16 years ago[MINOR] global.maxpipes: add the ability to reserve file descriptors for pipes
Willy Tarreau [Sun, 18 Jan 2009 19:39:42 +0000 (20:39 +0100)] 
[MINOR] global.maxpipes: add the ability to reserve file descriptors for pipes

This will be needed to use linux's splice() syscall.

16 years ago[MEDIUM] stream_sock: try to send pending data on chk_snd()
Willy Tarreau [Sun, 18 Jan 2009 16:38:44 +0000 (17:38 +0100)] 
[MEDIUM] stream_sock: try to send pending data on chk_snd()

When the producer calls stream_sock_chk_snd(), we now try to send
all pending data asynchronously. If it succeeds, we don't have to
enable polling on the FD which saves about half of the calls to
epoll_wait().

In stream_sock_read(), we finally set the WAIT_ROOM flag as soon as
possible, in preparation of the splice code. We reset it when we
detect that some room has been released either in the buffer or in
the splice.

16 years ago[MINOR] stream_sock: fix a few wrong empty calculations
Willy Tarreau [Sun, 18 Jan 2009 16:37:33 +0000 (17:37 +0100)] 
[MINOR] stream_sock: fix a few wrong empty calculations

16 years ago[MEDIUM] stream_sock_read: call ->chk_snd whenever there are data pending
Willy Tarreau [Sun, 18 Jan 2009 15:25:31 +0000 (16:25 +0100)] 
[MEDIUM] stream_sock_read: call ->chk_snd whenever there are data pending

The condition to cakk ->chk_snd() in stream_sock_read() was suboptimal
because we did not call it when the socket was shut down nor when there
was an error after data were added.

Now we ensure to call is whenever there are data pending.

Also, the "full" condition was handled before calling chk_snd(), which
could cause deadlock issues if chk_snd() did consume some data.

16 years ago[MEDIUM] split stream_sock_write() into callback and core functions
Willy Tarreau [Sun, 18 Jan 2009 14:30:37 +0000 (15:30 +0100)] 
[MEDIUM] split stream_sock_write() into callback and core functions

stream_sock_write() has been split in two parts :
  - the poll callback, intented to be called when an I/O event has
    been detected
  - the write() core function, which ought to be usable from various
    other places, possibly not meant to wake the task up.

The code has also been slightly cleaned up in the process. It's more
readable now.

16 years ago[CLEANUP] stream_sock: move the write-nothing condition out of the loop
Willy Tarreau [Fri, 9 Jan 2009 12:05:19 +0000 (13:05 +0100)] 
[CLEANUP] stream_sock: move the write-nothing condition out of the loop

Some tricks to handle situations where we write nothing were in the
middle of the main loop in stream_sock_write(). This cleanup provides
better source and object code, and slightly shrinks the output code.

16 years ago[CLEANUP] replace a few occurrences of (flags & X) && !(flags & Y)
Willy Tarreau [Fri, 9 Jan 2009 11:18:24 +0000 (12:18 +0100)] 
[CLEANUP] replace a few occurrences of (flags & X) && !(flags & Y)

This construct collapses into ((flags & (X|Y)) == X) when X is a
single-bit flag. This provides a noticeable code shrink and the
output code results in less conditional jumps.

16 years ago[OPTIM] stream_sock: factor out the buffer full handling out of the loop
Willy Tarreau [Fri, 9 Jan 2009 10:38:52 +0000 (11:38 +0100)] 
[OPTIM] stream_sock: factor out the buffer full handling out of the loop

Handling the buffer full condition is not trivial and this code was
duplicated inside the loop. Move it out of the loop at a single place.

16 years ago[OPTIM] buffer: replace rlim by max_len
Willy Tarreau [Fri, 9 Jan 2009 10:13:00 +0000 (11:13 +0100)] 
[OPTIM] buffer: replace rlim by max_len

In the buffers, the read limit used to leave some place for header
rewriting was set by a pointer to the end of the buffer. Not only
this required subtracts at every place in the code, but this will
also soon not be usable anymore when we want to support keepalive.

Let's replace this with a length limit, comparable to the buffer's
length. This has also sightly reduced the code size.

16 years ago[OPTIM] stream_sock: do not ask for polling on EAGAIN if we have read
Willy Tarreau [Thu, 8 Jan 2009 09:09:08 +0000 (10:09 +0100)] 
[OPTIM] stream_sock: do not ask for polling on EAGAIN if we have read

It is not always wise to return 0 in stream_sock_read() upon EAGAIN,
because if we have read enough data, we should consider that enough
and try again later without polling in between.

We still make a difference between small reads and large reads though.
Small reads still lead to polling because we're sure that there's
nothing left in the system's buffers if we read less than one MSS.

16 years ago[MEDIUM] i/o: rework ->to_forward and ->send_max
Willy Tarreau [Wed, 7 Jan 2009 23:09:41 +0000 (00:09 +0100)] 
[MEDIUM] i/o: rework ->to_forward and ->send_max

The way the buffers and stream interfaces handled ->to_forward was
really not handy for multiple reasons. Now we've moved its control
to the receive-side of the buffer, which is also responsible for
keeping send_max up to date. This makes more sense as it now becomes
possible to send some pre-formatted data followed by forwarded data.

The following explanation has also been added to buffer.h to clarify
the situation. Right now, tests show that the I/O is behaving extremely
well. Some work will have to be done to adapt existing splice code
though.

/* Note about the buffer structure

   The buffer contains two length indicators, one to_forward counter and one
   send_max limit. First, it must be understood that the buffer is in fact
   split in two parts :
     - the visible data (->data, for ->l bytes)
     - the invisible data, typically in kernel buffers forwarded directly from
       the source stream sock to the destination stream sock (->splice_len
       bytes). Those are used only during forward.

   In order not to mix data streams, the producer may only feed the invisible
   data with data to forward, and only when the visible buffer is empty. The
   consumer may not always be able to feed the invisible buffer due to platform
   limitations (lack of kernel support).

   Conversely, the consumer must always take data from the invisible data first
   before ever considering visible data. There is no limit to the size of data
   to consume from the invisible buffer, as platform-specific implementations
   will rarely leave enough control on this. So any byte fed into the invisible
   buffer is expected to reach the destination file descriptor, by any means.
   However, it's the consumer's responsibility to ensure that the invisible
   data has been entirely consumed before consuming visible data. This must be
   reflected by ->splice_len. This is very important as this and only this can
   ensure strict ordering of data between buffers.

   The producer is responsible for decreasing ->to_forward and increasing
   ->send_max. The ->to_forward parameter indicates how many bytes may be fed
   into either data buffer without waking the parent up. The ->send_max
   parameter says how many bytes may be read from the visible buffer. Thus it
   may never exceed ->l. This parameter is updated by any buffer_write() as
   well as any data forwarded through the visible buffer.

   The consumer is responsible for decreasing ->send_max when it sends data
   from the visible buffer, and ->splice_len when it sends data from the
   invisible buffer.

   A real-world example consists in part in an HTTP response waiting in a
   buffer to be forwarded. We know the header length (300) and the amount of
   data to forward (content-length=9000). The buffer already contains 1000
   bytes of data after the 300 bytes of headers. Thus the caller will set
   ->send_max to 300 indicating that it explicitly wants to send those data,
   and set ->to_forward to 9000 (content-length). This value must be normalised
   immediately after updating ->to_forward : since there are already 1300 bytes
   in the buffer, 300 of which are already counted in ->send_max, and that size
   is smaller than ->to_forward, we must update ->send_max to 1300 to flush the
   whole buffer, and reduce ->to_forward to 8000. After that, the producer may
   try to feed the additional data through the invisible buffer using a
   platform-specific method such as splice().
 */

16 years ago[MEDIUM] stream_sock: factor out the return path in case of no-writes
Willy Tarreau [Wed, 7 Jan 2009 19:10:39 +0000 (20:10 +0100)] 
[MEDIUM] stream_sock: factor out the return path in case of no-writes

Previously, we wrote nothing only if the buffer was empty. Now with
send_max, we can also write nothing because we are not allowed to send
anything due to send_max.

The code starts to look like spaghetti. It needs to be rearranged a
lot before merging the splice patches.

16 years ago[MINOR] add the splice_len member to the buffer struct in preparation of splice support
Willy Tarreau [Wed, 7 Jan 2009 18:33:39 +0000 (19:33 +0100)] 
[MINOR] add the splice_len member to the buffer struct in preparation of splice support

In preparation of splice support, let's add the splice_len member
to the buffer struct. An earlier implementation made it conditional,
which made the whole logics very complex due to a large number of
ifdefs.

Now BF_EMPTY is only set once both buf->l and buf->splice_len are
null. Splice_len is initialized to zero during buffer creation and
is currently not changed, so the whole logics remains unaffected.

When splice gets merged, splice_len will reflect the number of bytes
in flight out of the buffer but not yet sent, typically in a pipe for
the Linux case.

16 years ago[MAJOR] implement autonomous inter-socket forwarding
Willy Tarreau [Sun, 14 Dec 2008 16:31:54 +0000 (17:31 +0100)] 
[MAJOR] implement autonomous inter-socket forwarding

If an analyser sets buf->to_forward to a given value, that many
data will be forwarded between the two stream interfaces attached
to a buffer without waking the task up. The same applies once all
analysers have been released. This saves a large amount of calls
to process_session() and a number of task_dequeue/queue.

16 years ago[MEDIUM] enable inter-stream_interface wakeup calls
Willy Tarreau [Sun, 14 Dec 2008 13:42:35 +0000 (14:42 +0100)] 
[MEDIUM] enable inter-stream_interface wakeup calls

By letting the producer tell the consumer there is data to check,
and the consumer tell the producer there is some space left again,
we can cut in half the number of session wakeups.

This is also an important starting point for future splicing support.

16 years ago[MINOR] add flags to indicate when a stream interface is waiting for space/data
Willy Tarreau [Sun, 14 Dec 2008 12:26:20 +0000 (13:26 +0100)] 
[MINOR] add flags to indicate when a stream interface is waiting for space/data

It will soon be required to know when a stream interface is waiting for
buffer data or buffer room. Let's add two flags for that.

16 years ago[MEDIUM] indicate when we don't care about read timeout
Willy Tarreau [Sun, 14 Dec 2008 08:04:47 +0000 (09:04 +0100)] 
[MEDIUM] indicate when we don't care about read timeout

Sometimes we don't care about a read timeout, for instance, from the
client when waiting for the server, but we still want the client to
be able to read.

Till now it was done by articially forcing the read timeout to ETERNITY.
But this will cause trouble when we want the low level stream sock to
communicate without waking the session up. So we add a BF_READ_NOEXP
flag to indicate that when the read timeout is to be set, it might
have to be set to ETERNITY.

Since BF_READ_ENA was not used, we replaced this flag.

16 years ago[MEDIUM] don't report buffer timeout when there is I/O activity
Willy Tarreau [Sat, 13 Dec 2008 21:25:59 +0000 (22:25 +0100)] 
[MEDIUM] don't report buffer timeout when there is I/O activity

We don't want to report a buffer timeout if there was I/O activity
for the same events. That way we'll not have to always re-arm timeouts
on I/O, without the fear of a timeout triggering too fast.

16 years ago[MEDIUM] add a send limit to a buffer
Willy Tarreau [Sat, 13 Dec 2008 20:12:26 +0000 (21:12 +0100)] 
[MEDIUM] add a send limit to a buffer

For keep-alive, line-mode protocols and splicing, we will need to
limit the sender to process a certain amount of bytes. The limit
is automatically set to the buffer size when analysers are detached
from the buffer.

16 years ago[MINOR] transfer errors were not reported anymore in data phase
Willy Tarreau [Sun, 14 Dec 2008 10:44:04 +0000 (11:44 +0100)] 
[MINOR] transfer errors were not reported anymore in data phase

16 years ago[BUG] "option transparent" is for backend, not frontend !
Willy Tarreau [Tue, 23 Dec 2008 22:13:55 +0000 (23:13 +0100)] 
[BUG] "option transparent" is for backend, not frontend !

"option transparent" was set and checked on frontends only while it
is purely a backend thing as it replaces the "balance" mode. For this
reason, it did only work in "listen" sections. This change will then
not affect the rare users of this option.

16 years ago[BUG] check timeout must not be changed if timeout.check is not set
Willy Tarreau [Sun, 21 Dec 2008 12:00:41 +0000 (13:00 +0100)] 
[BUG] check timeout must not be changed if timeout.check is not set

This causes health checks to stop after some time since the new
ticks-based scheduler because a check timeout is set to eternity.
This fix must be merged into master but not in earlier versions
as it only affects the new scheduler.
(cherry picked from commit e349eb452b655dc1adc059f05ba8b36565753393)

16 years ago[MINOR] stats: indicate if a task is running in "show sess"
Willy Tarreau [Sun, 7 Dec 2008 23:16:21 +0000 (00:16 +0100)] 
[MINOR] stats: indicate if a task is running in "show sess"

It's sometimes useful to know that a task is currently running.

16 years ago[BUG] do not dequeue the backend's pending connections on a dead server
Willy Tarreau [Thu, 4 Dec 2008 08:33:58 +0000 (09:33 +0100)] 
[BUG] do not dequeue the backend's pending connections on a dead server

Kai Krueger found that previous patch was incomplete, because there is
an unconditionnal call to process_srv_queue() in session_free() which
still causes a dead server to consume pending connections from the
backend.

This call was made unconditionnal so that we don't leave unserved
connections in the server queue, for instance connections coming
in with "option persist" which can bypass the server status check.
However, the server must not touch the backend's queue if it is down.

Another fear was that some connections might remain unserved when
the server is using a dynamic maxconn if the number of connections
to the backend is too low. Right now, srv_dynamic_maxconn() ensures
this cannot happen, so the call can remain conditionnal.

The fix consists in allowing a server to process it own queue whatever
its state, but not to touch the backend's queue if it is down. Its
queue should normally be empty when the server is down because it is
redistributed when the server goes down. The only remaining cases are
precisely the persistent connections with "option persist" set, coming
in after the queue has been redispatched. Those ones must still be
processed when a connection terminates.
(cherry picked from commit cd485c44807bfcdb4928dd83c1907636b4e1b6f3)

16 years ago[BUG] do not dequeue requests on a dead server
Willy Tarreau [Sun, 30 Nov 2008 20:51:58 +0000 (21:51 +0100)] 
[BUG] do not dequeue requests on a dead server

Kai Krueger reported a problem when a server goes down with active
connections. A lot of connections were drained by that server. Kai
did an amazing job at tracking this bug down to the dequeuing
mechanism which forgets to check the server state before allowing
a request to be sent to a server.

The problem occurs more often with long requests, which have a chance
to complete after the server is completely marked down, and to find
requests in the global queue which have not yet been fetched by other
servers.

The fix consists in ensuring that a server is up before sending it
any new request from the queue.
(cherry picked from commit 80b286a064eaec828b7fd10e98e3f945e8b244f3)
(cherry picked from commit 2e5e0d2853f059a1d09dc81fdbbad9fd03124a98)

16 years ago[MINOR] redirect: in prefix mode a "/" means not to change the URI
Willy Tarreau [Wed, 19 Nov 2008 20:15:17 +0000 (21:15 +0100)] 
[MINOR] redirect: in prefix mode a "/" means not to change the URI

If the prefix is set to "/", it means the user does not want to alter
the original URI, so we don't want to insert a new slash before the
original URI.

(cherry-picked from commit 02a35c74942c1bce762e996698add1270e6a5030)

16 years ago[MINOR] redirect: add support for "set-cookie" and "clear-cookie"
Willy Tarreau [Wed, 19 Nov 2008 20:07:09 +0000 (21:07 +0100)] 
[MINOR] redirect: add support for "set-cookie" and "clear-cookie"

It is now possible to set or clear a cookie during a redirection. This
is useful for logout pages, or for protecting against some DoSes. Check
the documentation for the options supported by the "redirect" keyword.

(cherry-picked from commit 4af993822e880d8c932f4ad6920db4c9242b0981)

16 years ago[MINOR] redirect: add support for the "drop-query" option
Willy Tarreau [Wed, 19 Nov 2008 19:03:04 +0000 (20:03 +0100)] 
[MINOR] redirect: add support for the "drop-query" option

If "drop-query" is present on a "redirect" line using the "prefix" mode,
then the returned Location header will be the request URI without the
query-string. This may be used on some login/logout pages, or when it
must be decided to redirect the user to a non-secure server.

(cherry-picked from commit f2d361ccd73aa16538ce767c766362dd8f0a88fd)

16 years ago[BUG] critical errors should be reported even in daemon mode
Willy Tarreau [Sun, 16 Nov 2008 06:40:34 +0000 (07:40 +0100)] 
[BUG] critical errors should be reported even in daemon mode

Josh Goebel reported that haproxy silently dies when it fails to
chroot. In fact, it does so when in daemon mode, because daemon
mode has been disabling output for ages.

Since the code has been reworked, this could have been changed
because there is no reason for this anymore, hence this patch.
(cherry picked from commit 304d6fb00fe32fca1bd932a301d4afb7d54c92bc)
(cherry picked from commit 50b7f7f12c67322c793f50a6be009f0fd0eec1bb)

16 years ago[BUILD] fix MANDIR default location to match documentation
Jeremy Hinegardner [Sun, 16 Nov 2008 00:29:03 +0000 (17:29 -0700)] 
[BUILD] fix MANDIR default location to match documentation

I found this while building for Fedora.
(cherry picked from commit a2b53f8831b84b7c8647d7e960b84defd3bcbfa8)
(cherry picked from commit 2cac232b966a252951073d7b1a4bba4c4a730978)

16 years ago[MINOR] cfgparse: fix off-by 2 in error message size
Jeffrey 'jf' Lim [Sat, 4 Oct 2008 16:07:00 +0000 (18:07 +0200)] 
[MINOR] cfgparse: fix off-by 2 in error message size

was just looking through the source, and noticed this... :)
(cherry picked from commit 63b76be713784f487e8d0c859a85513642fe7bdc)
(cherry picked from commit a801db6c5ea750f93a3795dbb2e70c03e05bbef4)

16 years ago[BUG] cookie capture is declared in the frontend but checked on the backend
Willy Tarreau [Fri, 17 Oct 2008 10:01:58 +0000 (12:01 +0200)] 
[BUG] cookie capture is declared in the frontend but checked on the backend

Cookie capture would only work by pure luck on the request but did
never work on responses since only the backend was checked. The fix
consists in always checking frontend for cookie captures.
(cherry picked from commit a83c5ba9315a7c47cda2698280b7e49a9d3eb374)

16 years ago[BUG] acl-related keywords are not allowed in defaults sections
Willy Tarreau [Sun, 12 Oct 2008 15:26:37 +0000 (17:26 +0200)] 
[BUG] acl-related keywords are not allowed in defaults sections

Using an ACL-related keyword in the defaults section causes a
segfault during parsing because the list headers are not initialized.
We must initialize list headers for default instance and reject
keywords relying on ACLs.
(cherry picked from commit 1c90a6ec20946a713e9c93995a8e91ed3eeb9da4)
(cherry picked from commit eb8131b4e418b838b2d62d991d91d94482ba49de)

16 years ago[BUG] ensure that listeners from disabled proxies are correctly unbound.
Willy Tarreau [Sun, 12 Oct 2008 10:07:48 +0000 (12:07 +0200)] 
[BUG] ensure that listeners from disabled proxies are correctly unbound.

There is a problem when an instance is marked "disabled". Its ports are
still bound but will not be unbound upon termination. This causes processes
to accumulate during soft restarts, and might even cause failures to restart
new ones due to the inability to bind to the same port.

The ideal solution would be to bind all ports at the end of the configuration
parsing. An acceptable workaround is to unbind all listeners of disabled
proxies. This is what the current patch does.
(cherry picked from commit a944218e9c1d5ff1aca34609146389dc680335b7)
(cherry picked from commit 8cfebbb82b87345bade831920177077e7d25840a)