]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
13 years agoDOC: log-format documentation
William Lallemand [Mon, 30 Jan 2012 15:47:22 +0000 (16:47 +0100)] 
DOC: log-format documentation

13 years agoMEDIUM: log: make http_sess_log use log_format
William Lallemand [Wed, 8 Feb 2012 15:38:44 +0000 (16:38 +0100)] 
MEDIUM: log: make http_sess_log use log_format

http_sess_log now use the logformat linked list to make the log
string, snprintf is not used for speed issue.

CLF mode also uses logformat.

NOTE: as of now, empty fields in CLF now are "" not "-" anymore.

13 years agoMINOR: Date and time fonctions that don't use snprintf
William Lallemand [Mon, 6 Feb 2012 17:15:57 +0000 (18:15 +0100)] 
MINOR: Date and time fonctions that don't use snprintf

Also move human_time() to standard.c since it's not related to
timeval calculations.

13 years agoMINOR: add ultoa, ulltoa, ltoa, lltoa implementations
William Lallemand [Tue, 24 Jan 2012 10:15:39 +0000 (11:15 +0100)] 
MINOR: add ultoa, ulltoa, ltoa, lltoa implementations

Implementations that write result from left to right

13 years agoMINOR: config: Parse the string of the log-format config keyword
William Lallemand [Wed, 8 Feb 2012 15:37:49 +0000 (16:37 +0100)] 
MINOR: config: Parse the string of the log-format config keyword

parse_logformat_string: parse the string, detect the type: text,
        separator or variable

parse_logformat_var: dectect variable name

parse_logformat_var_args: parse arguments and flags

add_to_logformat_list: add to the logformat linked list

13 years agoREORG: log: split send_log function
William Lallemand [Mon, 6 Feb 2012 15:00:33 +0000 (16:00 +0100)] 
REORG: log: split send_log function

send_log function is now splited in 3 functions
* hdr_log: generate the syslog header
* send_log: send a syslog message with a printf format string
* __send_log: send a syslog message

13 years agoBUILD: fix declaration inside a scope block
William Lallemand [Mon, 30 Jan 2012 16:27:17 +0000 (17:27 +0100)] 
BUILD: fix declaration inside a scope block

13 years agoMEDIUM: improve config check return codes
Willy Tarreau [Thu, 2 Feb 2012 16:48:18 +0000 (17:48 +0100)] 
MEDIUM: improve config check return codes

When checking a configuration file using "-c -f xxx", sometimes it is
reported that a config is valid while it will later fail (eg: no enabled
listener). Instead, let's improve the return values :
  - return 0 if config is 100% OK
  - return 1 if config has errors
  - return 2 if config is OK but no listener nor peer is enabled

13 years agoBUG: fix double free in peers config error path
Willy Tarreau [Thu, 2 Feb 2012 16:06:13 +0000 (17:06 +0100)] 
BUG: fix double free in peers config error path

If the local host is not found as a peer in a "peers" section, we have a
double free, and possibly a use-after-free because the peers section is
freed since it's aliased as the table's name.

13 years agoDOC: mention that default checks are TCP connections
Patrick Mézard [Sun, 22 Jan 2012 15:01:22 +0000 (16:01 +0100)] 
DOC: mention that default checks are TCP connections

13 years agoBUILD: fix build error on FreeBSD
Willy Tarreau [Mon, 23 Jan 2012 14:35:52 +0000 (15:35 +0100)] 
BUILD: fix build error on FreeBSD

Marcello Gorlani reported that commit 5e205524ad24003ecc4dbb435066aebe7ed58d95
(BUG: http: re-enable TCP quick-ack upon incomplete HTTP requests) broke build
on FreeBSD.

Moving the include lower fixes the issue. This must be backported to 1.4 too.

13 years agoMINOR: halog: add some help on the command line
Willy Tarreau [Mon, 23 Jan 2012 07:15:51 +0000 (08:15 +0100)] 
MINOR: halog: add some help on the command line

13 years agoBUG/MEDIUM: zero-weight servers must not dequeue requests from the backend
Willy Tarreau [Fri, 20 Jan 2012 14:57:05 +0000 (15:57 +0100)] 
BUG/MEDIUM: zero-weight servers must not dequeue requests from the backend

It was reported that a server configured with a zero weight would
sometimes still take connections from the backend queue. This issue is
real, it happens this way :
  1) the disabled server accepts a request with a cookie
  2) many cookie-less requests accumulate in the backend queue
  3) when the disabled server completes its request, it checks its own
     queue and the backend's queue
  4) the server takes a pending request from the backend queue and
     processes it. In response, the server's cookie is assigned to
     the client, which ensures that some requests will continue to
     be served by this server, leading back to point 1 above.

The fix consists in preventing a zero-weight server from dequeuing pending
requests from the backend. Making use of srv_is_usable() in such tests makes
the tests more robust against future changes.

This fix must be backported to 1.4 and 1.3.

13 years agoBUG/MEDIUM: correctly disable servers tracking another disabled servers.
Willy Tarreau [Fri, 20 Jan 2012 12:12:32 +0000 (13:12 +0100)] 
BUG/MEDIUM: correctly disable servers tracking another disabled servers.

In a config where server "s1" is marked disabled and "s2" tracks "s1",
s2 appears disabled on the stats but is still inserted into the LB farm
because the tracking is resolved too late in the configuration process.

We now resolve tracked servers before building LB maps and we also mark
the tracking server in maintenance mode, which previously was not done,
causing half of the issue.

Last point is that we also protect srv_is_usable() against electing a
server marked for maintenance. This is not absolutely needed but is a
safe choice and makes a lot of sense.

This fix must be backported to 1.4.

13 years agoBUG/MINOR: fix typo in processing of http-send-name-header
Stathis Voukelatos [Mon, 9 Jan 2012 13:27:13 +0000 (14:27 +0100)] 
BUG/MINOR: fix typo in processing of http-send-name-header

I downloaded version 1.4.19 this morning. While merging the code changes
to a custom build that we have here for our project I noticed a typo in
'session.c', in the new code for inserting the server name in the HTTP
header. The fix that I did is shown in the patch below.

[WT: the bug is harmless, it is only suboptimal]

13 years agoBUG/MINOR: cli: correctly remove the whole table on "clear table"
Willy Tarreau [Mon, 9 Jan 2012 10:50:03 +0000 (11:50 +0100)] 
BUG/MINOR: cli: correctly remove the whole table on "clear table"

Joe Price reported that "clear table xxx" sent on the CLI would only clear
the last entry. This is true, some code was missing to remove an entry from
within the loop, and only the final condition was able to remove an entry.
The fix is obvious. No backport is needed.

13 years agoDOC: add some documentation from RFC3986 about URI format
Willy Tarreau [Sat, 7 Jan 2012 22:58:54 +0000 (23:58 +0100)] 
DOC: add some documentation from RFC3986 about URI format

13 years agoMEDIUM: http: block non-ASCII characters in URIs by default
Willy Tarreau [Sat, 7 Jan 2012 22:54:13 +0000 (23:54 +0100)] 
MEDIUM: http: block non-ASCII characters in URIs by default

These ones are invalid and blocked unless "option accept-invalid-http-request"
is specified in the frontend. In any case, the faulty request is logged.

Note that some of the remaining invalid chars are still not checked against,
those are the invalid ones between 32 and 127 :

    34 ('"'), 60 ('<'), 62 ('>'), 92 ('\'), 94 ('^'),
    96 ('`'), 123 ('{'), 124 ('|'), 125 ('}')

Using a lookup table might be better at some point.

13 years agoBUG: http: tighten the list of allowed characters in a URI
Willy Tarreau [Sat, 7 Jan 2012 22:22:31 +0000 (23:22 +0100)] 
BUG: http: tighten the list of allowed characters in a URI

The HTTP request parser was considering that any non-LWS char was
par of the URI. Unfortunately, this allows control chars to be sent
in the URI, sometimes resulting in backend servers misbehaving, for
instance when they interprete \0 as an end of string and respond
with plain HTTP/0.9 without headers, that haproxy blocks as invalid
responses.

RFC3986 clearly states the list of allowed characters in a URI. Even
non-ASCII chars are not allowed. Unfortunately, after having run 10
years with these chars allowed, we can't block them right now without
an optional workaround. So the first step consists in only blocking
control chars. A later patch will allow non-ASCII only when an appropriate
option is enabled in the frontend.

Control chars are 0..31 and 127, with the exception of 9, 10 and 13
(\t, \n, \r).

13 years agoCLEANUP: silence a warning when building on sparc
Willy Tarreau [Sat, 7 Jan 2012 21:52:12 +0000 (22:52 +0100)] 
CLEANUP: silence a warning when building on sparc

On Solaris/sparc, getpid() returns pid_t which is not an int :

  src/peers.c: In function `peer_io_handler':
  src/peers.c:508: warning: int format, pid_t arg (arg 6)

13 years agoMEDIUM: http: add support for sending the server's name in the outgoing request
Mark Lamourine [Wed, 4 Jan 2012 18:02:01 +0000 (13:02 -0500)] 
MEDIUM: http: add support for sending the server's name in the outgoing request

New option "http-send-name-header" specifies the name of a header which
will hold the server name in outgoing requests. This is the name of the
server the connection is really sent to, which means that upon redispatches,
the header's value is updated so that it always matches the server's name.

13 years agoOPTIM: halog: keep a fast path for the lines-count only
Willy Tarreau [Tue, 3 Jan 2012 08:23:03 +0000 (09:23 +0100)] 
OPTIM: halog: keep a fast path for the lines-count only

Using "halog -c" is still something quite common to perform on logs,
but unfortunately since the recent added controls, it was sensibly
slowed down due to the parsing of the accept date field.

Now we use a specific loop for the case where nothing is needed from
the input, and this sped up the line counting by 2.5x. A 2.4 GHz Xeon
now counts lines at a rate of 2 GB of logs per second.

13 years agoDOC: add a coding-style file
Willy Tarreau [Fri, 30 Dec 2011 16:16:22 +0000 (17:16 +0100)] 
DOC: add a coding-style file

This will help newcomers adapt to existing (or desired) style and will
save them some time.

13 years agoDOC: add minimal documentation on how ACLs work internally
Willy Tarreau [Fri, 16 Dec 2011 20:51:00 +0000 (21:51 +0100)] 
DOC: add minimal documentation on how ACLs work internally

This will help complete the ACL to pattern migration.

13 years agoMEDIUM: patterns: the hdr() pattern is now of type string
Willy Tarreau [Fri, 16 Dec 2011 20:50:30 +0000 (21:50 +0100)] 
MEDIUM: patterns: the hdr() pattern is now of type string

This pattern previously was limited to type IP. With the new header
extraction function, it becomes possible to extract strings, so that
the header can be returned as a string. This will not change anything
to existing configs, as string will automatically be converted to IP
when needed. However, new configs will be able to use IPv6 addresses
from headers in stick-tables, as well as stick on any non-IP header
(eg: host, user-agent, ...).

13 years agoMEDIUM: http: replace get_ip_from_hdr2() with http_get_hdr()
Willy Tarreau [Fri, 16 Dec 2011 20:35:50 +0000 (21:35 +0100)] 
MEDIUM: http: replace get_ip_from_hdr2() with http_get_hdr()

The new function does not return IP addresses but header values instead,
so that the caller is free to make what it want of them. The conversion
is not quite clean yet, as the previous test which considered that address
0.0.0.0 meant "no address" is still used. A different IP parsing function
should be used to take this into account.

13 years agoCLEANUP: acl: remove last data fields from the acl_test struct
Willy Tarreau [Fri, 16 Dec 2011 18:16:19 +0000 (19:16 +0100)] 
CLEANUP: acl: remove last data fields from the acl_test struct

acl_test doesn't hold ptr nor len anymore, since everything has moved to
the temporary pattern.

13 years agoMEDIUM: acl: use temp_pattern to store any string-type information
Willy Tarreau [Fri, 16 Dec 2011 18:11:42 +0000 (19:11 +0100)] 
MEDIUM: acl: use temp_pattern to store any string-type information

Now strings and data blocks are stored in the temp_pattern's chunk
and matched against this one.

The rdp_cookie currently makes extensive use of acl_fetch_rdp_cookie()
and will be a good candidate for the initial rework so that ACLs use
the patterns framework and not the other way around.

13 years agoCLEANUP: acl: integer part of acl_test is not used anymore
Willy Tarreau [Fri, 16 Dec 2011 17:03:44 +0000 (18:03 +0100)] 
CLEANUP: acl: integer part of acl_test is not used anymore

13 years agoMEDIUM: acl: use temp_pattern to store any address-type information
Willy Tarreau [Fri, 16 Dec 2011 16:49:52 +0000 (17:49 +0100)] 
MEDIUM: acl: use temp_pattern to store any address-type information

IPv4 and IPv6 addresses are now stored into temp_pattern instead of
the dirty hack consisting into storing them into the consumer's target
address.

Some refactoring should now be possible since the methods used to fetch
source and destination addresses are similar between patterns and ACLs.

13 years agoMEDIUM: acl: use temp_pattern to store any integer-type information
Willy Tarreau [Fri, 16 Dec 2011 16:06:15 +0000 (17:06 +0100)] 
MEDIUM: acl: use temp_pattern to store any integer-type information

All ACL fetches which return integer value now store the result into
the temporary pattern struct. All ACL matches which rely on integer
also get their value there.

Note: the pattern data types are not set right now.

13 years agoMEDIUM: pattern: change the pattern data integer from unsigned to signed
Willy Tarreau [Fri, 16 Dec 2011 15:44:06 +0000 (16:44 +0100)] 
MEDIUM: pattern: change the pattern data integer from unsigned to signed

Till now the pattern data integer type was unsigned without any
particular reason. In order to make ACLs use it, we must switch it
to signed int instead.

13 years agoMINOR: acl: include pattern.h to make pattern migration more transparent
Willy Tarreau [Fri, 16 Dec 2011 14:47:06 +0000 (15:47 +0100)] 
MINOR: acl: include pattern.h to make pattern migration more transparent

13 years agoMEDIUM: acl: use temp_pattern to store fetched information in the "method" match
Willy Tarreau [Fri, 16 Dec 2011 14:38:49 +0000 (15:38 +0100)] 
MEDIUM: acl: use temp_pattern to store fetched information in the "method" match

This match was using both the int and ptr part of the acl_test struct. Let's
change this to be able to store it into a chunk with a special encoding.

13 years agoCLEANUP: patterns: get rid of pattern_data_setstring()
Willy Tarreau [Fri, 16 Dec 2011 14:35:46 +0000 (15:35 +0100)] 
CLEANUP: patterns: get rid of pattern_data_setstring()

This function was only used to call chunk_init_len() from another chunk,
which in the end consists in simply assigning the source chunk to the
destination chunk. Let's remove this indirection to make the code clearer.
Anyway it was the only place such a function was used.

13 years agoMINOR: pattern: export the global temporary pattern
Willy Tarreau [Fri, 16 Dec 2011 14:23:14 +0000 (15:23 +0100)] 
MINOR: pattern: export the global temporary pattern

The global pattern is used for pattern conversions. Export it under the
name "temp_pattern" so that it can later be used by ACLs.

13 years agoBUG: proto_tcp: don't try to bind to a foreign address if sin_family is unknown
Willy Tarreau [Fri, 16 Dec 2011 20:25:11 +0000 (21:25 +0100)] 
BUG: proto_tcp: don't try to bind to a foreign address if sin_family is unknown

This is 1.5-specific. It causes issues with transparent source binding involving
hdr_ip. We must not try to bind() to a foreign address when the family is not set,
and we must set the family when an address is set.

13 years agoBUG: http: re-enable TCP quick-ack upon incomplete HTTP requests
Willy Tarreau [Sat, 17 Dec 2011 15:34:27 +0000 (16:34 +0100)] 
BUG: http: re-enable TCP quick-ack upon incomplete HTTP requests

By default we disable TCP quick-acking on HTTP requests so that we
avoid sending a pure ACK immediately followed by the HTTP response.
However, if the client sends an incomplete request in a short packet,
its TCP stack might wait for this packet to be ACKed before sending
the rest of the request, delaying incoming requests by up to 40-200ms.

We can detect this undesirable situation when parsing the request :
  - if an incomplete request is received
  - if a full request is received and uses chunked encoding or advertises
    a content-length larger than the data available in the buffer

In these situations, we re-enable TCP quick-ack if we had previously
disabled it.

13 years agoMINOR: acl: add support for TLS server name matching using SNI
Willy Tarreau [Mon, 12 Dec 2011 16:23:41 +0000 (17:23 +0100)] 
MINOR: acl: add support for TLS server name matching using SNI

Server Name Indication (SNI) is a TLS extension which makes a client
present the name of the server it is connecting to in the client hello.
It allows a transparent proxy to take a decision based on the beginning
of an SSL/TLS stream without deciphering it.

The new ACL "req_ssl_sni" matches the name extracted from the TLS
handshake against a list of names which may be loaded from a file if
needed.

13 years agoOPTIM: stream_sock: save a failed recv syscall when splice returns EAGAIN
Willy Tarreau [Sun, 11 Dec 2011 21:37:06 +0000 (22:37 +0100)] 
OPTIM: stream_sock: save a failed recv syscall when splice returns EAGAIN

When splice() returns EAGAIN, on old kernels it could be caused by a read
shutdown which was not detected. Due to this behaviour, we had to fall
back to recv(), which in turn says if it's a real EAGAIN or a shutdown.
Since this behaviour was fixed in 2.6.27.14, on more recent kernels we'd
prefer to avoid the fallback to recv() when possible. For this, we set a
variable the first time splice() detects a shutdown, to indicate that it
works. We can then rely on this variable to adjust our behaviour.

Doing this alone increased the overall performance by about 1% on medium
sized objects.

13 years agoOPTIM: stream_sock: reduce the amount of in-flight spliced data
Willy Tarreau [Sun, 11 Dec 2011 21:11:47 +0000 (22:11 +0100)] 
OPTIM: stream_sock: reduce the amount of in-flight spliced data

First, it's a waste not to call chk_snd() when spliced data are available,
because the pipe can almost always be transferred into the outgoing socket
buffers. Starting from now, when we splice data in, we immediately try to
send them. This results in less pipes used, and possibly less kernel memory
in use at once.

Second, if a pipe cannot be transferred into the outgoing socket buffers,
it means this buffer is full. There's no point trying again then, as space
will almost never be available, resulting in a useless syscall returning
EAGAIN.

13 years agoBUG: ebtree: ebst_lookup() could return the wrong entry
Willy Tarreau [Mon, 14 Nov 2011 13:09:27 +0000 (14:09 +0100)] 
BUG: ebtree: ebst_lookup() could return the wrong entry

(from ebtree 6.0.7)

Julien Thomas provided a reproducible test case where a string lookup
could return the wrong node. The issue is caused by the jump to a node
which contains less bit in common than the previous node, making the
string_equal_bits() function return -1. We must not remember more bits
than the number on the node, otherwise we can be tempted to trust them
while they can change while running down.

For a valid test case, enter : "0", "WW", "W", "S", and lookup "W".
Previously, "S" was returned.

Note: string-based ebtrees are used in haproxy in ACL, peers and
stick-tables. ACLs are not affected because all patterns are
interchangeable. stick-tables are not affected because lookups are
performed using ebmb_lookup(). Only peers might be affected though
it is not easy to infirm or confirm the issue.

(cherry picked from commit dd47a54103597458887d3cc8414853a541aee9c1)

13 years agoCLEANUP: ebtree: remove another typo, a wrong initialization in insertion code
Willy Tarreau [Mon, 19 Sep 2011 18:48:00 +0000 (20:48 +0200)] 
CLEANUP: ebtree: remove another typo, a wrong initialization in insertion code

(from ebtree 6.0.7)

root_right was wrongly initialized first to <root> which is not the same
type, to be later initialized to root->b[EB_RGHT].

Let's simply remove the wrong and useless initialization.
(cherry picked from commit e63a0c2f56369b52c4d00221d83c2c4569605c06)

13 years agoCLEANUP: ebtree: remove 4-year old harmless typo in duplicates insertion code
Willy Tarreau [Mon, 19 Sep 2011 18:36:45 +0000 (20:36 +0200)] 
CLEANUP: ebtree: remove 4-year old harmless typo in duplicates insertion code

(from ebtree 6.0.7)

This typo has been there since we introduced duplicates. A "struct eb_troot *"
which apparently the compiler doesn't complain about while it is never declared
anywhere. Amazing...

(cherry picked from commit 2879648db5d32cf009ae571cb0e8e1df75152281)

13 years agoCLEANUP: ebtree: clarify licence and update to 6.0.6
Willy Tarreau [Mon, 25 Jul 2011 09:38:17 +0000 (11:38 +0200)] 
CLEANUP: ebtree: clarify licence and update to 6.0.6

(from ebtree 6.0.6)

This version is mainly aimed at clarifying the fact that the ebtree license
is LGPL. Some files used to indicate LGPL and other ones GPL, while the goal
clearly is to have it LGPL. A LICENSE file has also been added.

No code is affected, but it's better to have the local tree in sync anyway.

(cherry picked from commit 24dc7cca051f081600fe8232f33e55ed30e88425)

13 years agoCLEANUP: ebtree: remove a few annoying signedness warnings
Willy Tarreau [Mon, 25 Jul 2011 10:22:44 +0000 (12:22 +0200)] 
CLEANUP: ebtree: remove a few annoying signedness warnings

(from ebtree 6.0.6)

Care has been taken not to make the code bigger (it even got smaller
due to a possible simplification).
(cherry picked from commit 7a2c1df646049c7daac52677ec11ed63048cd150)

13 years agoBUG: tcp: option nolinger does not work on backends
Willy Tarreau [Wed, 30 Nov 2011 17:02:24 +0000 (18:02 +0100)] 
BUG: tcp: option nolinger does not work on backends

Daniel Rankov reported that "option nolinger" is inefficient on backends.
The reason is that it is set on the file descriptor only, which does not
prevent haproxy from performing a clean shutdown() before closing. We must
set the flag on the stream_interface instead if we want an RST to be emitted
upon active close.

13 years agoCLEANUP: kill buffer_replace() and use an inline instead
Willy Tarreau [Mon, 28 Nov 2011 09:36:13 +0000 (10:36 +0100)] 
CLEANUP: kill buffer_replace() and use an inline instead

This function is never used, only its buffer_replace2() alternative
is used. Replace the former with an inline which calls the later.

13 years agoMINOR: buffers: make buffer_pointer() support negative pointers too
Willy Tarreau [Mon, 28 Nov 2011 15:04:29 +0000 (16:04 +0100)] 
MINOR: buffers: make buffer_pointer() support negative pointers too

It's more handy if the buffer_pointer() function also handles negative pointers.

13 years agoBUG: buffers: don't return a negative value on buffer_total_space_res()
Willy Tarreau [Mon, 28 Nov 2011 12:40:49 +0000 (13:40 +0100)] 
BUG: buffers: don't return a negative value on buffer_total_space_res()

In commit 4b517ca93aaaead8aa6143aa2836dc96417653c6 (MEDIUM: buffers:
add some new primitives and rework existing ones), we forgot to check
if buffer_max_len() < l.

No backport is needed.

13 years agoMEDIUM: buffers: add some new primitives and rework existing ones
Willy Tarreau [Fri, 25 Nov 2011 19:33:58 +0000 (20:33 +0100)] 
MEDIUM: buffers: add some new primitives and rework existing ones

A number of primitives were missing for buffer management, and some
of them were particularly awkward to use. Specifically, the functions
used to compute free space could not always be used depending what was
wrapping in the buffers. Some documentation has been added about how
the buffers work and their properties. Some functions are still missing
such as a buffer replacement which would support wrapping buffers.

13 years agoMEDIUM: log: Use linked lists for loggers
William Lallemand [Wed, 12 Oct 2011 15:50:54 +0000 (17:50 +0200)] 
MEDIUM: log: Use linked lists for loggers

This patch settles the 2 loggers limitation.
Loggers are now stored in linked lists.

Using "global log", the global loggers list content is added at the end
of the current proxy list. Each "log" entries are added at the end of
the proxy list.

"no log" flush a logger list.

13 years agoMINOR: config: tolerate server "cookie" setting in non-HTTP mode
Willy Tarreau [Mon, 31 Oct 2011 12:49:26 +0000 (13:49 +0100)] 
MINOR: config: tolerate server "cookie" setting in non-HTTP mode

Up to now, if a cookie value was specified on a server when the proxy was
in TCP mode, it would cause a fatal error. Now we only report a warning,
since the cookie will be ignored. This makes it easier to generate configs
from scripts.

13 years agoBUG/MEDIUM: checks: fix slowstart behaviour when server tracking is in use
Willy Tarreau [Mon, 31 Oct 2011 10:53:20 +0000 (11:53 +0100)] 
BUG/MEDIUM: checks: fix slowstart behaviour when server tracking is in use

Ludovic Levesque reported and diagnosed an annoying bug. When a server is
configured to track another one and has a slowstart interval set, it's
assigned a minimal weight when the tracked server goes back up but keeps
this weight forever.

This is because the throttling during the warmup phase is only computed
in the health checking function.

After several attempts to resolve the issue, the only real solution is to
split the check processing task in two tasks, one for the checks and one
for the warmup. Each server with a slowstart setting has a warmum task
which is responsible for updating the server's weight after a down to up
transition. The task does not run in othe situations.

In the end, the fix is neither complex nor long and should be backported
to 1.4 since the issue was detected there first.

13 years agoCLEANUP: rename possibly confusing struct field "tracked"
Willy Tarreau [Fri, 28 Oct 2011 13:35:33 +0000 (15:35 +0200)] 
CLEANUP: rename possibly confusing struct field "tracked"

When reading the code, the "tracked" member of a server makes one
think the server is tracked while it's the opposite, it's a pointer
to the server being tracked. This is particularly true in constructs
such as :

if (srv->tracked) {

Since it's the second time I get caught misunderstanding it, let's
rename it to "track" to avoid the confusion.

13 years agoBUG/MINOR: fix a segfault when parsing a config with undeclared peers
Willy Tarreau [Fri, 28 Oct 2011 12:16:49 +0000 (14:16 +0200)] 
BUG/MINOR: fix a segfault when parsing a config with undeclared peers

Baptiste Assmann reported that a config where a non-existing peers
section is referenced by a stick-table causes a segfault after displaying
the error. This is caused by the freeing of the peers. Setting it to NULL
after displaying the error fixes the issue.

13 years agoMEDIUM: tune.http.maxhdr makes it possible to configure the maximum number of HTTP...
Willy Tarreau [Mon, 24 Oct 2011 17:14:41 +0000 (19:14 +0200)] 
MEDIUM: tune.http.maxhdr makes it possible to configure the maximum number of HTTP headers

For a long time, the max number of headers was taken as a part of the buffer
size. Since the header size can be configured at runtime, it does not make
much sense anymore.

Nothing was making it necessary to have a static value, so let's turn this into
a tunable with a default value of 101 which equals what was previously used.

13 years agoOPTIM/MINOR: move the hdr_idx pools out of the proxy struct
Willy Tarreau [Mon, 24 Oct 2011 16:15:04 +0000 (18:15 +0200)] 
OPTIM/MINOR: move the hdr_idx pools out of the proxy struct

It makes no sense to have one pointer to the hdr_idx pool in each proxy
struct since these pools do not depend on the proxy. Let's have a common
pool instead as it is already the case for other types.

13 years agoBUILD/MINOR: silent a build warning in src/pipe.c (fcntl)
Willy Tarreau [Mon, 24 Oct 2011 15:09:22 +0000 (17:09 +0200)] 
BUILD/MINOR: silent a build warning in src/pipe.c (fcntl)

13 years agoOPTIM/MINOR: make it possible to change pipe size (tune.pipesize)
Willy Tarreau [Sun, 23 Oct 2011 19:14:29 +0000 (21:14 +0200)] 
OPTIM/MINOR: make it possible to change pipe size (tune.pipesize)

By default, pipes are the default size for the system. But sometimes when
using TCP splicing, it can improve performance to increase pipe sizes,
especially if it is suspected that pipes are not filled and that many
calls to splice() are performed. This has an impact on the kernel's
memory footprint, so this must not be changed if impacts are not understood.

13 years agoOPTIM/MINOR: move struct sockaddr_storage to the tail of structs
Willy Tarreau [Fri, 21 Oct 2011 16:51:57 +0000 (18:51 +0200)] 
OPTIM/MINOR: move struct sockaddr_storage to the tail of structs

Struct sockaddr_storage is huge (128 bytes) and severely impacts the
cache. It also displaces other struct members, causing them to have
larger relative offsets. By moving these few occurrences to the end
of the structs which host them, we can reduce the code size by no less
than 2 kB !

13 years agoDOC: indicate that cookie "prefix" and "indirect" should not be mixed
Willy Tarreau [Mon, 17 Oct 2011 10:24:55 +0000 (12:24 +0200)] 
DOC: indicate that cookie "prefix" and "indirect" should not be mixed

When prefix and indirect are used together, a client which connects to
a server with a cookie will never get any cookie update from this server,
which will be removed by the "indirect" option.

13 years agoMINOR: halog: add support for matching queued requests
Willy Tarreau [Thu, 13 Oct 2011 11:28:36 +0000 (13:28 +0200)] 
MINOR: halog: add support for matching queued requests

-Q outputs all requests which went through at least one queue.
-QS outputs all requests which went through a server queue.

13 years agoBUG/MINOR: fix options forwardfor if-none when an alternative header name is specified
Sagi Bashari [Sat, 8 Oct 2011 20:48:48 +0000 (22:48 +0200)] 
BUG/MINOR: fix options forwardfor if-none when an alternative header name is specified

13 years agoMINOR: remove the client/server side distinction in SI addresses
Willy Tarreau [Fri, 23 Sep 2011 08:54:59 +0000 (10:54 +0200)] 
MINOR: remove the client/server side distinction in SI addresses

Stream interfaces used to distinguish between client and server addresses
because they were previously of different types (sockaddr_storage for the
client, sockaddr_in for the server). This is not the case anymore, and this
distinction is confusing at best and has caused a number of regressions to
be introduced in the process of converting everything to full-ipv6. We can
now remove this and have a much cleaner code.

13 years agoBUG/MINOR: don't use a wrong port when connecting to a server with mapped ports
Willy Tarreau [Fri, 23 Sep 2011 08:27:12 +0000 (10:27 +0200)] 
BUG/MINOR: don't use a wrong port when connecting to a server with mapped ports

Nick Chalk reported that a connection to a server which has no port specified
used twice the port number. The reason is that the port number was taken from
the wrong part of the address, the client's destination address was used as the
base port instead of the server's configured address.

Thanks to Nick for his helpful diagnostic.

13 years agoBUILD: halog: make halog build on solaris
Willy Tarreau [Fri, 16 Sep 2011 13:00:48 +0000 (15:00 +0200)] 
BUILD: halog: make halog build on solaris

Solaris' "rm" command does not support -v. Also, specify CC=gcc
because "cc" generally is not gcc there.

13 years agoMINOR: acl: add new matches for header/path/url length
Willy Tarreau [Fri, 16 Sep 2011 06:32:32 +0000 (08:32 +0200)] 
MINOR: acl: add new matches for header/path/url length

This patch introduces hdr_len, path_len and url_len for matching these
respective parts lengths against integers. This can be used to detect
abuse or empty headers.

13 years agoBUG/MEDIUM: don't trim last spaces from headers consisting only of spaces
Willy Tarreau [Fri, 16 Sep 2011 06:11:26 +0000 (08:11 +0200)] 
BUG/MEDIUM: don't trim last spaces from headers consisting only of spaces

Commit 588bd4 fixed header parsing so that trailing spaces were not part
of the returned string. Unfortunately, if a header only had spaces, the
last spaces were trimmed past the beginning of the value, causing a negative
length to be returned.

A quick code review shows that there should be no impact since the only
places where the vlen is used are either compared to a specific value or
with explicit contents (eg: digits).

This must be backported to 1.4.

13 years agoDOC: acl is http_first_req, not http_req_first
Willy Tarreau [Fri, 16 Sep 2011 05:53:52 +0000 (07:53 +0200)] 
DOC: acl is http_first_req, not http_req_first

Doc was entered without correctly copying the ACL name.

13 years agoBUILD/MINOR: fix the source URL in the spec file
Willy Tarreau [Sun, 11 Sep 2011 14:01:53 +0000 (16:01 +0200)] 
BUILD/MINOR: fix the source URL in the spec file

As reported by Avi Brender, the soruce URL was still pointing to v1.3.

13 years ago[RELEASE] Released version 1.5-dev7
Willy Tarreau [Sat, 10 Sep 2011 21:43:11 +0000 (23:43 +0200)] 
[RELEASE] Released version 1.5-dev7

Released version 1.5-dev7 with the following main changes :
    - [BUG] fix binary stick-tables
    - [MINOR] http: *_dom matching header functions now also split on ":"
    - [BUG] checks: fix support of Mysqld >= 5.5 for mysql-check
    - [MINOR] acl: add srv_conn acl to count connections on a     specific backend server
    - [MINOR] check: add redis check support
    - [DOC] small fixes to clearly distinguish between keyword     and variables
    - [MINOR] halog: add support for termination code matching (-tcn/-TCN)
    - [DOC] Minor spelling fixes and grammatical enhancements
    - [CLEANUP] dumpstats: make symbols static where possible
    - [MINOR] Break out dumping table
    - [MINOR] Break out processing of clear table
    - [MINOR] Allow listing of stick table by key
    - [MINOR] Break out all stick table socat command parsing
    - [MINOR] More flexible clearing of stick table
    - [MINOR] Allow showing and clearing by key of ipv6 stick tables
    - [MINOR] Allow showing and clearing by key of integer stick tables
    - [MINOR] Allow showing and clearing by key of string stick tables
    - [CLEANUP] Remove assigned but unused variables
    - [CLEANUP] peers.h: fix declarations
    - [CLEANUP] session.c: Make functions static where possible
    - [MINOR] Add active connection list to server
    - [MINOR] Allow shutdown of sessions when a server becomes unavailable
    - [MINOR] Add down termination condition
    - [MINOR] Make appsess{,ion}_refresh static
    - [MINOR] Add rdp_cookie pattern fetch function
    - [CLEANUP] Remove unnecessary casts
    - [MINOR] Add non-stick server option
    - [MINOR] Consistently use error in tcp_parse_tcp_req()
    - [MINOR] Consistently free expr on error in cfg_parse_listen()
    - [MINOR] Free rdp_cookie_name on denint()
    - [MINOR] Free tcp rules on denint()
    - [MINOR] Free stick table pool on denint()
    - [MINOR] Free stick rules on denint()
    - [MEDIUM] Fix stick-table replication on soft-restart
    - [MEDIUM] Correct ipmask() logic
    - [MINOR] Correct type in table dump examples
    - [MINOR] Fix build error in stream_int_register_handler()
    - [MINOR] Use DPRINTF in assign_server()
    - [BUG] checks: http-check expect could fail a check on multi-packet responses
    - [DOC] fix minor typo in the "dispatch" doc
    - [BUG] proto_tcp: fix address binding on remote source
    - [MINOR] http: don't report the "haproxy" word on the monitoring response
    - [REORG] http: move HTTP error codes back to proto_http.h
    - [MINOR] http: make the "HTTP 200" status code configurable.
    - [MINOR] http: partially revert the chunking optimization for now
    - [MINOR] stream_sock: always clear BF_EXPECT_MORE upon complete transfer
    - [CLEANUP] stream_sock: remove unneeded FL_TCP and factor out test
    - [MEDIUM] http: add support for "http-no-delay"
    - [OPTIM] http: optimize chunking again in non-interactive mode
    - [OPTIM] stream_sock: avoid fast-forwarding of partial data
    - [OPTIM] stream_sock: don't use splice on too small payloads
    - [MINOR] config: make it possible to specify a cookie even without a server
    - [BUG] stats: support url-encoded forms
    - [MINOR] config: automatically compute a default fullconn value
    - [CLEANUP] config: remove some left-over printf debugging code from previous patch
    - [DOC] add missing entry or stick store-response
    - [MEDIUM] http: add support for 'cookie' and 'set-cookie' patterns
    - [BUG] halog: correctly handle truncated last line
    - [MINOR] halog: make SKIP_CHAR stop on field delimiters
    - [MINOR] halog: add support for HTTP log matching (-H)
    - [MINOR] halog: gain back performance before SKIP_CHAR fix
    - [OPTIM] halog: cache some common fields positions
    - [OPTIM] halog: check once for correct line format and reuse the pointer
    - [OPTIM] halog: remove many 'if' by using a function pointer for the filters
    - [OPTIM] halog: remove support for tab delimiters in input data
    - [BUG] session: risk of crash on out of memory (1.5-dev regression)
    - [MINOR] session: try to emit a 500 response on memory allocation errors
    - [OPTIM] stream_sock: reduce the default number of accepted connections at once
    - [BUG] stream_sock: disable listener when system resources are exhausted
    - [MEDIUM] proxy: add a PAUSED state to listeners and move socket tricks out of proxy.c
    - [BUG] stream_sock: ensure orphan listeners don't accept too many connections
    - [MINOR] listeners: add listen_full() to mark a listener full
    - [MINOR] listeners: add support for queueing resource limited listeners
    - [MEDIUM] listeners: put listeners in queue upon resource shortage
    - [MEDIUM] listeners: queue proxy-bound listeners at the proxy's
    - [MEDIUM] listeners: don't stop proxies when global maxconn is reached
    - [MEDIUM] listeners: don't change listeners states anymore in maintain_proxies
    - [CLEANUP] proxy: rename a few proxy states (PR_STIDLE and PR_STRUN)
    - [MINOR] stats: report a "WAITING" state for sockets waiting for resource
    - [MINOR] proxy: make session rate-limit more accurate
    - [MINOR] sessions: only wake waiting listeners up if rate limit is OK
    - [BUG] proxy: peers must only be stopped once, not upon every call to maintain_proxies
    - [CLEANUP] proxy: merge maintain_proxies() operation inside a single loop
    - [MINOR] task: new function task_schedule() to schedule a wake up
    - [MAJOR] proxy: finally get rid of maintain_proxies()
    - [BUG] proxy: stats frontend and peers were missing many initializers
    - [MEDIUM] listeners: add a global listener management task
    - [MINOR] proxy: make findproxy() return proxies from numeric IDs too
    - [DOC] fix typos, "#" is a sharp, not a dash
    - [MEDIUM] stats: add support for changing frontend's maxconn at runtime
    - [MEDIUM] checks: group health checks methods by values and save option bits
    - [MINOR] session-counters: add the ability to clear the counters
    - [BUG] check: http-check expect + regex would crash in defaults section
    - [MEDIUM] http: make x-forwarded-for addition conditional
    - [REORG] build: move syscall redefinition to specific places
    - [CLEANUP] update the year in the copyright banner
    - [BUG] possible crash in 'show table' on stats socket
    - [BUG] checks: use the correct destination port for sending checks
    - [BUG] backend: risk of picking a wrong port when mapping is used with crossed families
    - [MINOR] make use of set_host_port() and get_host_port() to get rid of family mismatches
    - [DOC] fixed a few "sensible" -> "sensitive" errors
    - [MINOR] make use of addr_to_str() and get_host_port() to replace many inet_ntop()
    - [BUG] http: trailing white spaces must also be trimmed after headers
    - [MINOR] stats: display "<NONE>" instead of the frontend name when unknown
    - [MINOR] http: take a capture of too large requests and responses
    - [MINOR] http: take a capture of truncated responses
    - [MINOR] http: take a capture of bad content-lengths.
    - [DOC] add a few old and uncommitted docs
    - [CLEANUP] cfgparse: fix reported options for the "bind" keyword
    - [MINOR] halog: add -hs/-HS to filter by HTTP status code range
    - [MINOR] halog: support backslash-escaped quotes
    - [CLEANUP] remove dirty left-over of a debugging message
    - [MEDIUM] stats: disable complex socket reservation for stats socket
    - [CLEANUP] remove a useless test in manage_global_listener_queue()
    - [MEDIUM] stats: add the "set maxconn" setting to the command line interface
    - [MEDIUM] add support for global.maxconnrate to limit the per-process conn rate.
    - [MINOR] stats: report the current and max global connection rates
    - [MEDIUM] stats: add the ability to adjust the global maxconnrate
    - [BUG] peers: don't pre-allocate 65000 connections to each peer
    - [MEDIUM] don't limit peers nor stats socket to maxconn nor maxconnrate
    - [BUG] peers: the peer frontend must not emit any log
    - [CLEANUP] proxy: make pause_proxy() perform the required controls and emit the logs
    - [BUG] peers: don't keep a peers section which has a NULL frontend
    - [BUG] peers: ensure the peers are resumed if they were paused
    - [MEDIUM] stats: add the ability to enable/disable/shutdown a frontend at runtime
    - [MEDIUM] session: make session_shutdown() an independant function
    - [MEDIUM] stats: offer the possibility to kill a session from the CLI
    - [CLEANUP] stats: centralize tests for backend/server inputs on the CLI
    - [MEDIUM] stats: offer the possibility to kill sessions by server
    - [MINOR] halog: do not consider byte 0x8A as end of line
    - [MINOR] frontend: ensure debug message length is always initialized
    - [OPTIM] halog: make fgets parse more bytes by blocks
    - [OPTIM] halog: add assembly version of the field lookup code
    - [MEDIUM] poll: add a measurement of idle vs work time
    - [CLEANUP] startup: report only the basename in the usage message
    - [MINOR] startup: add an option to change to a new directory
    - [OPTIM] task: don't scan the run queue if we know it's empty
    - [BUILD] stats: stdint is not present on solaris
    - [DOC] update the README file to reflect new naming rules for patches
    - [MINOR] stats: report the number of requests intercepted by the frontend
    - [DOC] update ROADMAP file

13 years ago[DOC] update ROADMAP file
Willy Tarreau [Sat, 10 Sep 2011 21:40:59 +0000 (23:40 +0200)] 
[DOC] update ROADMAP file

13 years ago[MINOR] stats: report the number of requests intercepted by the frontend
Willy Tarreau [Sat, 10 Sep 2011 21:29:44 +0000 (23:29 +0200)] 
[MINOR] stats: report the number of requests intercepted by the frontend

These requests are mainly monitor requests, as well as stats requests when
the stats are processed by the frontend. Having this counter helps explain
the difference in number of sessions that is sometimes observed between a
frontend and a backend.

13 years ago[DOC] update the README file to reflect new naming rules for patches
Willy Tarreau [Sat, 10 Sep 2011 20:48:36 +0000 (22:48 +0200)] 
[DOC] update the README file to reflect new naming rules for patches

Those will be in effect after 1.5-dev7 is released.

13 years ago[BUILD] stats: stdint is not present on solaris
Willy Tarreau [Sat, 10 Sep 2011 18:38:15 +0000 (20:38 +0200)] 
[BUILD] stats: stdint is not present on solaris

It was added with commit cec9a227 to use uint32_t, though it does
not exist on solaris 8 but is not needed either.

13 years ago[OPTIM] task: don't scan the run queue if we know it's empty
Willy Tarreau [Sat, 10 Sep 2011 18:08:49 +0000 (20:08 +0200)] 
[OPTIM] task: don't scan the run queue if we know it's empty

It happens quite often in fact, so let's save those precious cycles.

13 years ago[MINOR] startup: add an option to change to a new directory
Willy Tarreau [Sat, 10 Sep 2011 17:26:56 +0000 (19:26 +0200)] 
[MINOR] startup: add an option to change to a new directory

Passing -C <dir> causes haproxy to chdir to <dir> before loading
any file. The argument may be passed anywhere on the command line.
A typical use case is :

  $ haproxy -C /etc/haproxy -f global.cfg -f haproxy.cfg

13 years ago[CLEANUP] startup: report only the basename in the usage message
Willy Tarreau [Sat, 10 Sep 2011 17:20:23 +0000 (19:20 +0200)] 
[CLEANUP] startup: report only the basename in the usage message

Don't write the full path to the program, just the program name.

13 years ago[MEDIUM] poll: add a measurement of idle vs work time
Willy Tarreau [Sat, 10 Sep 2011 14:56:42 +0000 (16:56 +0200)] 
[MEDIUM] poll: add a measurement of idle vs work time

We now measure the work and idle times in order to report the idle
time in the stats. It's expected that we'll be able to use it at
other places later.

13 years ago[OPTIM] halog: add assembly version of the field lookup code
Willy Tarreau [Sat, 10 Sep 2011 10:26:35 +0000 (12:26 +0200)] 
[OPTIM] halog: add assembly version of the field lookup code

Gcc tries to be a bit too smart in these small loops and the result is
that on i386 we waste a lot of time there. By recoding these loops in
assembly, we save up to 23% total processing time on i386! The savings
on x86_64 are much lower, probably because there are more registers and
gcc has to do less tricks. However, those savings vary a lot between gcc
versions and even cause harm on some of them (eg: 4.4) because gcc does
not know how to optimize the code once inlined.

However, by recoding field_start() in C to try to match the assembly
code as much as possible, we can significantly reduce its execution
time without risking the negative impacts. Thus, the assembly version
is less interesting there but still worth being used on some compilers.

13 years ago[OPTIM] halog: make fgets parse more bytes by blocks
Willy Tarreau [Sat, 10 Sep 2011 08:25:05 +0000 (10:25 +0200)] 
[OPTIM] halog: make fgets parse more bytes by blocks

By adding a "landing area" at the end of the buffer, it becomes safe to
parse more bytes at once. On 32-bit this makes fgets run about 4% faster
but it does not save anything on 64-bit.

13 years ago[MINOR] http: *_dom matching header functions now also split on ":"
Finn Arne Gangstad [Fri, 9 Sep 2011 14:09:50 +0000 (16:09 +0200)] 
[MINOR] http: *_dom matching header functions now also split on ":"

*_dom is mostly used for matching Host headers, and host headers may
include port numbers. To avoid having to create multiple rules with
and without :<port-number> in hdr_dom rules, change the *_dom
matching functions to also handle : as a delimiter.

Typically there are rules like this in haproxy.cfg:

  acl is_foo  hdr_dom(host) www.foo.com

Most clients send "Host: www.foo.com" in their HTTP header, but some
send "Host: www.foo.com:80" (which is allowed), and the above
rule will now work for those clients as well.

[Note: patch was edited before merge, any unexpected bug is mine /willy]

13 years ago[MINOR] frontend: ensure debug message length is always initialized
Willy Tarreau [Fri, 9 Sep 2011 09:21:06 +0000 (11:21 +0200)] 
[MINOR] frontend: ensure debug message length is always initialized

If the socket family ever changes from AF_INET*/AF_UNIX, we'd have a problem.

13 years ago[MINOR] halog: do not consider byte 0x8A as end of line
Willy Tarreau [Fri, 9 Sep 2011 06:21:55 +0000 (08:21 +0200)] 
[MINOR] halog: do not consider byte 0x8A as end of line

A bug in the algorithm used to find an LF in multiple bytes at once
made byte 0x80 trigger detection of byte 0x00, thus 0x8A matches byte
0x0A. In practice, this issue never happens since byte 0x8A won't be
displayed in logs (or it will be encoded). This could still possibly
happen in mixed logs.

13 years ago[MEDIUM] stats: offer the possibility to kill sessions by server
Willy Tarreau [Wed, 7 Sep 2011 21:48:48 +0000 (23:48 +0200)] 
[MEDIUM] stats: offer the possibility to kill sessions by server

It's now possible to issue "shutdown sessions server <back/srv>" and have
all this server's sessions immediately killed.

13 years ago[CLEANUP] stats: centralize tests for backend/server inputs on the CLI
Willy Tarreau [Wed, 7 Sep 2011 21:41:01 +0000 (23:41 +0200)] 
[CLEANUP] stats: centralize tests for backend/server inputs on the CLI

The tests were repeated many times. Let's put them at one single place.

13 years ago[MEDIUM] stats: offer the possibility to kill a session from the CLI
Willy Tarreau [Wed, 7 Sep 2011 21:21:03 +0000 (23:21 +0200)] 
[MEDIUM] stats: offer the possibility to kill a session from the CLI

It's now possible to issue "shutdown session 0xXXXXXXXX" and have this
session immediately killed. Useful for long-running fantoms.

13 years ago[MEDIUM] session: make session_shutdown() an independant function
Willy Tarreau [Wed, 7 Sep 2011 21:01:56 +0000 (23:01 +0200)] 
[MEDIUM] session: make session_shutdown() an independant function

We already had the ability to kill a connection, but it was only
for the checks. Now we can do this for any session, and for this we
add a specific flag "K" to the logs.

13 years ago[MEDIUM] stats: add the ability to enable/disable/shutdown a frontend at runtime
Willy Tarreau [Wed, 7 Sep 2011 20:37:44 +0000 (22:37 +0200)] 
[MEDIUM] stats: add the ability to enable/disable/shutdown a frontend at runtime

The stats socket now allows the admin to disable, enable or shutdown a frontend.
This can be used when a bug is discovered in a configuration and it's desirable
to fix it but the rules in place don't allow to change a running config. Thus it
becomes possible to kill the frontend to release the port and start a new one in
a separate process.

This can also be used to temporarily make haproxy return TCP resets to incoming
requests to pretend the service is not bound. For instance, this may be useful
to quickly flush a very deep SYN backlog.

The frontend check and lookup code was factored with the "set maxconn" usage.

13 years ago[BUG] peers: ensure the peers are resumed if they were paused
Willy Tarreau [Wed, 7 Sep 2011 19:33:14 +0000 (21:33 +0200)] 
[BUG] peers: ensure the peers are resumed if they were paused

Upon an incoming soft restart request, we first pause all frontends and
peers. If the caller changes its mind and asks us to resume (eg: failed
binding), we must resume all the frontends and peers. Unfortunately the
peers were not resumed.

The code was arranged to avoid code duplication (which used to hide the
issue till now).

13 years ago[BUG] peers: don't keep a peers section which has a NULL frontend
Willy Tarreau [Wed, 7 Sep 2011 19:24:49 +0000 (21:24 +0200)] 
[BUG] peers: don't keep a peers section which has a NULL frontend

If a peers section has no peer named as the local peer, we must destroy
it, otherwise a NULL peer frontend remains in the lists and a segfault
can happen upon a soft restart.

We also now report the missing peer name in order to help troubleshooting.

13 years ago[CLEANUP] proxy: make pause_proxy() perform the required controls and emit the logs
Willy Tarreau [Wed, 7 Sep 2011 17:14:57 +0000 (19:14 +0200)] 
[CLEANUP] proxy: make pause_proxy() perform the required controls and emit the logs

It avoids duplicated code in the caller.

13 years ago[BUG] peers: the peer frontend must not emit any log
Willy Tarreau [Wed, 7 Sep 2011 16:41:08 +0000 (18:41 +0200)] 
[BUG] peers: the peer frontend must not emit any log

Peers' frontends must have logging disabled by default, which was not
the case, so logs were randomly emitted upon restart, sometimes causing
a new process to fail to replace the old one.

13 years ago[MEDIUM] don't limit peers nor stats socket to maxconn nor maxconnrate
Willy Tarreau [Wed, 7 Sep 2011 16:00:47 +0000 (18:00 +0200)] 
[MEDIUM] don't limit peers nor stats socket to maxconn nor maxconnrate

The peers and the stats socket are control sockets, they must not be
limited by traffic rules.

13 years ago[BUG] peers: don't pre-allocate 65000 connections to each peer
Willy Tarreau [Wed, 7 Sep 2011 15:40:39 +0000 (17:40 +0200)] 
[BUG] peers: don't pre-allocate 65000 connections to each peer

This made sense a long time ago but since the maxconn is dynamically
computed from the tracking tables, it does not make any sense anymore
and will harm future changes.

13 years ago[MEDIUM] stats: add the ability to adjust the global maxconnrate
Willy Tarreau [Wed, 7 Sep 2011 14:13:44 +0000 (16:13 +0200)] 
[MEDIUM] stats: add the ability to adjust the global maxconnrate

Using "set rate-limit connections global <xxx>" on the CLI, we can now
adjust the per-process connection rate limiting (equal to global.maxconnrate).

13 years ago[MINOR] stats: report the current and max global connection rates
Willy Tarreau [Wed, 7 Sep 2011 13:26:48 +0000 (15:26 +0200)] 
[MINOR] stats: report the current and max global connection rates

The HTML page reports the current process connection rate, and the
"show info" command on the stats socket also reports the conn rate
limit and the max conn rate that was once reached.

Note that the max value can be cleared using "clear counters".

13 years ago[MEDIUM] add support for global.maxconnrate to limit the per-process conn rate.
Willy Tarreau [Wed, 7 Sep 2011 13:17:21 +0000 (15:17 +0200)] 
[MEDIUM] add support for global.maxconnrate to limit the per-process conn rate.

This one enforces a per-process connection rate limit, regardless of what
may be set per frontend. It can be a way to limit the CPU usage of a process
being severely attacked.

The side effect is that the global process connection rate is now measured
for each incoming connection, so it will be possible to report it.

13 years ago[MEDIUM] stats: add the "set maxconn" setting to the command line interface
Willy Tarreau [Wed, 7 Sep 2011 12:38:31 +0000 (14:38 +0200)] 
[MEDIUM] stats: add the "set maxconn" setting to the command line interface

This option permits to change the global maxconn setting within the
limit that was set by the initial value, which is now reported as the
hard maxconn value. This allows to immediately accept more concurrent
connections or to stop accepting new ones until the value passes below
the indicated setting.

The main use of this option is on systems where many haproxy instances
are loaded and admins need to re-adjust resource sharing at run time
to regain a bit of fairness between processes.