Willy Tarreau [Fri, 31 Aug 2007 15:01:18 +0000 (17:01 +0200)]
[MAJOR] spec I/O: fix allocations of spec entries for an FD
Under some circumstances, it was possible with speculative I/O to
reallocate multiple entries for the same FD if an fd_{set,clr,set}
or fd_{clr,set,clr} sequences were performed before a schedule.
Fix this by keeping a an allocation flag for each fd.
Willy Tarreau [Wed, 25 Jul 2007 12:43:32 +0000 (14:43 +0200)]
[MEDIUM] stats page: added links for 'refresh' and 'hide down'
The stats page now supports an option to hide servers which are DOWN
and to enable/disable automatic refresh. It is also possible to ask
for an immediate refresh.
Willy Tarreau [Wed, 25 Jul 2007 12:38:45 +0000 (14:38 +0200)]
[MEDIUM] ensure we never overflow in chunk_printf()
The result of the vsnprintf() called in chunk_printf() must be checked,
and should be added only if lower than the requested size. We simply
return zero if we cannot write the chunk.
Willy Tarreau [Wed, 25 Jul 2007 05:37:40 +0000 (07:37 +0200)]
[TESTS] provide a test configuration file for stats and checks
A file with 1000 servers and a stats interface has been added.
Willy Tarreau [Wed, 25 Jul 2007 05:26:38 +0000 (07:26 +0200)]
[MINOR] add support for "stats refresh <interval>"
Sometimes it may be desirable to automatically refresh the
stats page. Most browsers support the "Refresh:" header with
an interval in seconds. Specifying "stats refresh xxx" will
automatically add this header.
Willy Tarreau [Tue, 24 Jul 2007 21:43:37 +0000 (23:43 +0200)]
[DOC] the "stats" keyword is not allowed in a pure frontend.
Willy Tarreau [Sun, 15 Jul 2007 18:15:28 +0000 (20:15 +0200)]
[DOC] started a new configuration manual
This new configuration manual intends to document every known keyword
of the configuration language. Right now, it enumerates them all and
describes how to use ACLs.
Willy Tarreau [Tue, 24 Jul 2007 22:28:06 +0000 (00:28 +0200)]
[MINOR] fix backend's weight in the stats page.
The GCD used when computing the servers' weights causes the total
weight of the backend to appear lower than expected because it is
divided by the GCD. Easy solution consists in recomputing the GCD
from the first server and apply it to the global weight.
Willy Tarreau [Tue, 24 Jul 2007 21:32:33 +0000 (23:32 +0200)]
[MEDIUM] improve behaviour with large number of servers per proxy
When a very large number of servers is configured (thousands),
shutting down many of them at once could lead to large number
of calls to recalc_server_map() which already takes some time.
This would result in an O(N^3) computation time, leading to
noticeable pauses on slow embedded CPUs on test platforms.
Instead, mark the map as dirty and recalc it only when needed.
Willy Tarreau [Wed, 11 Jul 2007 08:42:35 +0000 (10:42 +0200)]
[MEDIUM] fade out memory usage when stopping proxies
Now we try to free as many pools as possible when a proxy is stopping.
The reason is that we want to ease the process replacement when applying
a new configuration, without keeping too many unused memory allocated.
Willy Tarreau [Wed, 11 Jul 2007 07:19:31 +0000 (09:19 +0200)]
[MEDIUM] Added easier support for Doug Lea's malloc (dlmalloc)
It's now as easy as passing "DLMALLOC_SRC=<path_to_dlmalloc.c>" to
build with support for dlmalloc. The dlmalloc source is not provided
with haproxy in order to ensure that people will use either the most
recent, or the most suited version for their platform. The minimal
mmap size is specified in DLMALLOC_THRES, which defaults to 4096. It
should be increased on platforms with larger pages (eg: 8 kB on some
64 bit systems).
Willy Tarreau [Sun, 17 Jun 2007 21:41:40 +0000 (23:41 +0200)]
[RELEASE] Released version 1.3.12 with the following main changes :
- acl: smarter integer comparison support in ACLs
- acl: specify the direction during fetches
- acl: provide the argument length for fetch functions
- acl: provide a reference to the expr to fetch()
- acl: implement matching on header values
- acl: support maching on 'path' component
- acl: permit to return any header when no name specified
- errorfile: use a local file to feed error messages
- negation in ACL conds was not cleared between terms
- fix segfault at exit when using captures
- improve memory freeing upon exit
- acl: support '-i' to ignore case when matching
- str2net() must not change the const char *
- provide default ACLs
- acl: distinguish between request and response headers
- added the 'use_backend' keyword for full content-switching
- acl: added the TRUE and FALSE ACLs.
- shut warnings 'is*' macros from ctype.h on solaris
Willy Tarreau [Sun, 17 Jun 2007 19:51:38 +0000 (21:51 +0200)]
[CLEANUP] shut warnings 'is*' macros from ctype.h on solaris
Solaris visibly uses an array for is*, which returns warnings
about the use of signed chars as indexes. Good opportunity to
put casts everywhere.
Willy Tarreau [Sun, 17 Jun 2007 18:40:25 +0000 (20:40 +0200)]
[MEDIUM] acl: added the TRUE and FALSE ACLs.
Those ACLs are sometimes useful for troubleshooting. Two ACL subjects
"always_true" and "always_false" have been added too. They return what
their subject says for every pattern. Also, acl_match_pst() has been
removed.
Willy Tarreau [Sun, 17 Jun 2007 17:56:27 +0000 (19:56 +0200)]
[MAJOR] added the 'use_backend' keyword for full content-switching
The new "use_backend" keyword permits full content switching by the
use of ACLs. Its usage is simple :
use_backend <backend_name> {if|unless} <acl_cond>
Willy Tarreau [Sun, 17 Jun 2007 14:58:38 +0000 (16:58 +0200)]
[MEDIUM] acl: distinguish between request and response headers
hdr(x) will now still be used for request headers, and shdr(x) for
server headers (response).
Willy Tarreau [Sun, 17 Jun 2007 09:54:31 +0000 (11:54 +0200)]
[MEDIUM] provide default ACLs
The following ACLs are predefined :
LOCALHOST = src 127.0.0.1/8
HTTP_1.0 = req_ver 1.0
HTTP_1.1 = req_ver 1.1
METH_CONNECT = method CONNECT
METH_GET = method GET HEAD
METH_HEAD = method HEAD
METH_OPTIONS = method OPTIONS
METH_POST = method POST
METH_TRACE = method TRACE
HTTP_URL_ABS = url_reg ^[^/:]*://
HTTP_URL_SLASH = url_beg /
HTTP_URL_STAR = url *
HTTP_CONTENT = hdr_val(content-length) gt 0
Willy Tarreau [Sun, 17 Jun 2007 09:42:08 +0000 (11:42 +0200)]
[BUG] str2net() must not change the const char *
str2net needs to put \0 in a const char *. Use strdup() for that.
Willy Tarreau [Sun, 17 Jun 2007 06:20:33 +0000 (08:20 +0200)]
[MEDIUM] acl: support '-i' to ignore case when matching
Implemented the "-i" option on ACLs to state that the matching
will have to be performed for all patterns ignoring case. The
usage is :
acl <aclname> <aclsubject> -i pattern1 ...
If a pattern must begin with "-", either it must not be the first one,
or the "--" option should be specified first.
Willy Tarreau [Sat, 16 Jun 2007 22:36:03 +0000 (00:36 +0200)]
[MINOR] improve memory freeing upon exit
The deinit() function is specialized in memory area freeing.
There were a ton of information that were not released at the
exit time, which made valgrind complain. Now, most of the entries
are freed. However, it seems like regfree() does not completely
free a regex (12 bytes lost per regex).
Willy Tarreau [Sat, 16 Jun 2007 21:19:53 +0000 (23:19 +0200)]
[BUG] fix segfault at exit when using captures
since pools v2, the way pools were destroyed at exit is incorrect
because it ought to account for users of those pools before freeing
them. This test also ensures there is no double free.
Willy Tarreau [Sat, 16 Jun 2007 17:35:18 +0000 (19:35 +0200)]
[BUG] negation in ACL conds was not cleared between terms
The exclamation mark (!) in front of an ACL condition was propagated
to the whole line instead of being flushed after parsing an acl name.
Willy Tarreau [Sun, 10 Jun 2007 22:29:26 +0000 (00:29 +0200)]
[MEDIUM] errorfile: use a local file to feed error messages
It is now possible to read error messages from local files,
using the 'errorfile' keyword. Those files are read during
parsing, so there's no I/O involved. They make it possible
to return custom error messages with custom status and headers.
Willy Tarreau [Sun, 10 Jun 2007 19:42:55 +0000 (21:42 +0200)]
[MINOR] acl: permit to return any header when no name specified
Having the ability to match on hdr_xxx in addition to hdr_xxx(yyy)
makes it possible to match any value or to count the headers easily.
Willy Tarreau [Sun, 10 Jun 2007 19:28:46 +0000 (21:28 +0200)]
[MEDIUM] acl: support maching on 'path' component
'path', 'path_reg', 'path_beg', 'path_end', 'path_sub', 'path_dir'
and 'path_dom' have been implemented to process the path component
of the URI. It starts after the host part, and stops before the
question mark.
Willy Tarreau [Sun, 10 Jun 2007 17:45:56 +0000 (19:45 +0200)]
[MEDIUM] acl: implement matching on header values
hdr(x), hdr_reg(x), hdr_beg(x), hdr_end(x), hdr_sub(x), hdr_dir(x),
hdr_dom(x), hdr_cnt(x) and hdr_val(x) have been implemented. They
apply to any of the possibly multiple values of header <x>.
Right now, hdr_val() is limited to integer matching, but it should
reasonably be upgraded to match long long ints.
Willy Tarreau [Sun, 10 Jun 2007 09:47:14 +0000 (11:47 +0200)]
[MINOR] acl: provide a reference to the expr to fetch()
The fetch() functions may need to access the full expr to get
their args. Turn the void *arg into a struct acl_expr *expr.
Willy Tarreau [Sun, 10 Jun 2007 09:17:01 +0000 (11:17 +0200)]
[MINOR] acl: provide the argument length for fetch functions
Some fetch() functions will require an argument (eg: header).
It's wise to provide the argument size to optimize string
comparisons.
Willy Tarreau [Sun, 10 Jun 2007 08:06:18 +0000 (10:06 +0200)]
[MINOR] acl: specify the direction during fetches
Some fetches such as 'line' or 'hdr' need to know the direction of
the test (request or response). A new 'dir' parameter is now
propagated from the caller to achieve this.
Willy Tarreau [Sat, 9 Jun 2007 21:10:04 +0000 (23:10 +0200)]
[MEDIUM] smarter integer comparison support in ACLs
ACLs now support operators such as 'eq', 'le', 'lt', 'ge' and 'gt'
in order to give more flexibility to the language. Because of this
change, the 'dst_limit' keyword changed to 'dst_conn' and now requires
either a range or a test such as 'dst_conn lt 1000' which is more
understandable.
Willy Tarreau [Sun, 3 Jun 2007 15:27:07 +0000 (17:27 +0200)]
[RELEASE] Released version 1.3.11.4 with the following main changes :
- do not re-arm read timeout in SHUTR state
- optimize I/O by detecting system starvation
- the epoll FD must not be shared between processes
- limit the number of events returned by *poll*
Willy Tarreau [Sun, 3 Jun 2007 15:16:49 +0000 (17:16 +0200)]
[MEDIUM] limit the number of events returned by *poll*
By default, epoll/kqueue used to return as many events as possible.
This could sometimes cause huge latencies (latencies of up to 400 ms
have been observed with many thousands of fds at once). Limiting the
number of events returned also reduces the latency by avoiding too
many blind processing. The value is set to 200 by default and can be
changed in the global section using the tune.maxpollevents parameter.
Willy Tarreau [Sun, 3 Jun 2007 14:40:44 +0000 (16:40 +0200)]
[BUG] the epoll FD must not be shared between processes
Recreate the epoll file descriptor after a fork(). It will ensure
that all processes will not share their epoll_fd. Some side effects
were encountered because of this, such as epoll_wait() returning an
FD which was previously deleted, in multi-process mode.
Willy Tarreau [Sun, 3 Jun 2007 12:10:36 +0000 (14:10 +0200)]
[MEDIUM] optimize I/O by detecting system starvation
Compare the results of recv/send with the parameter passed and
detect whether the system has no free buffer space for send()
or has no data anymore for recv(). This dramatically reduces
the number of syscalls (by about 23%).
Willy Tarreau [Sun, 3 Jun 2007 13:59:52 +0000 (15:59 +0200)]
[BUG] do not re-arm read timeout after writing data
A second occurrence of read-timeout rearming was present in stream_sock.c.
To fix the problem, it was necessary to put the shutdown information in
the buffer (already planned).
Willy Tarreau [Sun, 3 Jun 2007 13:25:37 +0000 (15:25 +0200)]
[BUG] do not re-arm read timeout in SHUTR state !
There is a long-time bug causing busy loops when either client-side
or server-side enters a SHUTR state. When writing data to the FD,
it was possible to re-arm the read side if the write had been paused.
Willy Tarreau [Mon, 14 May 2007 12:40:25 +0000 (14:40 +0200)]
[RELEASE] Released version 1.3.11.3 with the following main changes :
- pre-initialize timeouts with tv_eternity during parsing
Willy Tarreau [Mon, 14 May 2007 12:37:50 +0000 (14:37 +0200)]
[BUG] pre-initialize timeouts with tv_eternity during parsing
ETERNITY is not 0 anymore, so all timeouts will not be initialized
to ETERNITY by a simple calloc(). We have to explictly assign them.
This bug caused random session aborts.
Willy Tarreau [Mon, 14 May 2007 01:42:47 +0000 (03:42 +0200)]
[RELEASE] Released version 1.3.11.2 with the following main changes :
- fixed broken health-checks since switch to timeval
Willy Tarreau [Mon, 14 May 2007 01:40:11 +0000 (03:40 +0200)]
[BUG] fix broken health-checks since switch to timeval
Health-checks were broken because of a return which was unexpectedly removed.
Willy Tarreau [Mon, 14 May 2007 01:18:43 +0000 (03:18 +0200)]
[RELEASE] Released version 1.3.11.1 with the following main changes :
- fixed ev_kqueue which was forgotten during the switch to timeval
- allowed null timeouts for past events in select
Willy Tarreau [Mon, 14 May 2007 01:16:06 +0000 (03:16 +0200)]
[MINOR] allow null timeouts for past events in select
Willy Tarreau [Mon, 14 May 2007 01:15:46 +0000 (03:15 +0200)]
[BUG] ev_kqueue was forgotten during the switch to timeval
Willy Tarreau [Mon, 14 May 2007 00:42:33 +0000 (02:42 +0200)]
[RELEASE] Released version 1.3.11 with the following main changes :
- fixed ev_sepoll again by rewriting the state machine
- switched all timeouts to timevals instead of milliseconds
- improved memory management using mempools v2.
- several minor optimizations
Willy Tarreau [Mon, 14 May 2007 00:11:56 +0000 (02:11 +0200)]
Merge branch 'pools' into merge-pools
Willy Tarreau [Mon, 14 May 2007 00:11:39 +0000 (02:11 +0200)]
[MINOR] disable useless hint in wake_expired_tasks
wake_expired_tasks() used a hint to avoid scanning the tree in most cases,
but it looks like the hint is more expensive than reaching the first node
in the tree. Disable it for now.
Willy Tarreau [Mon, 14 May 2007 00:03:47 +0000 (02:03 +0200)]
[BUG] fix buggy timeout computation in wake_expired_tasks
Wake_expired_tasks is supposed to return a date, not an interval. It
was causing busy loops in pollers.
Willy Tarreau [Mon, 14 May 2007 00:02:04 +0000 (02:02 +0200)]
[BUG] fix null timeouts in *poll-based pollers
Introduction of timeval timers broke *poll-based pollers, because the call to
tv_ms_remain may return 0 while the event is not elapsed yet. Now we carefully
check for those cases and round the result up by 1 ms.
Willy Tarreau [Sun, 13 May 2007 22:39:29 +0000 (00:39 +0200)]
[MAJOR] call garbage collector when doing soft stop
When we're interrupted by another instance, it is very likely
that the other one will need some memory. Now we know how to
free what is not used, so let's do it.
Also only free non-null pointers. Previously, pool_destroy()
did implicitly check for this case which was incidentely
needed.
Willy Tarreau [Sun, 13 May 2007 22:16:13 +0000 (00:16 +0200)]
[MEDIUM] enhance behaviour of mempools v2
- keep the number of users of each pool
- call the garbage collector on out of memory conditions
- sort the pools by size for faster creation
- force the alignment size to 16 bytes instead of 4*sizeof(void *)
Willy Tarreau [Sun, 13 May 2007 20:57:02 +0000 (22:57 +0200)]
[MAJOR] convert the header indexes to use mempool v2
Willy Tarreau [Sun, 13 May 2007 20:46:04 +0000 (22:46 +0200)]
[MAJOR] last bunch of capture changes for mempool v2
The header captures had lots of pools. They have all been transformed.
Willy Tarreau [Sun, 13 May 2007 19:45:51 +0000 (21:45 +0200)]
[MAJOR] ported the captures to use the new mempool v2
The "capture.c" file has also been removed since it was empty.
Willy Tarreau [Sun, 13 May 2007 19:36:56 +0000 (21:36 +0200)]
[MAJOR] ported requri to use mempools v2
Willy Tarreau [Sun, 13 May 2007 19:29:55 +0000 (21:29 +0200)]
[MAJOR] ported appsession to use mempools v2
Also during this process, a bug was found in appsession_refresh().
It would not automatically requeue the task in the queue, so the
old sessions would not vanish.
Willy Tarreau [Sun, 13 May 2007 18:19:55 +0000 (20:19 +0200)]
[MAJOR] ported pendconn to mempools v2
A pool_destroy() was also missing in deinit()
Willy Tarreau [Sun, 13 May 2007 17:56:02 +0000 (19:56 +0200)]
[MAJOR] switched buffers to mempools v2
Willy Tarreau [Sun, 13 May 2007 17:43:47 +0000 (19:43 +0200)]
[MAJOR] migrated task, tree64 and session to pool2
task and tree64 are already very close in size and are merged together.
Overall performance gained slightly by this simple change.
Willy Tarreau [Sun, 13 May 2007 17:38:49 +0000 (19:38 +0200)]
[MEDIUM] add new memory management functions
Implement pool_destroy2, pool_flush2, pool_gc2. It is safe to call
pool_gc2 to free whatever memory possible.
Willy Tarreau [Sun, 13 May 2007 16:26:08 +0000 (18:26 +0200)]
[MEDIUM] implement memory pools version 2
The new pools know about their size and usage. Malloc is not used
anymore, instead a dedicated function to refill the entries is used.
Willy Tarreau [Sun, 13 May 2007 14:10:04 +0000 (16:10 +0200)]
Merge branch 'timers' into merge-timers
Willy Tarreau [Sun, 13 May 2007 14:08:19 +0000 (16:08 +0200)]
[MINOR] use non-inline tv_* functions in many locations
The __tv_* functions were abused. They are not that small and it is not
always worth using them.
Willy Tarreau [Sun, 13 May 2007 14:07:06 +0000 (16:07 +0200)]
[MINOR] avoid inlining in task.c
The task management functions used to call __tv_* which is not really
optimal given the size of the functions.
Willy Tarreau [Sun, 13 May 2007 14:03:27 +0000 (16:03 +0200)]
[MINOR] add new tv_* functions
The most useful, tv_add_ifset only adds the increment if it is set. It
is designed for use in expiration computation.
Willy Tarreau [Sun, 13 May 2007 12:51:41 +0000 (14:51 +0200)]
Merge branch 'master' into timers
Willy Tarreau [Sun, 13 May 2007 09:40:04 +0000 (11:40 +0200)]
[TESTS] updates to hash experimentations
Aleksandar Lazic has collected many hashing algorithms and put them
in one file to ease benchmarking. Some algos look promising, some
of them have been checked further with uri_hash. Some results on
various systems/hardware are stored in hash_results.txt.
Willy Tarreau [Sat, 12 May 2007 23:52:05 +0000 (01:52 +0200)]
[BUG] fix ev_sepoll again, this time with a new state machine
It was possible in ev_sepoll() to ignore certain events if
all speculative events had been processed at once, because
the epoll_wait() timeout was not cleared, thus delaying the
events delivery.
The state machine was complicated, it has been rewritten.
It seems faster and more correct right now.
Willy Tarreau [Sat, 12 May 2007 20:35:00 +0000 (22:35 +0200)]
[MAJOR] replaced all timeouts with struct timeval
The timeout functions were difficult to manipulate because they were
rounding results to the millisecond. Thus, it was difficult to compare
and to check what expired and what did not. Also, the comparison
functions were heavy with multiplies and divides by 1000. Now, all
timeouts are stored in timevals, reducing the number of operations
for updates and leading to cleaner and more efficient code.
Willy Tarreau [Sat, 12 May 2007 20:29:44 +0000 (22:29 +0200)]
[MINOR] time.h: added a few tv_* functions to manipulate timevals
A few more tv_* functions will be needed to switch from a millisecond-based
scheduler to a struct timeval-based one.
Willy Tarreau [Sat, 12 May 2007 14:14:55 +0000 (16:14 +0200)]
[TESTS] test_pools: added support for dlmalloc()
Willy Tarreau [Sat, 12 May 2007 13:51:02 +0000 (15:51 +0200)]
[TESTS] added test_pools from Aleksandar Lazic
This simple test performs memory allocations using pools and
mallocs and returns the average number of allocations per second.
Willy Tarreau [Thu, 10 May 2007 05:51:17 +0000 (07:51 +0200)]
[RELEASE] Released version 1.3.10.2 with the following main changes :
- fixed build of files including standard.h on OpenBSD
Willy Tarreau [Thu, 10 May 2007 04:39:03 +0000 (06:39 +0200)]
[BUILD] fixed build of files including standard.h on OpenBSD
The file standard.h included netinet/in.h without including
sys/types.h. This broke build on OpenBSD.
Willy Tarreau [Wed, 9 May 2007 20:58:28 +0000 (22:58 +0200)]
[RELEASE] Released version 1.3.10.1 with the following main changes :
- fixed sepoll transition matrix (two states were missing)
Willy Tarreau [Wed, 9 May 2007 19:57:51 +0000 (21:57 +0200)]
[BUG] two missing states in sepoll transition matrix
Two states were missing in the speculative epoll state transition
matrix. This could cause some timeouts and unhandled events. The
problem showed up in TCP mode with a fast server at high session
rates, but could in theory also affect HTTP mode.
Willy Tarreau [Tue, 8 May 2007 23:44:58 +0000 (01:44 +0200)]
[RELEASE] Released version 1.3.10 with the following main changes :
- several fixes in ev_sepoll
- fixed some expiration dates on some tasks
- fixed a bug in connection establishment detection due to speculative I/O
- fixed rare bug occuring on TCP with early close (reported by Andy Smith)
- implemented URI hashing algorithm (Guillaume Dallaire)
- implemented SMTP health checks (Peter van Dijk)
- replaced the rbtree with ul2tree from old scheduler project
- new framework for generic ACL support
- added the 'acl' and 'block' keywords to the config language
- added several ACL criteria and matches (IP, port, URI, ...)
- cleaned up and better modularization for some time functions
- fixed list macros
- fixed useless memory allocation in str2net()
- store the original destination address in the session
Willy Tarreau [Tue, 8 May 2007 23:31:45 +0000 (01:31 +0200)]
[DOC] add some documentation about ACLs
Minimal documentation about ACLs
Willy Tarreau [Tue, 8 May 2007 22:54:10 +0000 (00:54 +0200)]
[MAJOR] fixed some expiration dates on tasks
The time subsystem really needs fixing. It was still possible
that some tasks with expiration date below the millisecond in
the future caused busy loop around poll() waiting for the
timeout to happen.
Willy Tarreau [Tue, 8 May 2007 21:50:35 +0000 (23:50 +0200)]
[MEDIUM] implement SMTP health checks
Peter van Dijk contributed this patch which implements the "smtpchk"
option, which is to SMTP what "httpchk" is to HTTP. By default, it sends
"HELO localhost" to the servers, and waits for the 250 message, but it
can also send a specific request.
Willy Tarreau [Tue, 8 May 2007 20:45:09 +0000 (22:45 +0200)]
[MINOR] ACL regex matching on the URI ; uri_reg
The URI can be matched on regexen now. The upcase/lowcase flag
can not be set yet and will soon have to.
Willy Tarreau [Tue, 8 May 2007 17:56:15 +0000 (19:56 +0200)]
[MINOR] implement the ACL keywords 'dst' and 'dport'
The file client.c now provides acl_fetch_dip and acl_fetch_dport
to be able to check the client's destination address and port. The
corresponding ACL keywords 'dst' and 'dport' have been added.
Willy Tarreau [Tue, 8 May 2007 17:50:09 +0000 (19:50 +0200)]
[MINOR] implement acl_parse_ip and acl_match_ip
The ACL can now compare IP addresses. The client's IP address
can be checked.
Willy Tarreau [Sun, 6 May 2007 22:58:25 +0000 (00:58 +0200)]
[MEDIUM] added the 'block' keyword to the config language
The new 'block' keyword makes it possible to block a request based on
ACL test results. Block accepts two optional arguments : 'if' <cond>
and 'unless' <cond>.
The request will be blocked with a 403 response if the condition is validated
(if) or if it is not (unless). Do not rely on this one too much, as it's more
of a proof of concept helping in developing other matches.
Willy Tarreau [Sun, 6 May 2007 22:55:35 +0000 (00:55 +0200)]
[MEDIUM] added several ACL criteria and matches
Many ACL criteria have been added. Some others are still commented out
because some functions are still missing.
Willy Tarreau [Sun, 6 May 2007 22:53:22 +0000 (00:53 +0200)]
[MEDIUM] add the 'acl' keyword to the config language
The 'acl' keyword allows one to declare a new ACL. It is an important part
of the ACL framework.
Willy Tarreau [Sun, 6 May 2007 22:36:48 +0000 (00:36 +0200)]
[MAJOR] new framework for generic ACL support
This framework offers all other subsystems the ability to register
ACL matching criteria. Some generic matching functions are already
provided. Others will come soon and the framework shall evolve.
Willy Tarreau [Tue, 8 May 2007 17:46:30 +0000 (19:46 +0200)]
[MEDIUM] store the original destination address in the session
There are multiple places where the client's destination address is
required. Let's store it in the session when needed, and add a flag
to inform that it has been retrieved.
Willy Tarreau [Tue, 8 May 2007 16:28:09 +0000 (18:28 +0200)]
[MINOR] fixed useless memory allocation in str2net()
It was not necessary anymore to allocate memory in str2net().
Moreover, some calls to free() were missing in case of errors.
Willy Tarreau [Tue, 8 May 2007 21:22:43 +0000 (23:22 +0200)]
[TESTS] added a trivial program to benchmark hash algos
The uri_hash.c program makes it very easy to benchmark the
distribution of hash algos. Pass it one word per line, and
it will show the distribution per server for 1 to 10 servers.
Willy Tarreau [Tue, 8 May 2007 12:46:53 +0000 (14:46 +0200)]
[BUG] fix early server close after client close
Problem reported by Andy Smith. If a client sends TCP data
and quickly closes the connection before the server connection
is established, AND the whole buffer can be sent at once when
the connection establishes, then the server side believes that
it can simply abort the connection because the buffer is empty,
without checking that some work was performed.
Fix: ensure that nothing was written before closing.
Willy Tarreau [Wed, 2 May 2007 18:50:16 +0000 (20:50 +0200)]
[MEDIUM] ensure that we always have a null word in config
It is important when parsing configuration file to ensure that at
least one word is empty to mark the end of the line. This will be
required with ACLs in order to avoid reading past the end of line.
Willy Tarreau [Sun, 6 May 2007 22:19:57 +0000 (00:19 +0200)]
[MINOR] add support for variable size arrays in structures
Depending on the version of GCC, variable size arrays are not
declared in the same manner. Let's add a check for the version
and provide a macro.
Willy Tarreau [Sun, 6 May 2007 22:18:32 +0000 (00:18 +0200)]
[MINOR] add LIST_HEAD_INIT to the list management macros
It is useful to have the ability to initialize a list while declaring it.
Willy Tarreau [Wed, 2 May 2007 18:46:49 +0000 (20:46 +0200)]
[MEDIUM] add better list management macros
The FOREACH_ITEM and FOREACH_ITEM_SAFE macros are nasty, they
require too many arguments. Let's port those from linux instead.
Willy Tarreau [Tue, 8 May 2007 11:35:26 +0000 (13:35 +0200)]
[MEDIUM] implement the URI hash algorithm
Guillaume Dallaire contributed the URI hashing algorithm for
use with proxy-caches. It provides the advantage of optimizing
the cache hit rate.
Willy Tarreau [Wed, 2 May 2007 18:58:19 +0000 (20:58 +0200)]
[MEDIUM] always have msg->sol point to beginning of message
Since the 'data' pointer is not stored in message structures, it is
useful to have such a pointer to it when the message has been fully
parsed.
Willy Tarreau [Mon, 30 Apr 2007 15:30:59 +0000 (17:30 +0200)]
[BUILD] do not build rbtree anymore
Rbtree is not used anymore. Remove it from the makefiles.
Willy Tarreau [Mon, 30 Apr 2007 11:15:14 +0000 (13:15 +0200)]
[MINOR] uninline task_wakeup
task_wakup has become bigger since we used the trees. Let's not
inline it anymore.
Willy Tarreau [Mon, 30 Apr 2007 10:56:21 +0000 (12:56 +0200)]
[MINOR] ev_sepoll: refine flags management.
Ensure that we don't call the event handlers if the FD is already
marked FD_STERROR, and ensure that we properly catch HUP and ERR.
Willy Tarreau [Mon, 30 Apr 2007 12:37:43 +0000 (14:37 +0200)]
[BUG] fixed connection establishment detection
Since the introduction of speculative I/O, it was not always possible
to correctly detect a connection establishment. Particularly, in TCP
mode, there is no data to send and getsockopt() returns no error. The
solution consists in trying a connect() again to get its diagnostic.