]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
11 years agoMEDIUM: sample: let the cast functions set their output type
Thierry FOURNIER [Tue, 26 Nov 2013 19:47:54 +0000 (20:47 +0100)] 
MEDIUM: sample: let the cast functions set their output type

This patch allows each sample cast function to specify the sample
output type. The goal is to be able to emit an output type IPv4 or
IPv6 depending on what is found in the input if the next converter
is able to process them both.

The patch also adds a new pseudo type called "ADDR". This type is an
alias for IPV4 and IPV6 which is only used as an input type by converters
who want to express their compatibility with both address formats. It may
not be emitted.

The goal is to unify as much as possible the processing of IPv4 and IPv6
in order not to add extra keywords for the maps which act as converters,
but will match samples like ACLs do with their patterns.

11 years agoMEDIUM: stick-tables: support automatic conversion from ipv4<->ipv6
Willy Tarreau [Mon, 2 Dec 2013 22:17:27 +0000 (23:17 +0100)] 
MEDIUM: stick-tables: support automatic conversion from ipv4<->ipv6

Make the stick-table key converter automatically adapt to the address
family of the input sample. Samples such as "src" will return an address
with a sample type depending on the input family. We'll have to support
such combinations when we add support for maps because the output type
will not necessarily be fixed.

11 years agoMINOR: pattern: import acl_find_match_name() into pattern.h
Willy Tarreau [Thu, 28 Nov 2013 21:24:25 +0000 (22:24 +0100)] 
MINOR: pattern: import acl_find_match_name() into pattern.h

It's only dedicated to pattern match lookups, so it was renamed
pat_find_match_name().

11 years agoMINOR: acl/pattern: use types different from int to clarify who does what.
Willy Tarreau [Thu, 28 Nov 2013 21:21:02 +0000 (22:21 +0100)] 
MINOR: acl/pattern: use types different from int to clarify who does what.

We now have the following enums and all related functions return them and
consume them :

   enum pat_match_res {
PAT_NOMATCH = 0,         /* sample didn't match any pattern */
PAT_MATCH = 3,           /* sample matched at least one pattern */
   };

   enum acl_test_res {
ACL_TEST_FAIL = 0,           /* test failed */
ACL_TEST_MISS = 1,           /* test may pass with more info */
ACL_TEST_PASS = 3,           /* test passed */
   };

   enum acl_cond_pol {
ACL_COND_NONE, /* no polarity set yet */
ACL_COND_IF, /* positive condition (after 'if') */
ACL_COND_UNLESS, /* negative condition (after 'unless') */
   };

It's just in order to avoid doubts when reading some code.

11 years agoMEDIUM: pattern: rename "acl" prefix to "pat"
Thierry FOURNIER [Thu, 28 Nov 2013 17:22:00 +0000 (18:22 +0100)] 
MEDIUM: pattern: rename "acl" prefix to "pat"

This patch just renames functions, types and enums. No code was changed.
A significant number of files were touched, especially the ACL arrays,
so it is likely that some external patches will not apply anymore.

One important thing is that we had to split ACL_PAT_* into two groups :
  - ACL_TEST_{PASS|MISS|FAIL}
  - PAT_{MATCH|UNMATCH}

A future patch will enforce enums on all these places to avoid confusion.

11 years agoMEDIUM: pattern: create pattern expression
Thierry FOURNIER [Thu, 28 Nov 2013 10:41:23 +0000 (11:41 +0100)] 
MEDIUM: pattern: create pattern expression

This new structure contains the data needed for pattern matching. It's
the first step to the complete independance of the pattern matching.

11 years agoREORG: acl/pattern: extract pattern matching from the acl file and create pattern.c
Thierry FOURNIER [Thu, 28 Nov 2013 10:05:19 +0000 (11:05 +0100)] 
REORG: acl/pattern: extract pattern matching from the acl file and create pattern.c

This patch just moves code without any change.

The ACL are just the association between sample and pattern. The pattern
contains the match method and the parse method. These two things are
different. This patch cleans the code by splitting it.

11 years agoMEDIUM: acl: associate "struct sample_storage" to each "struct acl_pattern"
Thierry FOURNIER [Fri, 22 Nov 2013 18:14:42 +0000 (19:14 +0100)] 
MEDIUM: acl: associate "struct sample_storage" to each "struct acl_pattern"

This will be used later with maps. Each map will associate an entry with
a sample_storage value.

This patch changes the "parse" prototype and all the parsing methods.
The goal is to associate "struct sample_storage" to each entry of
"struct acl_pattern". Only the "parse" function can add the sample value
into the "struct acl_pattern".

11 years agoMINOR: sample: Define new struct sample_storage
Thierry FOURNIER [Tue, 26 Nov 2013 09:21:51 +0000 (10:21 +0100)] 
MINOR: sample: Define new struct sample_storage

This struct is used to store a sample constant. The size of this
struct is less than the struct sample. This struct only contains
a constant and doesn't need the "ctx" nor the "flags".

11 years agoMINOR: acl: Extract the pattern matching function
Thierry FOURNIER [Fri, 22 Nov 2013 17:03:42 +0000 (18:03 +0100)] 
MINOR: acl: Extract the pattern matching function

The map feature will need to match acl patterns. This patch extracts
the matching function from the global ACL function "acl_exec_cond".

The code was only moved to its own function, no functional changes were made.

11 years agoMINOR: acl: Extract the pattern parsing and indexation from the "acl_read_patterns_fr...
Thierry FOURNIER [Fri, 22 Nov 2013 16:33:27 +0000 (17:33 +0100)] 
MINOR: acl: Extract the pattern parsing and indexation from the "acl_read_patterns_from_file()" function

With this split, the pattern indexation can apply to any source. The map
feature needs this functionality because the map cannot be loaded with the
same file format as the ones supported by acl_read_patterns_from_file().

The code was only moved to its own function, no functional changes were made.

11 years agoMINOR: acl: export acl arrays
Thierry FOURNIER [Fri, 22 Nov 2013 16:25:35 +0000 (17:25 +0100)] 
MINOR: acl: export acl arrays

The map feature needs to use the acl parser and converters.

11 years agoMINOR: tools: Add a function to convert buffer to an ipv6 address
Thierry FOURNIER [Fri, 22 Nov 2013 15:16:59 +0000 (16:16 +0100)] 
MINOR: tools: Add a function to convert buffer to an ipv6 address

The inet_pton function needs an input string with a final \0. This
function copies the input string to a temporary buffer, adds the final
\0 and converts to address.

11 years agoMINOR: sample: provide the original sample_conv descriptor struct to the argument...
Thierry FOURNIER [Thu, 21 Nov 2013 12:37:41 +0000 (13:37 +0100)] 
MINOR: sample: provide the original sample_conv descriptor struct to the argument checker function.

Note that this argument checker is still unused but will be used by
maps.

11 years agoDOC: add some information about how to apply converters to samples
Willy Tarreau [Tue, 26 Nov 2013 18:02:32 +0000 (19:02 +0100)] 
DOC: add some information about how to apply converters to samples

We've had the feature for log-format, unique-id-format and add-header for
a while now. It has just been implemented for ACLs but some doc was still
lacking.

11 years agoMINOR: stick-table: use smp_expr_output_type() to retrieve the output type of a ...
Thierry FOURNIER [Wed, 27 Nov 2013 14:30:55 +0000 (15:30 +0100)] 
MINOR: stick-table: use smp_expr_output_type() to retrieve the output type of a "struct sample_expr"

It's just a minor cleanup.

11 years agoMEDIUM: acl: use the fetch syntax 'fetch(args),conv(),conv()' into the ACL keyword
Thierry FOURNIER [Thu, 21 Nov 2013 09:50:10 +0000 (10:50 +0100)] 
MEDIUM: acl: use the fetch syntax 'fetch(args),conv(),conv()' into the ACL keyword

If the acl keyword is a "fetch", the dedicated parsing function
"sample_parse_expr()" is used. Otherwise, the acl parsing function
"parse_acl_expr()" is extended to understand the syntax of a series
of converters placed after the "fetch" keyword.

Before this patch, each acl uses a "struct sample_fetch" and executes
it with the "<fetch>->process()" function. Now, the dedicated function
"sample_process()" is called.

These syntax are now avalaible:

   acl bad req.hdr(host),lower -m str www
   http-request redirect prefix /go-away if bad

   acl bad hdr_beg(host),lower www
   http-request redirect prefix /go-away if bad

11 years agoMINOR: sample: export sample_casts
Thierry FOURNIER [Thu, 21 Nov 2013 09:53:12 +0000 (10:53 +0100)] 
MINOR: sample: export sample_casts

just export the sample cast matrix "sample_casts" to prepare the
generic sample conversion parser.

11 years agoMINOR: sample: export the generic sample conversion parser
Thierry FOURNIER [Thu, 21 Nov 2013 09:51:50 +0000 (10:51 +0100)] 
MINOR: sample: export the generic sample conversion parser

just export function "find_sample_conv()" to prepare the
generic sample conversion parser.

11 years agoBUG/MINOR: log: fix log-format parsing errors
Willy Tarreau [Mon, 2 Dec 2013 11:24:54 +0000 (12:24 +0100)] 
BUG/MINOR: log: fix log-format parsing errors

Some errors were still reported as log-format instead of their respective
contexts (acl, request header, stick, ...). This is harmless and does not
require any backport.

11 years agoBUG/MINOR: config: report the correct track-sc number in tcp-rules
Willy Tarreau [Mon, 2 Dec 2013 22:29:05 +0000 (23:29 +0100)] 
BUG/MINOR: config: report the correct track-sc number in tcp-rules

When parsing track-sc* actions in tcp-request rules, we now automatically
compute the track-sc identifier number using %d when displaying an error
message. But the ID has become wrong since we introduced sc0, we continue
to report id+1 in error messages causing some confusion.

No backport is needed.

11 years agoBUG/MINOR: backend: fix target address retrieval in transparent mode
Willy Tarreau [Sun, 1 Dec 2013 20:46:24 +0000 (21:46 +0100)] 
BUG/MINOR: backend: fix target address retrieval in transparent mode

A very old bug resulting from some code refactoring causes
assign_server_address() to refrain from retrieving the destination
address from the client-side connection when transparent mode is
enabled and we're connecting to a server which has address 0.0.0.0.

The impact is low since such configurations are unlikely to ever
be encountered. The fix should be backported to older branches.

11 years agoBUG/MINOR: connection: fix typo in error message report
Willy Tarreau [Sun, 1 Dec 2013 19:29:58 +0000 (20:29 +0100)] 
BUG/MINOR: connection: fix typo in error message report

"unknownn" -> "unknown"

11 years agoBUG/MINOR: arg: fix error reporting for add-header/set-header sample fetch arguments
Thierry FOURNIER [Wed, 20 Nov 2013 14:09:52 +0000 (15:09 +0100)] 
BUG/MINOR: arg: fix error reporting for add-header/set-header sample fetch arguments

The 'add-header %[samples]' parsing errors associated to http-request
and http-response are displayed with the wrong keyword.

Configuration entry:

   http-request set-header mon-header %[res.hdr(user-agent)]

Original error message:

   [WARNING] 323/150920 (16559) : parsing [haproxy.conf:36] : 'log-format' : sample fetch <res.hdr ...

After commit error message:

   [WARNING] 323/150929 (16580) : parsing [haproxy.conf:36] : 'http-request' : sample fetch <res.hdr ...

11 years agoBUG/MEDIUM: sample: The function v4tov6 cannot support input and output overlap
Thierry FOURNIER [Thu, 28 Nov 2013 15:33:15 +0000 (16:33 +0100)] 
BUG/MEDIUM: sample: The function v4tov6 cannot support input and output overlap

This patch permits to use v4tov6 with the same input and output buffer. It
might have impacted the format of IPv4 addresses stored into IPv6 tables.

11 years agoBUG/MINOR: stats: do not report "via" on tracking servers in maintenance
Willy Tarreau [Thu, 28 Nov 2013 09:50:06 +0000 (10:50 +0100)] 
BUG/MINOR: stats: do not report "via" on tracking servers in maintenance

When a server tracks another one, its state on the stats page always reports
"via xx/yy". That's convenient to know what server to act on to change the
state. But it is also possible to force the tracking server itself into
maintenance mode and in this case we should not report "via xx/yy" because
the tracked server can't do anything to change the server's state, which
is confusing. In practice there is nothing wrong in leaving it as-is,
except that it's highly misleading when looking at the stats page.

Note that we only change the HTML output, not the CSV one. The states are
already different : "MAINT" vs "MAINT(via)" and we expect anyone coding a
monitoring system based on the CSV output to know the differences between
all possible states.

11 years agoBUG/MAJOR: check: fix haproxy crash during soft-stop/soft-start
Willy Tarreau [Thu, 28 Nov 2013 10:27:16 +0000 (11:27 +0100)] 
BUG/MAJOR: check: fix haproxy crash during soft-stop/soft-start

This is the continuation of previous fix bc16cd8 "BUG/MAJOR: fix haproxy
crash when using server tracking instead of checks", the soft-stop/start
states were not addressed by this fix.

11 years agoBUG/MAJOR: fix haproxy crash when using server tracking instead of checks
Willy Tarreau [Wed, 27 Nov 2013 15:52:23 +0000 (16:52 +0100)] 
BUG/MAJOR: fix haproxy crash when using server tracking instead of checks

Igor at owind reported a very recent bug (just present in latest snapshot).
Commit "4a741432 MEDIUM: Paramatise functions over the check of a server"
causes up/down to die with tracked servers due to a typo.

The following call in set_server_down causes the server to put itself
down recurseively because "check" is the current server's check, so once
fed to the function again, it will pass through the exact same path (note
we have the exact symmetry in set_server_up) :

for (srv = s->tracknext; srv; srv = srv->tracknext)
if (!(srv->state & SRV_MAINTAIN))
/* Only notify tracking servers that are not already in maintenance. */
set_server_down(check);

Instead we should stop the tracking server being visited in the loop :

for (srv = s->tracknext; srv; srv = srv->tracknext)
if (!(srv->state & SRV_MAINTAIN))
/* Only notify tracking servers that are not already in maintenance. */
set_server_down(&srv->check);

But that's not exactly enough because srv->check->server is only set when
checks are enabled, so ->server is NULL for tracking servers, still causing a
crash upon first iteration. The fix is easy and consists in always initializing
check->server when creating a new server, which is what was already done a few
patches later by 69d29f9 (MEDIUM: cfgparse: Factor out check initialisation).

With the fix above alone on top of current version or snapshot 20131122, the
problem disappears.

Thanks to Igor for testing and reporting the issue.

11 years agoMINOR: peers: accept to learn strings of different lengths
Willy Tarreau [Mon, 25 Nov 2013 22:02:37 +0000 (23:02 +0100)] 
MINOR: peers: accept to learn strings of different lengths

While analysing old bug (9d9179b) with Emeric, we first believed
that the fix was wrong and that there was a potential for learning
one extra character in the peers learning code for strings due to
the use of table->key_size instead of table->key_size-1. In fact it
cannot happen with a normally behaving sender because the key sizes
are compared when synchronizing the table.

But this unveiled a suboptimal handling of strings. It can be quite
common to see admins reload haproxy to increase some key sizes when
seeing that user agents or cookies get truncated, or conversely to
reduce them after seeing they take too much memory and are never full.
The problem is that this will get rid of the table's contents because
of the size mismatch. While this is understandable for properly
formatted data (eg: IP addresses, integers, SSLIDs...) it's too bad
for strings.

So instead, make an exception to accept string of incompatible lengths
and let the synchronization code truncate them to the appropriate size
just as if the keys were learned normally.

Thanks to this change, it is now possible to change the "len" parameter
of a string stick-table and restart without losing its contents.

11 years agoOPTIM: connection: fold the error handling with handshake handling
Willy Tarreau [Mon, 25 Nov 2013 07:41:15 +0000 (08:41 +0100)] 
OPTIM: connection: fold the error handling with handshake handling

Both of them are rare and are detected from the same flags source, so
let's detect errors in the handshake loop and remove two tests in the
fast path. This seems to improve overall performance by less than 0.5%
on connection-bound workloads.

11 years agoMEDIUM: Add DRAIN state and report it on the stats page
Simon Horman [Mon, 25 Nov 2013 01:46:40 +0000 (10:46 +0900)] 
MEDIUM: Add DRAIN state and report it on the stats page

Add a DRAIN sub-state for a server which
will be shown on the stats page instead of UP if
its effective weight is zero.

Also, log if a server enters or leaves the DRAIN state
as the result of an agent check.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Add enable and disable agent unix socket commands
Simon Horman [Mon, 25 Nov 2013 01:46:39 +0000 (10:46 +0900)] 
MEDIUM: Add enable and disable agent unix socket commands

The syntax of this new commands are:

enable agent <backend>/<server>
disable agent <backend>/<server>

These commands allow temporarily stopping and subsequently
re-starting an auxiliary agent check. The effect of this is as follows:

New checks are only initialised when the agent is in the enabled. Thus,
disable agent will prevent any new agent checks from begin initiated until
the agent re-enabled using enable agent.

When an agent is disabled the processing of an auxiliary agent check that
was initiated while the agent was set as enabled is as follows: All
results that would alter the weight, specifically "drain" or a weight
returned by the agent, are ignored. The processing of agent check is
otherwise unchanged.

The motivation for this feature is to allow the weight changing effects
of the agent checks to be paused to allow the weight of a server to be
configured using set weight without being overridden by the agent.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Set rise and fall of agent checks to 1
Simon Horman [Mon, 25 Nov 2013 01:46:38 +0000 (10:46 +0900)] 
MEDIUM: Set rise and fall of agent checks to 1

This is achieved by moving rise and fall from struct server to struct check.

After this move the behaviour of the primary check, server->check is
unchanged. However, the secondary agent check, server->agent now has
independent rise and fall values each of which are set to 1.

The result is that receiving "fail", "stopped" or "down" just once from the
agent will mark the server as down. And receiving a weight just once will
allow the server to be marked up if its primary check is in good health.

This opens up the scope to allow the rise and fall values of the agent
check to be configurable, however this has not been implemented at this
stage.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Do not mark a server as down if the agent is unavailable
Simon Horman [Mon, 25 Nov 2013 01:46:37 +0000 (10:46 +0900)] 
MEDIUM: Do not mark a server as down if the agent is unavailable

In the case where agent-port is used and the agent
check is a secondary check to not mark a server as down
if the agent becomes unavailable.

In this configuration the agent should only cause a server to be marked
as down if the agent returns "fail", "stopped" or "down".

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: checks: Add supplementary agent checks
Simon Horman [Mon, 25 Nov 2013 01:46:36 +0000 (10:46 +0900)] 
MEDIUM: checks: Add supplementary agent checks

Allow an auxiliary agent check to be run independently of the
regular a regular health check. This is enabled by the agent-check
server setting.

The agent-port, which specifies the TCP port to use for the agent's
connections, is required.

The agent-inter, which specifies the interval between agent checks and
timeout of agent checks, is optional. If not set the value for regular
checks is used.

e.g.
server web1_1 127.0.0.1:80 check agent-port 10000

If either the health or agent check determines that a server is down
then it is marked as being down, otherwise it is marked as being up.

An agent health check performed by opening a TCP socket and reading an
ASCII string. The string should have one of the following forms:

* An ASCII representation of an positive integer percentage.
  e.g. "75%"

  Values in this format will set the weight proportional to the initial
  weight of a server as configured when haproxy starts.

* The string "drain".

  This will cause the weight of a server to be set to 0, and thus it
  will not accept any new connections other than those that are
  accepted via persistence.

* The string "down", optionally followed by a description string.

  Mark the server as down and log the description string as the reason.

* The string "stopped", optionally followed by a description string.

  This currently has the same behaviour as "down".

* The string "fail", optionally followed by a description string.

  This currently has the same behaviour as "down".

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Remove option lb-agent-chk
Simon Horman [Mon, 25 Nov 2013 01:46:35 +0000 (10:46 +0900)] 
MEDIUM: Remove option lb-agent-chk

Remove option lb-agent-chk and thus the facility to configure
a stand-alone agent health check. This feature was added by
"MEDIUM: checks: Add agent health check". It will be replaced
by subsequent patches with a features to allow an agent check
to be run as either a secondary check, along with any of the existing
checks, or as part of an http check with the status returned
in an HTTP header.

This patch does not entirely revert "MEDIUM: checks: Add agent health
check". The infrastructure it provides to parse the results of an
agent health check remains and will be re-used by the planned features
that are mentioned above.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Log agent fail, stopped or down as info
Simon Horman [Mon, 25 Nov 2013 01:46:34 +0000 (10:46 +0900)] 
MEDIUM: Log agent fail, stopped or down as info

In the case where an agent check returns fail, stopped or down,
log this as info when logging the server status along with any
trailing message returned by the agent after fail, stopped or down.

Previously only the trailing message was logged as info and
if omitted no info was logged.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Add helper function for failed checks
Simon Horman [Mon, 25 Nov 2013 01:46:33 +0000 (10:46 +0900)] 
MEDIUM: Add helper function for failed checks

This consolidates some logic in preparation for enhancing it.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Add helper for task creation for checks
Simon Horman [Mon, 25 Nov 2013 01:46:32 +0000 (10:46 +0900)] 
MEDIUM: Add helper for task creation for checks

This helper is in preparation for adding a second struct check element
to struct server.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoLOW: systemd-wrapper: Write debug information to stdout
Kristoffer Grönlund [Fri, 22 Nov 2013 10:11:54 +0000 (11:11 +0100)] 
LOW: systemd-wrapper: Write debug information to stdout

Write the command line used to call haproxy to stdout, as
well as the return code returned by the haproxy process.

11 years agoMEDIUM: systemd-wrapper: Kill child processes when interrupted
Kristoffer Grönlund [Fri, 22 Nov 2013 10:09:39 +0000 (11:09 +0100)] 
MEDIUM: systemd-wrapper: Kill child processes when interrupted

Send SIGINT to child processes when killed. This ensures that
the haproxy process managed by the systemd-wrapper is stopped
when "systemctl stop haproxy.service" is called.

11 years agoMEDIUM: haproxy-systemd-wrapper: Use haproxy in same directory
Kristoffer Grönlund [Fri, 22 Nov 2013 10:06:34 +0000 (11:06 +0100)] 
MEDIUM: haproxy-systemd-wrapper: Use haproxy in same directory

Locate the wrapper and use a haproxy executable found in the
same directory.

This patch lets the wrapper work in openSUSE.

11 years agoMINOR: stats: report correct throttling percentage for servers in slowstart
Willy Tarreau [Thu, 21 Nov 2013 14:30:45 +0000 (15:30 +0100)] 
MINOR: stats: report correct throttling percentage for servers in slowstart

The column used to report the throttle percentage when a server is in
slowstart is based on the time only. This is wrong, because server weights
in slowstart are updated at most once a second, so the reported value is
wrong at least fo rone second during each step, which means all the time
when using short delays (< 20s).

The second point is that it's disturbing to see a weight < 100% without
any throttle at the end of the period (during the last second), because
the effective weight has not yet been updated.

Instead, we now compute the exact ratio between eweight and uweight and
report it. It's always accurate and describes the value being used instead
of using only the date.

It can be backported to 1.4 though it's not particularly important.

11 years agoBUG/MAJOR: server: weight calculation fails for map-based algorithms
Willy Tarreau [Thu, 21 Nov 2013 10:22:01 +0000 (11:22 +0100)] 
BUG/MAJOR: server: weight calculation fails for map-based algorithms

A crash was reported by Igor at owind when changing a server's weight
on the CLI. Lukas Tribus could reproduce a related bug where setting
a server's weight would result in the new weight being multiplied by
the initial one. The two bugs are the same.

The incorrect weight calculation results in the total farm weight being
larger than what was initially allocated, causing the map index to be out
of bounds on some hashes. It's easy to reproduce using "balance url_param"
with a variable param, or with "balance static-rr".

It appears that the calculation is made at many places and is not always
right and not always wrong the same way. Thus, this patch introduces a
new function "server_recalc_eweight()" which is dedicated to this task
of computing ->eweight from many other elements including uweight and
current time (for slowstart), and all users now switch to use this
function.

The patch is a bit large but the code was not trivially fixable in a way
that could guarantee this situation would not occur anymore. The fix is
much more readable and has been verified to work with all algorithms,
with both consistent and map-based hashes, and even with static-rr.

Slowstart was tested as well, just like enable/disable server.

The same bug is very likely present in 1.4 as well, so the patch will
probably need to be backported eventhough it will not apply as-is.

Thanks to Lukas and Igor for the information they provided to reproduce it.

11 years agoBUG/MEDIUM: checks: fix slow start regression after fix attempt
Willy Tarreau [Thu, 21 Nov 2013 10:50:50 +0000 (11:50 +0100)] 
BUG/MEDIUM: checks: fix slow start regression after fix attempt

Commit 2e99390 (BUG/MEDIUM: checks: fix slowstart behaviour when server
tracking is in use) moved the slowstart task initialization within the
health check code and leaves it unset when checks are disabled. The
problem is that it's possible to trigger slowstart from the CLI by
issuing "disable server XXX / enable server XXX" even when checks are
disabled. The result is a crash when trying to wake up the slowstart
task of that server.

Move the task initialization earlier so that it is done even if the
checks are disabled.

This patch should be backported to 1.4 since the commit above was
backported there.

11 years agoMINOR: buffer: align the last output line if there are less than 8 characters left
Godbach [Thu, 21 Nov 2013 02:21:22 +0000 (10:21 +0800)] 
MINOR: buffer: align the last output line if there are less than 8 characters left

Commit c08057c does the align job for buffer_dump(), but it has not fixed the
issue that less than 8 characters are left in the last line as below:

Dumping contents from byte 0 to byte 119
         0  1  2  3  4  5  6  7    8  9  a  b  c  d  e  f
  0000: 47 45 54 20 2f 69 6e 64 - 65 78 2e 68 74 6d 20 48   GET /index.htm H
  0010: 54 54 50 2f 31 2e 30 0d - 0a 55 73 65 72 2d 41 67   TTP/1.0..User-Ag
  ...
  0060: 6e 65 63 74 69 6f 6e 3a - 20 4b 65 65 70 2d 41 6c   nection: Keep-Al
  0070: 69 76 65 0d 0a 0d 0a                              ive....

The last line of the hex column is still overlapped by the text column. Since
there will be additional "- " for the output line which has no less than 8
characters, two additional spaces should be present when there is less than 8
characters in order to do alignment. The result after being fixed is as below:

Dumping contents from byte 0 to byte 119
         0  1  2  3  4  5  6  7    8  9  a  b  c  d  e  f
  0000: 47 45 54 20 2f 69 6e 64 - 65 78 2e 68 74 6d 20 48   GET /index.htm H
  0010: 54 54 50 2f 31 2e 30 0d - 0a 55 73 65 72 2d 41 67   TTP/1.0..User-Ag
  ...
  0060: 6e 65 63 74 69 6f 6e 3a - 20 4b 65 65 70 2d 41 6c   nection: Keep-Al
  0070: 69 76 65 0d 0a 0d 0a                                ive....

Signed-off-by: Godbach <nylzhaowei@gmail.com>
11 years agoDOC: Documentation for hashing function, with test results.
Bhaskar Maddala [Wed, 20 Nov 2013 17:55:21 +0000 (12:55 -0500)] 
DOC: Documentation for hashing function, with test results.

Summary:
Added a document for hashing under internal docs explaining
hashing in haproxy along with the results of tests under the test
folder.

These documents together explain the motivation for adding
options for hashing algorithms with the option of enabling or
disabling of avalanche.

11 years agoMEDIUM: Move health element to struct check
Simon Horman [Sun, 24 Feb 2013 08:23:38 +0000 (17:23 +0900)] 
MEDIUM: Move health element to struct check

This is in preparation for associating a agent check
with a server which runs as well as the server's existing check.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Add state to struct check
Simon Horman [Sun, 24 Feb 2013 08:23:38 +0000 (17:23 +0900)] 
MEDIUM: Add state to struct check

Add state to struct check. This is currently used to store one bit,
CHK_RUNNING, which is set if a check is running and clear otherwise.
This bit was previously SRV_CHK_RUNNING of the state element of struct
server.

This is in preparation for associating a agent check
with a server which runs as well as the server's existing check.

Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
11 years agoMEDIUM: cfgparse: Factor out check initialisation
Simon Horman [Sat, 23 Feb 2013 06:14:19 +0000 (15:14 +0900)] 
MEDIUM: cfgparse: Factor out check initialisation

This is in preparation for struct server having two elements
of type struct check.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Paramatise functions over the check of a server
Simon Horman [Sat, 23 Feb 2013 06:35:38 +0000 (15:35 +0900)] 
MEDIUM: Paramatise functions over the check of a server

Paramatise the following functions over the check of a server

* set_server_down
* set_server_up
* srv_getinter
* server_status_printf
* set_server_check_status
* set_server_disabled
* set_server_enabled

Generally the server parameter of these functions has been removed.
Where it is still needed it is obtained using check->server.

This is in preparation for associating a agent check
with a server which runs as well as the server's existing check.
By paramatising these functions they may act on each of the checks
without further significant modification.

Explanation of the SSP_O_HCHK portion of this change:

* Prior to this patch SSP_O_HCHK serves a single purpose which
  is to tell server_status_printf() weather it should print
  the details of the check of a server or not.

  With the paramatisation that this patch adds there are two cases.
  1) Printing the details of the check in which case a
     valid check parameter is needed.
  2) Not printing the details of the check in which case
     the contents check parameter are unused.

  In case 1) we could pass SSP_O_HCHK and a valid check and;
  In case 2) we could pass !SSP_O_HCHK and any value for check
  including NULL.

  If NULL is used for case 2) then SSP_O_HCHK becomes supurfulous
  and as NULL is used for case 2) SSP_O_HCHK has been removed.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Move result element to struct check
Simon Horman [Sat, 23 Feb 2013 22:25:29 +0000 (07:25 +0900)] 
MEDIUM: Move result element to struct check

Move result element from struct server to struct check
This allows check results to be independent of the check's server.

This is in preparation for associating a agent check
with a server which runs as well as the server's existing check.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoMEDIUM: Split up struct server's check element
Simon Horman [Sat, 23 Feb 2013 01:16:43 +0000 (10:16 +0900)] 
MEDIUM: Split up struct server's check element

This is in preparation for associating a agent check
with a server which runs as well as the server's existing check.

The split has been made by:
* Moving elements of struct server's check element that will
  be shared by both checks into a new check_common element
  of struct server.
* Moving the remaining elements to a new struct check and
  making struct server's check element a struct check.
* Adding a server element to struct check, a back-pointer
  to the server element it is a member of.
  - At this time the server could be obtained using
    container_of, however, this will not be so easy
    once a second struct check element is added to struct server
    to accommodate an agent health check.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoCLEANUP: Remove unused 'last_slowstart_change' field from struct peer
Simon Horman [Fri, 1 Nov 2013 07:48:30 +0000 (16:48 +0900)] 
CLEANUP: Remove unused 'last_slowstart_change' field from struct peer

This was inadvertently added by "MEDIUM: checks: Add agent health check".
It appears to have never been used.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoCLEANUP: Make parameters of srv_downtime and srv_getinter const
Simon Horman [Fri, 1 Nov 2013 07:46:15 +0000 (16:46 +0900)] 
CLEANUP: Make parameters of srv_downtime and srv_getinter const

The parameters of srv_downtime and srv_getinter are not modified
and thus may be const.

Signed-off-by: Simon Horman <horms@verge.net.au>
11 years agoBUG/MINOR: http: fix build warning introduced with url32/url32_src
Willy Tarreau [Mon, 18 Nov 2013 17:33:22 +0000 (18:33 +0100)] 
BUG/MINOR: http: fix build warning introduced with url32/url32_src

commit 39c63c5 "url32+src - like base32+src but whole url including parameters"
was missing the last argument "const char *kw", resulting in the build warning
below :

src/proto_http.c:10351:2: warning: initialization from incompatible pointer type [enabled by default]
src/proto_http.c:10351:2: warning: (near initialization for 'sample_fetch_keywords.kw[50].process') [enabled by default]
src/proto_http.c:10352:2: warning: initialization from incompatible pointer type [enabled by default]
src/proto_http.c:10352:2: warning: (near initialization for 'sample_fetch_keywords.kw[51].process') [enabled by default]

It's harmless since it's not needed there anyway.

11 years agoBUG/MEDIUM: http: fix possible parser crash when parsing erroneous "http-request...
Willy Tarreau [Mon, 18 Nov 2013 17:04:25 +0000 (18:04 +0100)] 
BUG/MEDIUM: http: fix possible parser crash when parsing erroneous "http-request redirect" rules

Baptiste Assmann reported a bug affecting the "http-request redirect"
parser. It may randomly crash when reporting an error message if the
syntax is not OK. It happens that this is caused by the output error
message pointer which was not initialized to NULL.

This bug is 1.5-specific (introduced in dev17), no backport is needed.

11 years agourl32+src - like base32+src but whole url including parameters
Neil - HAProxy List [Mon, 4 Nov 2013 13:48:42 +0000 (13:48 +0000)] 
url32+src - like base32+src but whole url including parameters

I have a need to limit traffic to each url from each source address. much
like base32+src but the whole url including parameters (this came from
looking at the recent 'Haproxy rate limit per matching request' thread)

attached is patch that seems to do the job, its a copy and paste job of the
base32 functions

the url32 function seems to work too and using 2 machines to request the
same url locks me out of both if I abuse from either with the url32 key
function and only the one if I use url32_src.

Neil

11 years agoCLEANUP: http: merge error handling for req* and http-request *
Willy Tarreau [Sat, 16 Nov 2013 09:28:23 +0000 (10:28 +0100)] 
CLEANUP: http: merge error handling for req* and http-request *

The reqdeny/reqtarpit and http-request deny/tarpit were using
a copy-paste of the error handling code because originally the
req* actions used to maintain their own stats. This is not the
case anymore so we can use the same error blocks for both.

The http-request rulesets still has precedence over req* so no
functionality was changed.

11 years agoCLEANUP: http: homogenize processing of denied req counter
Willy Tarreau [Sat, 16 Nov 2013 09:13:35 +0000 (10:13 +0100)] 
CLEANUP: http: homogenize processing of denied req counter

The reqdeny/reqideny and reqtarpit/reqitarpit rules used to maintain
the stats counters themselves while http-request deny/tarpit and
rspdeny/rspideny used to centralize them at the point where the
error is processed.

Thus, let's do the same for reqdeny/reqtarpit so that the functions
which iterate over the rules do not have to deal with these counters
anymore.

11 years agoBUG/MINOR: stats: don't count tarpitted connections twice
Willy Tarreau [Sat, 16 Nov 2013 09:06:44 +0000 (10:06 +0100)] 
BUG/MINOR: stats: don't count tarpitted connections twice

When a connection is tarpitted, a denied req is counted once when the
action is applied, and then a failed req is counted when the tarpit
timeout expires. This is completely wrong as the tarpit is exactly
equivalent to a deny since it's a disguised deny.

So let's not increment the failed req anymore.

This fix may be backported to 1.4 which has the same issue.

11 years agoOPTIM/MINOR: mark the source address as already known on accept()
Willy Tarreau [Fri, 15 Nov 2013 23:15:40 +0000 (00:15 +0100)] 
OPTIM/MINOR: mark the source address as already known on accept()

Commit 986a9d2d12 moved the source address from the stream interface
to the session, but it did not set the flag on the connection to
report that the source address is known. Thus when logs are enabled,
we had a call to getpeername() which is redundant with the result
from accept(). This patch simply sets the flag.

11 years agoOPTIM/MEDIUM: epoll: fuse active events into polled ones during polling changes
Willy Tarreau [Fri, 15 Nov 2013 21:48:31 +0000 (22:48 +0100)] 
OPTIM/MEDIUM: epoll: fuse active events into polled ones during polling changes

When trying to speculatively send data to a server being connected to,
we see the following pattern :

    connect() = EINPROGRESS
    send() = EAGAIN
    epoll_ctl(add, W)
    epoll_wait() = EPOLLOUT
    send() = success
  > epoll_ctl(del, W)
  > recv() = EAGAIN
  > epoll_ctl(add, R)
    recv() = success
    epoll_ctl(del, R)

The reason for the failed recv() call is that the reading was marked
as speculative while we already have a polled I/O there. So we already
know when removing send write poll that the read is pending. Thus,
let's improve this by merging speculative I/O into polled I/O when
polled state changes. The result is now the following as expected :

    connect() = EINPROGRESS
    send() = EAGAIN
    epoll_ctl(add, W)
    epoll_wait() = EPOLLOUT
    send() = success
    epoll_ctl(mod, R)
    recv() = success
    epoll_ctl(del, R)

This is specific to epoll(), it doesn't make much sense at the moment
to do so for other pollers, because the cost of updating them is very
small.

The average performance gain on small requests is of 1.6% in TCP mode,
which is easily explained with the syscall stats below for 10000 forwarded
connections :

Before :
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 91.02    0.024608           0     60000         1 epoll_wait
  2.19    0.000593           0     20000           shutdown
  1.52    0.000412           0     10000     10000 connect
  1.36    0.000367           0     29998      9998 sendto
  1.09    0.000294           0     49993           epoll_ctl
  0.93    0.000252           0     50004     20002 recvfrom
  0.79    0.000214           0     20005           close
  0.62    0.000167           0     20001     10001 accept4
  0.25    0.000067           0     20002           setsockopt
  0.13    0.000035           0     10001           socket
  0.10    0.000028           0     10001           fcntl

After:
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 87.59    0.024269           0     50012         1 epoll_wait
  3.19    0.000884           0     20000           shutdown
  2.33    0.000646           0     29996      9996 sendto
  2.02    0.000560           0     10005     10003 connect
  1.40    0.000387           0     40013     10013 recvfrom
  1.35    0.000374           0     40000           epoll_ctl
  0.64    0.000178           0     20001     10001 accept4
  0.55    0.000152           0     20005           close
  0.45    0.000124           0     20002           setsockopt
  0.31    0.000086           0     10001           fcntl
  0.17    0.000047           0     10001           socket

Overall :
   -16.6% epoll_wait
   -20%   recvfrom
   -20%   epoll_ctl

On HTTP, the gain is even better :

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 80.43    0.015386           0     60006         1 epoll_wait
  4.61    0.000882           0     30000     10000 sendto
  3.74    0.000715           0     20001     10001 accept4
  3.35    0.000640           0     10000     10000 connect
  2.66    0.000508           0     20005           close
  1.34    0.000257           0     30002     10002 recvfrom
  1.27    0.000242           0     30005           epoll_ctl
  1.20    0.000230           0     10000           shutdown
  0.62    0.000119           0     20003           setsockopt
  0.40    0.000077           0     10001           socket
  0.39    0.000074           0     10001           fcntl
willy@wtap:haproxy$ head -15 apres.txt
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 83.47    0.020301           0     50008         1 epoll_wait
  4.26    0.001036           0     20005           close
  3.30    0.000803           0     30000     10000 sendto
  2.55    0.000621           0     20001     10001 accept4
  1.76    0.000428           0     10000     10000 connect
  1.20    0.000292           0     10000           shutdown
  1.14    0.000278           0     20001         1 recvfrom
  0.86    0.000210           0     20003           epoll_ctl
  0.71    0.000173           0     20003           setsockopt
  0.49    0.000120           0     10001           socket
  0.25    0.000060           0     10001           fcntl

Overall :
  -16.6% epoll_wait
  -33%   recvfrom
  -33%   epoll_ctl

11 years agoMEDIUM: backend: add support for the wt6 hash
Willy Tarreau [Thu, 14 Nov 2013 13:30:35 +0000 (14:30 +0100)] 
MEDIUM: backend: add support for the wt6 hash

This function was designed for haproxy while testing other functions
in the past. Initially it was not planned to be used given the not
very interesting numbers it showed on real URL data : it is not as
smooth as the other ones. But later tests showed that the other ones
are extremely sensible to the server count and the type of input data,
especially DJB2 which must not be used on numeric input. So in fact
this function is still a generally average performer and it can make
sense to merge it in the end, as it can provide an alternative to
sdbm+avalanche or djb2+avalanche for consistent hashing or when hashing
on numeric data such as a source IP address or a visitor identifier in
a URL parameter.

11 years agoMEDIUM: backend: Implement avalanche as a modifier of the hashing functions.
Bhaskar Maddala [Tue, 5 Nov 2013 16:54:02 +0000 (11:54 -0500)] 
MEDIUM: backend: Implement avalanche as a modifier of the hashing functions.

Summary:
Avalanche is supported not as a native hashing choice, but a modifier
on the hashing function. Note that this means that possible configs
written after 1.5-dev4 using "hash-type avalanche" will get an informative
error instead. But as discussed on the mailing list it seems nobody ever
used it anyway, so let's fix it before the final 1.5 release.

The default values were selected for backward compatibility with previous
releases, as discussed on the mailing list, which means that the consistent
hashing will still apply the avalanche hash by default when no explicit
algorithm is specified.

Examples
  (default) hash-type map-based
Map based hashing using sdbm without avalanche

  (default) hash-type consistent
Consistent hashing using sdbm with avalanche

Additional Examples:

  (a) hash-type map-based sdbm
Same as default for map-based above
  (b) hash-type map-based sdbm avalanche
Map based hashing using sdbm with avalanche
  (c) hash-type map-based djb2
Map based hashing using djb2 without avalanche
  (d) hash-type map-based djb2 avalanche
Map based hashing using djb2 with avalanche
  (e) hash-type consistent sdbm avalanche
Same as default for consistent above
  (f) hash-type consistent sdbm
Consistent hashing using sdbm without avalanche
  (g) hash-type consistent djb2
Consistent hashing using djb2 without avalanche
  (h) hash-type consistent djb2 avalanche
Consistent hashing using djb2 with avalanche

11 years agoMEDIUM: backend: Enhance hash-type directive with an algorithm options
Bhaskar [Wed, 30 Oct 2013 03:30:51 +0000 (23:30 -0400)] 
MEDIUM: backend: Enhance hash-type directive with an algorithm options

Summary:
In testing at tumblr, we found that using djb2 hashing instead of the
default sdbm hashing resulted is better workload distribution to our backends.

This commit implements a change, that allows the user to specify the hash
function they want to use. It does not limit itself to consistent hashing
scenarios.

The supported hash functions are sdbm (default), and djb2.

For a discussion of the feature and analysis, see mailing list thread
"Consistent hashing alternative to sdbm" :

      http://marc.info/?l=haproxy&m=138213693909219

Note: This change does NOT make changes to new features, for instance,
applying an avalance hashing always being performed before applying
consistent hashing.

11 years agoBUG/MINOR: acl: remove patterns from the tree before freeing them
Willy Tarreau [Thu, 14 Nov 2013 15:00:12 +0000 (16:00 +0100)] 
BUG/MINOR: acl: remove patterns from the tree before freeing them

A call to free_pattern_tree() upon exit() is made to free all ACL
patterns allocated in a tree (strings or IP addresses). Unfortunately
it happens that this function has been bogus from the beginning, it
walks over the whole tree, frees the nodes but forgets to remove them
from the tree prior to freeing them. So after visiting a leaf, the
next eb_next() call will require to revisit some of the upper nodes
that were just freed. This can remain unnoticed for a long time because
free() often just marks the area as free. But in cases of aggressive
memory freeing, the location will not be mapped anymore and the process
segfaults.

Note that the bug has no impact other than polluting kernel logs and
frightening sysadmins, since it happens just before exit().

Simply adding the debug code below makes it easier to reproduce the
same bug :

while (node) {
next = eb_next(node);
+ node->node_p = (void *)-1;
free(node);
node = next;
}

Many thanks to the StackExchange team for their very detailed bug report
that permitted to quickly understand this non-obvious bug!

This fix should be backported to 1.4 which introduced the bug.

11 years agoMINOR: buffer: align the last output line of buffer_dump()
Godbach [Thu, 14 Nov 2013 02:15:20 +0000 (10:15 +0800)] 
MINOR: buffer: align the last output line of buffer_dump()

If the dumped length of buffer is not multiple of 16, the last output line can
be seen as below:

Dumping contents from byte 0 to byte 125
         0  1  2  3  4  5  6  7    8  9  a  b  c  d  e  f
  0000: 47 45 54 20 2f 69 6e 64 - 65 78 2e 68 74 6d 20 48   GET /index.htm H
  0010: 54 54 50 2f 31 2e 30 0d - 0a 55 73 65 72 2d 41 67   TTP/1.0..User-Ag
  ...
  0060: 30 0d 0a 43 6f 6e 6e 65 - 63 74 69 6f 6e 3a 20 4b   0..Connection: K
  0070: 65 65 70 2d 41 6c 69 76 - 65 0d 0a 0d 0a   eep-Alive....

Yes, the hex column will be overlapped by the text column. Both the hex and
text column should be aligned at their own area as below:

Dumping contents from byte 0 to byte 125
         0  1  2  3  4  5  6  7    8  9  a  b  c  d  e  f
  0000: 47 45 54 20 2f 69 6e 64 - 65 78 2e 68 74 6d 20 48   GET /index.htm H
  0010: 54 54 50 2f 31 2e 30 0d - 0a 55 73 65 72 2d 41 67   TTP/1.0..User-Ag
  ...
  0060: 30 0d 0a 43 6f 6e 6e 65 - 63 74 69 6f 6e 3a 20 4b   0..Connection: K
  0070: 65 65 70 2d 41 6c 69 76 - 65 0d 0a 0d 0a            eep-Alive....

Signed-off-by: Godbach <nylzhaowei@gmail.com>
11 years agoMINOR: tcp: don't use tick_add_ifset() when timeout is known to be set
Willy Tarreau [Mon, 4 Nov 2013 14:56:53 +0000 (15:56 +0100)] 
MINOR: tcp: don't use tick_add_ifset() when timeout is known to be set

These two useless tests propably result from a copy-paste. The test is
performed in the condition to enter the block.

11 years agoMINOR: acl: add a warning when an ACL keyword is used without any value
Willy Tarreau [Mon, 4 Nov 2013 17:09:12 +0000 (18:09 +0100)] 
MINOR: acl: add a warning when an ACL keyword is used without any value

It's quite common to write directives like the following :

  tcp-request reject if WAIT_END { sc0_inc_gpc0 }

This one will never reject, because sc0_inc_gpc0 is provided no value
to compare against. The proper form should have been something like this :

  tcp-request reject if WAIT_END { sc0_inc_gpc0 gt 0 }

or :

  tcp-request reject if WAIT_END { sc0_inc_gpc0 -m found }

Now we detect the absence of any argument on the command line and emit
a warning suggesting alternatives or the use of "--" to really avoid
matching anything (might be used when debugging).

11 years agoBUG/MEDIUM: acl: do not evaluate next terms after a miss
Willy Tarreau [Wed, 30 Oct 2013 18:30:32 +0000 (19:30 +0100)] 
BUG/MEDIUM: acl: do not evaluate next terms after a miss

When a condition does something like :

   action if A B C || D E F

If B returns a miss (can't tell true or false), C must not
be evaluated. This is important when C has a side effect
(eg: sc*_inc_gpc0). However the second part after the ||
can still be evaluated.

11 years agoBUG/MEDIUM: tcp: do not skip tracking rules on second pass
Willy Tarreau [Wed, 30 Oct 2013 18:24:00 +0000 (19:24 +0100)] 
BUG/MEDIUM: tcp: do not skip tracking rules on second pass

The track-sc* tcp rules are bogus. The test to verify if the
tracked counter was already assigned is performed in the same
condition as the test for the action. The effect is that a
rule which tracks a counter that is already being tracked
is implicitly converted to an accept because the default
rule is an accept.

This bug only affects 1.5-dev releases.

11 years agoBUG/MINOR: peers: set the accept date in outgoing connections
Willy Tarreau [Tue, 1 Oct 2013 15:06:10 +0000 (17:06 +0200)] 
BUG/MINOR: peers: set the accept date in outgoing connections

Without this, "show sess" on the CLI reports a wrong age.

11 years agoBUG/MEDIUM: session: risk of crash on out of memory conditions
Willy Tarreau [Sun, 20 Oct 2013 21:10:28 +0000 (23:10 +0200)] 
BUG/MEDIUM: session: risk of crash on out of memory conditions

In session_accept(), if we face a memory allocation error, we try to
emit an HTTP 500 error message in HTTP mode. The problem is that we
must not use http_error_message() for this since it dereferences the
session which can be NULL in this case.

We don't need the session to build the error message anyway since
this function only uses it to retrieve the backend and frontend to
get the most suited error message. Let's pick it ourselves, we're
at the beginning of the session, only the frontend is relevant.

This bug is 1.5-specific.

11 years agoBUILD/MINOR: missing header file
Thierry FOURNIER [Wed, 16 Oct 2013 14:19:38 +0000 (16:19 +0200)] 
BUILD/MINOR: missing header file

In the header file "types/proto_http.h", the list are used
but the header file "mini-clist.h" is not included.

11 years agoMINOR: http: change url_decode to return the size of the decoded string.
Thierry FOURNIER [Fri, 4 Oct 2013 14:27:27 +0000 (16:27 +0200)] 
MINOR: http: change url_decode to return the size of the decoded string.

Currently url_decode returns 1 or 0 depending on whether it could decode
the string or not. For some future use cases, it will be needed to get the
decoded string length after a successful decoding, so let's make it return
that value, and fall back to a negative one in case of error.

11 years agoMINOR: http: some exported functions were not in the header file
Thierry FOURNIER [Tue, 15 Oct 2013 09:43:19 +0000 (11:43 +0200)] 
MINOR: http: some exported functions were not in the header file

Export the following functions:
 - find_hdr_value_end
 - http_header_match2
 - http_remove_header2
 - http_header_add_tail2

11 years agoCLEANUP: The function "regex_exec" needs the string length but in many case they...
Thierry FOURNIER [Tue, 15 Oct 2013 11:41:44 +0000 (13:41 +0200)] 
CLEANUP: The function "regex_exec" needs the string length but in many case they expect null terminated char.

If haproxy is compiled with the USE_PCRE_JIT option, the length of the
string is used. If it is compiled without this option the function doesn't
use the length and expects a null terminated string.

The prototype of the function is ambiguous, and depends on the
compilation option. The developer can think that the length is always
used, and many bugs can be created.

This patch makes sure that the length is used. The regex_exec function
adds the final '\0' if it is needed.

11 years agoMINOR: Makefile: provide cscope rule
William Lallemand [Fri, 18 Oct 2013 14:26:39 +0000 (16:26 +0200)] 
MINOR: Makefile: provide cscope rule

"make cscope" builds tags for cscope.

11 years agoBUG/MINOR: acl: implicit arguments of ACL keywords were not properly resolved
Willy Tarreau [Tue, 22 Oct 2013 17:10:06 +0000 (19:10 +0200)] 
BUG/MINOR: acl: implicit arguments of ACL keywords were not properly resolved

William Lallemand reported a bug which happens when an ACL keyword using an
implicit argument (eg: a proxy name) is used : the keyword is not properly
set in the arglist field, resulting in an error about the previous keyword
being returned, or "(null)" if the faulty ACL appears first.

The bug only affects error reporting and is 1.5-specific, so no backport is
nedeed.

11 years agoBUG/MEDIUM: http: accept full buffers on smp_prefetch_http
Willy Tarreau [Mon, 14 Oct 2013 20:41:30 +0000 (22:41 +0200)] 
BUG/MEDIUM: http: accept full buffers on smp_prefetch_http

Bertrand Jacquin reported a but when using tcp_request content rules
on large POST HTTP requests. The issue is that smp_prefetch_http()
first tries to validate an input buffer, but only if the buffer is
not full. This test is wrong since it must only be performed after
the parsing has failed, otherwise we don't accept POST requests which
fill the buffer as valid HTTP requests.

This bug is 1.5-specific, no backport needed.

11 years agoCLEANUP: regex: Create regex_comp function that compiles regex using compilation...
Thierry FOURNIER [Mon, 14 Oct 2013 12:07:36 +0000 (14:07 +0200)] 
CLEANUP: regex: Create regex_comp function that compiles regex using compilation options

The current file "regex.h" define an abstraction for the regex. It
provides the same struct name and the same "regexec" function for the
3 regex types supported: standard libc, basic pcre and jit pcre.

The regex compilation function is not provided by this file. If the
developper wants to use regex, he must write regex compilation code
containing "#define *JIT*".

This patch provides a unique regex compilation function according to
the compilation options.

In addition, the "regex.h" file checks the presence of the "#define
PCRE_CONFIG_JIT" when "USE_PCRE_JIT" is enabled. If this flag is not
present, the pcre lib doesn't support JIT and "#error" is emitted.

11 years agoCLEANUP: stream_interface: cleanup loop information in si_conn_send_loop()
Godbach [Fri, 11 Oct 2013 07:48:29 +0000 (15:48 +0800)] 
CLEANUP: stream_interface: cleanup loop information in si_conn_send_loop()

Though si_conn_send_loop() does not loop over ->snd_buf() after commit ed7f836,
there is still some codes left which use `while` but only execute once. This
commit does the cleanup job and rename si_conn_send_loop() to si_conn_send().

Signed-off-by: Godbach <nylzhaowei@gmail.com>
11 years agoDOC: missing http-send-name-header keyword in keyword table
Baptiste Assmann [Wed, 9 Oct 2013 19:57:02 +0000 (21:57 +0200)] 
DOC: missing http-send-name-header keyword in keyword table

This one was in the doc but not in the keyword matrix.

11 years agoDOC: missing information for the "description" keyword
Baptiste Assmann [Wed, 9 Oct 2013 04:51:49 +0000 (06:51 +0200)] 
DOC: missing information for the "description" keyword

This keyword was not documented.

11 years agoBUILD/MINOR: missing header file
Thierry FOURNIER [Wed, 9 Oct 2013 13:23:01 +0000 (15:23 +0200)] 
BUILD/MINOR: missing header file

In the header file "common/regex.h", the C keyword NULL is used. This
keyword is referenced into the header file "stdlib.h", but this is not
included.

11 years agoBUG/MINOR: ssl: verifyhost does not match empty strings on wildcard.
Emeric Brun [Tue, 8 Oct 2013 09:39:35 +0000 (11:39 +0200)] 
BUG/MINOR: ssl: verifyhost does not match empty strings on wildcard.

RFC6125 does not specify if wildcard matches empty strings but
classical browsers implementations does.
After the fix foo*bar.exemple.om matches foobar.exemple.com.

11 years agoMINOR: ssl: optimization of verifyhost on wildcard certificates.
Emeric Brun [Tue, 8 Oct 2013 09:27:28 +0000 (11:27 +0200)] 
MINOR: ssl: optimization of verifyhost on wildcard certificates.

Optimizes verifyhost on wildcard certificates avoiding travel several times
the same string.

11 years agoBUG/MINOR: ssl: potential memory leaks using ssl_c_key_alg or ssl_c_sig_alg.
Emeric Brun [Mon, 7 Oct 2013 12:31:44 +0000 (14:31 +0200)] 
BUG/MINOR: ssl: potential memory leaks using ssl_c_key_alg or ssl_c_sig_alg.

The leak occurs in an error case which practically never happens.

11 years agoBUG/MINOR: deinit: free server map which is allocated in init_server_map()
Godbach [Wed, 2 Oct 2013 09:10:11 +0000 (17:10 +0800)] 
BUG/MINOR: deinit: free server map which is allocated in init_server_map()

Both static-rr and hash with type map-based call init_server_map() to allocate
server map, so the server map should be freed while doing cleanup if one of
the above load balance algorithms is used.

Signed-off-by: Godbach <nylzhaowei@gmail.com>
[wt: removed the unneeded "if" before the free]

11 years agoDOC: fix typo in comments
Godbach [Mon, 30 Sep 2013 03:23:10 +0000 (11:23 +0800)] 
DOC: fix typo in comments

Hi Willy,

There is a patch to fix typo in comments, please check the attachment
for you information.

The commit log is as below:

commit 9824d1b3740ac2746894f1aa611c795366c84210
Author: Godbach <nylzhaowei@gmail.com>
Date:   Mon Sep 30 11:05:42 2013 +0800

    DOC: fix typo in comments

      0x20000000 -> 0x40000000
      vuf -> buf
      ethod -> Method

Signed-off-by: Godbach <nylzhaowei@gmail.com>
--
Best Regards,
Godbach

From 9824d1b3740ac2746894f1aa611c795366c84210 Mon Sep 17 00:00:00 2001
From: Godbach <nylzhaowei@gmail.com>
Date: Mon, 30 Sep 2013 11:05:42 +0800
Subject: [PATCH] DOC: fix typo in comments

  0x20000000 -> 0x40000000
  vuf -> buf
  ethod -> Method

Signed-off-by: Godbach <nylzhaowei@gmail.com>
11 years agoDOC: ssl: update build instructions to use new SSL_* variables
Lukas Tribus [Mon, 30 Sep 2013 22:28:03 +0000 (00:28 +0200)] 
DOC: ssl: update build instructions to use new SSL_* variables

Since commit 9a05945bd ("BUILD: add SSL_INC/SSL_LIB variables to force the
path to openssl") we have SSL_INC and SSL_LIB to point to the libssl
installation.

This commits updates the build instructions in README accordingly.

11 years agoDOC: remove -s and -l options from the manpage
Apollon Oikonomopoulos [Sun, 29 Sep 2013 20:04:27 +0000 (23:04 +0300)] 
DOC: remove -s and -l options from the manpage

These options are no longer supported since 1.3, so remove them from the
manpage.

Signed-off-by: Apollon Oikonomopoulos <apoikos@gmail.com>
11 years agoDOC: update manpage reference to haproxy-en.txt
Apollon Oikonomopoulos [Sun, 29 Sep 2013 20:04:13 +0000 (23:04 +0300)] 
DOC: update manpage reference to haproxy-en.txt

The manpage refers to haproxy-en.txt, which is obsolete. Update the reference
to point to configuration.txt, together with the location on Debian systems.

Also capitalize "Debian".

Signed-off-by: Apollon Oikonomopoulos <apoikos@gmail.com>
11 years agoDOC: add manpage references to all system calls
Apollon Oikonomopoulos [Sun, 29 Sep 2013 20:03:51 +0000 (23:03 +0300)] 
DOC: add manpage references to all system calls

Add a man section to every system call reference, giving users pointers to the
respective manpages.

Signed-off-by: Apollon Oikonomopoulos <apoikos@gmail.com>
11 years agoDOC: add missing options to the manpage
Apollon Oikonomopoulos [Sun, 29 Sep 2013 20:03:37 +0000 (23:03 +0300)] 
DOC: add missing options to the manpage

Document -L, -v(v), -C, -dS and -dM, as they were missing from the manpage.

Signed-off-by: Apollon Oikonomopoulos <apoikos@gmail.com>
11 years agoBUG/MINOR: acl: fix improper string size assignment in proxy argument
Willy Tarreau [Sun, 29 Sep 2013 09:36:53 +0000 (11:36 +0200)] 
BUG/MINOR: acl: fix improper string size assignment in proxy argument

This minor bug was found using the coccinelle script "da.cocci". The
len was initialized twice instead of setting the size. It's harmless
since no operations are performed on this empty string but needs to
be fixed anyway.

11 years agoMINOR: http: compute response time before processing headers
Willy Tarreau [Mon, 23 Sep 2013 14:44:27 +0000 (16:44 +0200)] 
MINOR: http: compute response time before processing headers

At the moment, HTTP response time is computed after response headers are
processed. This can misleadingly assign to the server some heavy local
processing (eg: regex), and also prevents response headers from passing
information related to the response time (which can sometimes be useful
for stats).

Let's retrieve the reponse time before processing the headers instead.

Note that in order to remain compatible with what was previously done,
we disable the response time when we get a 502 or any bad response. This
should probably be changed in 1.6 since it does not make sense anymore
to lose this information.

11 years agoBUG/MINOR: fix forcing fastinter in "on-error"
Sergiy Prykhodko [Sat, 21 Sep 2013 09:05:00 +0000 (12:05 +0300)] 
BUG/MINOR: fix forcing fastinter in "on-error"

health_adjust() should requeue the task after changing its expire timer.

I noticed it on devel servers without load. We have long inter (10 seconds)
and short fasinter (100ms). But according to webserver logs, after a failed
request next check request was called with same 10s interval.

This patch should probably be backported to 1.4 which has the same feature.

11 years agoBUILD: ssl: compilation issue with openssl v0.9.6.
Emeric Brun [Tue, 17 Sep 2013 13:47:48 +0000 (15:47 +0200)] 
BUILD: ssl: compilation issue with openssl v0.9.6.

Failed to compile with openssl 0.9.6 since the 'verifyhost' feature.