]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
16 years ago[MINOR] stats: report number of tasks (active and running)
Willy Tarreau [Sat, 21 Mar 2009 17:33:52 +0000 (18:33 +0100)] 
[MINOR] stats: report number of tasks (active and running)

It may be useful for statistics purposes to report the number of
tasks.

16 years ago[MINOR] task: keep a task count and clean up task creators
Willy Tarreau [Sat, 21 Mar 2009 17:13:21 +0000 (18:13 +0100)] 
[MINOR] task: keep a task count and clean up task creators

It's sometimes useful at least for statistics to keep a task count.
It's easy to do by forcing the rare task creators to always use the
same functions to create/destroy a task.

16 years ago[MINOR] sched: permit a task to stay up between calls
Willy Tarreau [Sat, 21 Mar 2009 12:26:05 +0000 (13:26 +0100)] 
[MINOR] sched: permit a task to stay up between calls

If a task wants to stay in the run queue, it is possible. It just
needs to wake itself up. We just want to ensure that a reniced
task will be processed at the right instant.

16 years ago[BUG] scheduler: fix improper handling of duplicates __task_queue()
Willy Tarreau [Sat, 21 Mar 2009 11:51:40 +0000 (12:51 +0100)] 
[BUG] scheduler: fix improper handling of duplicates __task_queue()

The top of a duplicate tree is not where bit == -1 but at the most
negative bit. This was causing tasks to be queued in reverse order
within duplicates. While this is not dramatic, it's incorrect and
might lead to longer than expected duplicate depths under some
circumstances.

16 years ago[BUG] sched: don't leave 3 lasts tasks unprocessed when niced tasks are present
Willy Tarreau [Sat, 21 Mar 2009 10:53:09 +0000 (11:53 +0100)] 
[BUG] sched: don't leave 3 lasts tasks unprocessed when niced tasks are present

When there are niced tasks, we would only process #tasks/4 per
turn, without taking care of running #tasks when #tasks was below
4, leaving those tasks waiting for a few other tasks to push them.

The fix simply consists in checking (#tasks+3)/4.

16 years ago[MEDIUM] scheduler: get rid of the 4 trees thanks and use ebtree v4.1
Willy Tarreau [Sat, 21 Mar 2009 09:01:42 +0000 (10:01 +0100)] 
[MEDIUM] scheduler: get rid of the 4 trees thanks and use ebtree v4.1

Since we're now able to search from a precise expiration date in
the timer tree using ebtree 4.1, we don't need to maintain 4 trees
anymore. Not only does this simplify the code a lot, but it also
ensures that we can always look 24 days back and ahead, which
doubles the ability of the previous scheduler. Indeed, while based
on absolute values, the timer tree is now relative to <now> as we
can always search from <now>-31 bits.

The run queue uses the exact same principle now, and is now simpler
and a bit faster to process. With these changes alone, an overall
0.5% performance gain was observed.

Tests were performed on the few wrapping cases and everything works
as expected.

16 years ago[MINOR] update ebtree to version 4.1
Willy Tarreau [Sat, 21 Mar 2009 06:40:32 +0000 (07:40 +0100)] 
[MINOR] update ebtree to version 4.1

Ebtree version 4.1 brings lookup by ranges. This will be useful for
the scheduler.

16 years ago[BUILD] Fixed Makefile for linking pcre
Christian Wiese [Thu, 20 Nov 2008 13:47:04 +0000 (14:47 +0100)] 
[BUILD] Fixed Makefile for linking pcre

If both make parameters USE_PCRE and USE_STATIC_PCRE are set to 1
while building haproxy, pcre gets linked in dynamically.

Therefore we check if USE_STATIC_PCRE was explicitely enabled to
ommit the CFLAGS and LDFLAGS normally set if USE_PCRE is enabled.

16 years ago[CONTRIB] selinux policy for haproxy
Jan-Frode Myklebust [Tue, 17 Mar 2009 20:26:43 +0000 (21:26 +0100)] 
[CONTRIB] selinux policy for haproxy

Here's an selinux policy for haproxy. The patch is built and lightly
tested with haproxy-1.3.15.7-1.fc10.i386 on Fedora9, and haproxy-1.2.18
on RHEL5.

16 years ago[CLEANUP] http: remove some commented out obsolete code in process_response
Willy Tarreau [Sun, 15 Mar 2009 22:11:49 +0000 (23:11 +0100)] 
[CLEANUP] http: remove some commented out obsolete code in process_response

16 years ago[MINOR] tcp_request: let the caller take care of errors and timeouts
Willy Tarreau [Sun, 15 Mar 2009 21:55:47 +0000 (22:55 +0100)] 
[MINOR] tcp_request: let the caller take care of errors and timeouts

tcp_request is not meant to decide how an error or a timeout has to
be handled. It must just apply it rules. Now that the error checks
have been added to the session, we don't need to check them anymore
in tcp_request_inspect(), which will only consider the shutdown which
may be the result of such an error.

That makes a lot more sense since tcp_request is not really waiting
for a request.

16 years ago[BUG] session: errors were not reported in termination flags in TCP mode
Willy Tarreau [Sun, 15 Mar 2009 21:34:05 +0000 (22:34 +0100)] 
[BUG] session: errors were not reported in termination flags in TCP mode

In order to get termination flags properly updated, the session was
relying a bit too much on http_return_srv_error() which is http-centric.

A generic srv_error function was implemented in the session in order to
catch all connection abort situations. It was then noticed that a request
abort during a connection attempt was not reported, which is now fixed.

Read and write errors/timeouts were not logged either. It was necessary
to add those tests at 4 new locations.

Now it looks like everything is correctly logged. Most likely some error
checking code could now be removed from some analysers.

16 years ago[BUG] connect timeout is in the stream interface, not the buffer
Willy Tarreau [Sun, 15 Mar 2009 20:49:00 +0000 (21:49 +0100)] 
[BUG] connect timeout is in the stream interface, not the buffer

The connect timeout was not properly detected due to the fact that
it was not correctly initialized. It must be set as the stream interface
timeout, not the buffer's write timeout.

16 years ago[CLEANUP] config: catch and report some possibly wrong rule ordering
Willy Tarreau [Sun, 15 Mar 2009 14:23:16 +0000 (15:23 +0100)] 
[CLEANUP] config: catch and report some possibly wrong rule ordering

There are some configurations in which redirect rules are declared
after use_backend rules. We can also find "block" rules after any
of these ones. The processing sequence is :
  - block
  - redirect
  - use_backend

So as of now we try to detect wrong ordering to warn the user about
a possibly undesired behaviour.

16 years ago[MEDIUM] reverse internal proxy declaration order to match configuration
Willy Tarreau [Sun, 15 Mar 2009 13:51:53 +0000 (14:51 +0100)] 
[MEDIUM] reverse internal proxy declaration order to match configuration

People are regularly complaining that proxies are linked in reverse
order when reading the stats. This is now definitely fixed because
the proxy order is now fixed to match configuration order.

16 years ago[MINOR] tcp-inspect: permit the use of no-delay inspection
Willy Tarreau [Sun, 15 Mar 2009 13:43:58 +0000 (14:43 +0100)] 
[MINOR] tcp-inspect: permit the use of no-delay inspection

Sometimes it may make sense to be able to immediately apply a verdict
without waiting at all. It was not possible because no inspect-delay
meant no inspection at all. This is now fixed.

16 years ago[MINOR] cfgparse: set backends to "balance roundrobin" by default
Willy Tarreau [Sun, 15 Mar 2009 13:06:41 +0000 (14:06 +0100)] 
[MINOR] cfgparse: set backends to "balance roundrobin" by default

When a backend has no LB algo specified and is not in dispatch, proxy
nor transparent mode, use "balance roundrobin" by default instead of
complaining. This will be particularly useful with stats and redirects.

16 years ago[MINOR] cfgparse: some cleanups in the consistency checks
Willy Tarreau [Sun, 15 Mar 2009 12:46:16 +0000 (13:46 +0100)] 
[MINOR] cfgparse: some cleanups in the consistency checks

Check for servers in health mode, for health mode in pure-backends.
Some code have been refactored for better organization.

16 years ago[MINOR] show errors: encode backslash as well as non-ascii characters
Willy Tarreau [Thu, 12 Mar 2009 07:18:33 +0000 (08:18 +0100)] 
[MINOR] show errors: encode backslash as well as non-ascii characters

These ones were not properly encoded, causing confusion on the output.

16 years ago[RELEASE] Released version 1.3.16-rc2 v1.3.16-rc2
Willy Tarreau [Mon, 9 Mar 2009 21:45:53 +0000 (22:45 +0100)] 
[RELEASE] Released version 1.3.16-rc2

Released version 1.3.16-rc2 with the following main changes :
    - [BUG] stream_sock: write timeout must be updated when forwarding !

16 years ago[BUG] stream_sock: write timeout must be updated when forwarding !
Willy Tarreau [Mon, 9 Mar 2009 21:40:57 +0000 (22:40 +0100)] 
[BUG] stream_sock: write timeout must be updated when forwarding !

When data are forwarded between socket, we must update the output
socket's write timeout. This was forgotten, causing sessions to
unexpectedly expire during long posts.

16 years ago[RELEASE] Released version 1.3.16-rc1 v1.3.16-rc1
Willy Tarreau [Mon, 9 Mar 2009 00:03:42 +0000 (01:03 +0100)] 
[RELEASE] Released version 1.3.16-rc1

Released version 1.3.16-rc1 with the following main changes :
    - appsessions: cleanup DEBUG_HASH and initialize request_counter
    - [MINOR] acl: add new keyword "connslots"
    - [MINOR] cfgparse: fix off-by 2 in error message size
    - [BUILD] fix build with gcc 4.3
    - [BUILD] fix MANDIR default location to match documentation
    - [TESTS] add a debug patch to help trigger the stats bug
    - [BUG] Flush buffers also where there are exactly 0 bytes left
    - [MINOR] Allow to specify a domain for a cookie
    - [BUG/CLEANUP] cookiedomain -> cookie_domain rename + free(p->cookie_domain)
    - [MEDIUM] Fix memory freeing at exit
    - [MEDIUM] Fix memory freeing at exit, part 2
    - [BUG] Fix listen & more of 2 couples <ip>:<port>
    - [DOC] remove buggy comment for use_backend
    - [CRITICAL] fix server state tracking: it was O(n!) instead of O(n)
    - [MEDIUM] add support for URI hash depth and length limits
    - [MINOR] permit renaming of x-forwarded-for header
    - [BUILD] fix Makefile.bsd and Makefile.osx for stream_interface
    - [BUILD] Haproxy won't compile if DEBUG_FULL is defined
    - [MEDIUM] upgrade to ebtree v4.0
    - [DOC] update the README file with new build options
    - [MEDIUM] reduce risk of event starvation in ev_sepoll
    - [MEDIUM] detect streaming buffers and tag them as such
    - [MEDIUM] add support for conditional HTTP redirection
    - [BUILD] make install should depend on haproxy not "all"
    - [DEBUG] add a TRACE macro to facilitate runtime data extraction
    - [BUG] event pollers must not wait if a task exists in the run queue
    - [BUG] queue management: wake oldest request in queues
    - [BUG] log: reported queue position was offed-by-one
    - [BUG] fix the dequeuing logic to ensure that all requests get served
    - [DOC] documentation for the "retries" parameter was missing.
    - [MEDIUM] implement a monotonic internal clock
    - [MEDIUM] further improve monotonic clock by check forward jumps
    - [OPTIM] add branch prediction hints in list manipulations
    - [MAJOR] replace ultree with ebtree in wait-queues
    - [BUG] we could segfault during exit while freeing uri_auths
    - [BUG] wqueue: perform proper timeout comparisons with wrapping values
    - [MINOR] introduce now_ms, the current date in milliseconds
    - [BUG] disable buffer read timeout when reading stats
    - [MEDIUM] rework the wait queue mechanism
    - [BUILD] change declaration of base64tab to fix build with Intel C++
    - [OPTIM] shrink wake_expired_tasks() by using task_wakeup()
    - [MAJOR] use an ebtree instead of a list for the run queue
    - [MEDIUM] introduce task->nice and boot access to statistics
    - [OPTIM] task_queue: assume most consecutive timers are equal
    - [BUILD] silent a warning in unlikely() with gcc 4.x
    - [MAJOR] convert all expiration timers from timeval to ticks
    - [BUG] use_backend would not correctly consider "unless"
    - [TESTS] added test-acl.cfg to test some ACL combinations
    - [MEDIUM] add support for configuration keyword registration
    - [MEDIUM] modularize the global "stats" keyword configuration parser
    - [MINOR] cfgparse: add support for warnings in external functions
    - [MEDIUM] modularize the "timeout" keyword configuration parser
    - [MAJOR] implement tcp request content inspection
    - [MINOR] acl: add a new parsing function: parse_dotted_ver
    - [MINOR] acl: add req_ssl_ver in TCP, to match an SSL version
    - [CLEANUP] remove unused include/types/client.h
    - [CLEANUP] remove many #include <types/xxx> from C files
    - [CLEANUP] remove dependency on obsolete INTBITS macro
    - [DOC] document the new "tcp-request" keyword and associated ACLs
    - [MINOR] acl: add REQ_CONTENT to the list of default acls
    - [MEDIUM] acl: permit fetch() functions to set the result themselves
    - [MEDIUM] acl: get rid of dummy values in always_true/always_false
    - [MINOR] acl: add the "wait_end" acl verb
    - [MEDIUM] acl: enforce ACL type checking
    - [MEDIUM] acl: set types on all currently known ACL verbs
    - [MEDIUM] acl: when possible, report the name and requirements of ACLs in warnings
    - [CLEANUP] remove 65 useless NULL checks before free
    - [MEDIUM] memory: update pool_free2() to support NULL pointers
    - [MEDIUM] buffers: ensure buffer_shut* are properly called upon shutdowns
    - [MEDIUM] process_srv: rely on buffer flags for client shutdown
    - [MEDIUM] process_srv: don't rely at all on client state
    - [MEDIUM] process_cli: don't rely at all on server state
    - [BUG] fix segfault with url_param + check_post
    - [BUG] server timeout was not considered in some circumstances
    - [BUG] client timeout incorrectly rearmed while waiting for server
    - [MAJOR] kill CL_STINSPECT and CL_STHEADERS (step 1)
    - [MAJOR] get rid of SV_STANALYZE (step 2)
    - [MEDIUM] simplify and centralize request timeout cancellation and request forwarding
    - [MAJOR] completely separate HTTP and TCP states on the request path
    - [BUG] fix recently introduced loop when client closes early
    - [MAJOR] get rid of the SV_STHEADERS state
    - [MAJOR] better separation of response processing and server state
    - [MAJOR] clearly separate HTTP response processing from TCP server state
    - [MEDIUM] remove unused references to {CL|SV}_STSHUT*
    - [MINOR] term_trace: add better instrumentations to trace the code
    - [BUG] ev_sepoll: closed file descriptors could persist in the spec list
    - [BUG] process_response must not enable the read FD
    - [BUG] buffers: remove BF_MAY_CONNECT and fix forwarding issue
    - [BUG] process_response: do not touch srv_state
    - [BUG] maintain_proxies must not disable backends
    - [CLEANUP] get rid of BF_SHUT*_PENDING
    - [MEDIUM] buffers: add BF_EMPTY and BF_FULL to remove dependency on req/rep->l
    - [MAJOR] process_session: rely only on buffer flags
    - [MEDIUM] use buffer->wex instead of buffer->cex for connect timeout
    - [MEDIUM] centralize buffer timeout checks at the top of process_session
    - [MINOR] ensure the termination flags are set by process_xxx
    - [MEDIUM] session: move the analysis bit field to the buffer
    - [OPTIM] process_cli/process_srv:  reduce the number of tests
    - [BUG] regparm is broken on gcc < 3
    - [BUILD] fix warning in proto_tcp.c with gcc >= 4
    - [MEDIUM] merge inspect_exp and txn->exp into request buffer
    - [BUG] process_cli/process_srv: don't call shutdown when already done
    - [BUG] process_request: HTTP body analysis must return zero if missing data
    - [TESTS] test-fsm: 22 regression tests for state machines
    - [BUG] Fix empty X-Forwarded-For header name when set in defaults section
    - [BUG] fix harmless but wrong fd insertion sequence
    - [MEDIUM] make it possible for analysers to follow the whole session
    - [MAJOR] rework of the server FSM
    - [OPTIM] remove useless fd_set(read) upon shutdown(write)
    - [MEDIUM] massive cleanup of process_srv()
    - [MEDIUM] second level of code cleanup for process_srv_data
    - [MEDIUM] third cleanup and optimization of process_srv_data()
    - [MEDIUM] process_srv_data: ensure that we always correctly re-arm timeouts
    - [MEDIUM] stream_sock_process_data moved to stream_sock.c
    - [MAJOR] make the client side use stream_sock_process_data()
    - [MEDIUM] split stream_sock_process_data
    - [OPTIM] stream_sock_read must check for null-reads more often
    - [MINOR] only call flow analysers when their read side is connected.
    - [MEDIUM] reintroduce BF_HIJACK with produce_content
    - [MINOR] re-arrange buffer flags and rename some of them
    - [MINOR] do not check for BF_SHUTR when computing write timeout
    - [OPTIM] ev_sepoll: detect newly created FDs and check them once
    - [OPTIM] reduce the number of calls to task_wakeup()
    - [OPTIM] force inlining of large functions with gcc >= 3
    - [MEDIUM] indicate a reason for a task wakeup
    - [MINOR] change type of fdtab[]->owner to void*
    - [MAJOR] make stream sockets aware of the stream interface
    - [MEDIUM] stream interface: add the ->shutw method as well as in and out buffers
    - [MEDIUM] buffers: add BF_READ_ATTACHED and BF_ANA_TIMEOUT
    - [MEDIUM] process_session: make use of the new buffer flags
    - [CLEANUP] process_session: move debug outputs out of the critical loop
    - [MEDIUM] move QUEUE and TAR timers to stream interfaces
    - [OPTIM] add compiler hints in tick_is_expired()
    - [MINOR] add buffer_check_timeouts() to check what timeouts have fired.
    - [MEDIUM] use buffer_check_timeouts instead of stream_sock_check_timeouts()
    - [MINOR] add an expiration flag to the stream_sock_interface
    - [MAJOR] migrate the connection logic to stream interface
    - [MAJOR] add a connection error state to the stream_interface
    - [MEDIUM] add the SN_CURR_SESS flag to the session to track open sessions
    - [MEDIUM] continue layering cleanups.
    - [MEDIUM] stream_interface: added a DISconnected state between CON/EST and CLO
    - [MEDIUM] remove stream_sock_update_data()
    - [MINOR] maintain a global session list in order to ease debugging
    - [BUG] shutw must imply close during a connect
    - [MEDIUM] process shutw during connection attempt
    - [MEDIUM] make the stream interface control the SHUT{R,W} bits
    - [MAJOR] complete layer4/7 separation
    - [CLEANUP] move the session-related functions to session.c
    - [MINOR] call session->do_log() for logging
    - [MINOR] replace the ambiguous client_return function by stream_int_return
    - [MINOR] replace client_retnclose() with stream_int_retnclose()
    - [MINOR] replace srv_close_with_err() with http_server_error()
    - [MEDIUM] make the http server error function a pointer in the session
    - [CLEANUP] session.c: removed some migration left-overs in sess_establish()
    - [MINOR] stream_sock_data_finish() should not expose fd
    - [MEDIUM] extract TCP request processing from HTTP
    - [MEDIUM] extract the HTTP tarpit code from process_request().
    - [MEDIUM] move the HTTP request body analyser out of process_request().
    - [MEDIUM] rename process_request to http_process_request
    - [BUG] fix forgotten server session counter
    - [MINOR] declare process_session in session.h, not proto_http.h
    - [MEDIUM] first pass of lifting to proto_uxst.c:uxst_event_accept()
    - [MINOR] add an analyser code for UNIX stats request
    - [MINOR] pre-set analyser flags on the listener at registration time
    - [BUG] do not forward close from cons to prod with analysers
    - [MEDIUM] ensure that sock->shutw() also closes read for init states
    - [MINOR] add an analyser state in struct session
    - [MAJOR] make unix sockets work again with stats
    - [MEDIUM] remove cli_fd, srv_fd, cli_state and srv_state from the session
    - [MINOR] move the listener reference from fd to session
    - [MEDIUM] reference the current hijack function in the buffer itself
    - [MINOR] slightly rebalance stats_dump_{raw,http}
    - [MINOR] add a new back-reference type : struct bref
    - [MINOR] add back-references to sessions for later use by a dumper.
    - [MEDIUM] add support for "show sess" in unix stats socket
    - [BUG] do not release the connection slot during a retry
    - [BUG] dynamic connection throttling could return a max of zero conns
    - [BUG] do not try to pause backends during reload
    - [BUG] ensure that listeners from disabled proxies are correctly unbound.
    - [BUG] acl-related keywords are not allowed in defaults sections
    - [BUG] cookie capture is declared in the frontend but checked on the backend
    - [BUG] critical errors should be reported even in daemon mode
    - [MINOR] redirect: add support for the "drop-query" option
    - [MINOR] redirect: add support for "set-cookie" and "clear-cookie"
    - [MINOR] redirect: in prefix mode a "/" means not to change the URI
    - [BUG] do not dequeue requests on a dead server
    - [BUG] do not dequeue the backend's pending connections on a dead server
    - [MINOR] stats: indicate if a task is running in "show sess"
    - [BUG] check timeout must not be changed if timeout.check is not set
    - [BUG] "option transparent" is for backend, not frontend !
    - [MINOR] transfer errors were not reported anymore in data phase
    - [MEDIUM] add a send limit to a buffer
    - [MEDIUM] don't report buffer timeout when there is I/O activity
    - [MEDIUM] indicate when we don't care about read timeout
    - [MINOR] add flags to indicate when a stream interface is waiting for space/data
    - [MEDIUM] enable inter-stream_interface wakeup calls
    - [MAJOR] implement autonomous inter-socket forwarding
    - [MINOR] add the splice_len member to the buffer struct in preparation of splice support
    - [MEDIUM] stream_sock: factor out the return path in case of no-writes
    - [MEDIUM] i/o: rework ->to_forward and ->send_max
    - [OPTIM] stream_sock: do not ask for polling on EAGAIN if we have read
    - [OPTIM] buffer: replace rlim by max_len
    - [OPTIM] stream_sock: factor out the buffer full handling out of the loop
    - [CLEANUP] replace a few occurrences of (flags & X) && !(flags & Y)
    - [CLEANUP] stream_sock: move the write-nothing condition out of the loop
    - [MEDIUM] split stream_sock_write() into callback and core functions
    - [MEDIUM] stream_sock_read: call ->chk_snd whenever there are data pending
    - [MINOR] stream_sock: fix a few wrong empty calculations
    - [MEDIUM] stream_sock: try to send pending data on chk_snd()
    - [MINOR] global.maxpipes: add the ability to reserve file descriptors for pipes
    - [MEDIUM] splice: add configuration options and set global.maxpipes
    - [MINOR] introduce structures required to support Linux kernel splicing
    - [MEDIUM] add definitions for Linux kernel splicing
    - [MAJOR] complete support for linux 2.6 kernel splicing
    - [BUG] reserve some pipes for backends with splice enabled
    - [MEDIUM] splice: add hints to support older buggy kernels
    - [MEDIUM] introduce pipe pools
    - [MEDIUM] splice: make use of pipe pools
    - [STATS] report pipe usage in the statistics
    - [OPTIM] make global.maxpipes default to global.maxconn/4 when not specified
    - [BUILD] fix snapshot date extraction with negative timezones
    - [MEDIUM] move global tuning options to the global structure
    - [MEDIUM] splice: add the global "nosplice" option
    - [BUILD] add USE_LINUX_SPLICE to enable LINUX_SPLICE on linux 2.6
    - [BUG] we must not exit if protocol binding only returns a warning
    - [MINOR] add support for bind interface name
    - [BUG] inform the user when root is expected but not set
    - [MEDIUM] add support for source interface binding
    - [MEDIUM] add support for source interface binding at the server level
    - [MEDIUM] implement bind-process to limit service presence by process
    - [DOC] document maxpipes, nosplice, option splice-{auto,request,response}
    - [DOC] filled the logging section of the configuration manual
    - [DOC] document HTTP status codes
    - [DOC] document a few missing info about errorfile
    - [BUG] fix random memory corruption using "show sess"
    - [BUG] fix unix socket processing of interrupted output
    - [DOC] add diagrams of queuing and future ACL design
    - [BUILD] proto_http did not build on gcc-2.95
    - [BUG] the "source" keyword must first clear optional settings
    - [BUG] global.tune.maxaccept must be limited even in mono-process mode
    - [MINOR] ensure that http_msg_analyzer updates pointer to invalid char
    - [MEDIUM] store a complete dump of request and response errors in proxies
    - [MEDIUM] implement error dump on unix socket with "show errors"
    - [DOC] document "show errors"
    - [MINOR] errors dump must use user-visible date, not internal date.
    - [MINOR] time: add __usec_to_1024th to convert usecs to 1024th of second
    - [MINOR] add curr_sec_ms and curr_sec_ms_scaled for current second.
    - [MEDIUM] measure and report session rate on frontend, backends and servers
    - [BUG] the "connslots" keyword was matched as "connlots"
    - [MINOR] acl: add 2 new verbs: fe_sess_rate and be_sess_rate
    - [MEDIUM] implement "rate-limit sessions" for the frontend
    - [BUG] interface binding: length must include the trailing zero
    - [BUG] typo in timeout error reporting : report *res and not *err
    - [OPTIM] maintain_proxies: only wake up when the frontend will be ready
    - [OPTIM] rate-limit: cleaner behaviour on low rates and reduce consumption
    - [BUG] switch server-side stream interface to close in case of abort
    - [CLEANUP] remove last references to term_trace
    - [OPTIM] freq_ctr: do not rotate the counters when reading
    - [BUG] disable any analysers for monitoring requests
    - [BUG] rate-limit in defaults section was ignored
    - [BUG] task: fix handling of duplicate keys
    - [OPTIM] task: don't unlink a task from a wait queue when waking it up
    - [OPTIM] displace tasks in the wait queue only if absolutely needed
    - [MEDIUM] minor update to the task api: let the scheduler queue itself
    - [BUG] event_accept() must always wake the task up, even in health mode
    - [CLEANUP] task: distinguish between clock ticks and timers
    - [OPTIM] task: reduce the number of calls to task_queue()
    - [OPTIM] do not re-check req buffer when only response has changed
    - [CLEANUP] don't enable kernel splicing when socket is closed
    - [CLEANUP] buffer_flush() was misleading, rename it as buffer_erase
    - [MINOR] buffers: implement buffer_flush()
    - [MEDIUM] rearrange forwarding condition to enable splice during analysis
    - [BUILD] build fixes for Solaris
    - [BUILD] proto_http did not build on gcc-2.95 (again)
    - [CONTRIB] halog: fast log parser for haproxy
    - [CONTRIB] halog: faster fgets() and add support for percentile reporting

16 years ago[CONTRIB] halog: faster fgets() and add support for percentile reporting
Willy Tarreau [Fri, 20 Feb 2009 10:02:32 +0000 (11:02 +0100)] 
[CONTRIB] halog: faster fgets() and add support for percentile reporting

A new fgets implementation saves about 25-50% of the time spent parsing
the logs.

Percentile calculation has been added for timers using -pct.

16 years ago[CONTRIB] halog: fast log parser for haproxy
Willy Tarreau [Thu, 22 Jan 2009 17:56:50 +0000 (18:56 +0100)] 
[CONTRIB] halog: fast log parser for haproxy

halog can search errors, count lines, sort by accept date, look for
traffic holes and large connection counts at output graph plots of
timers.

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

move the DPRINTF below the local variable declarations.
(cherry picked from commit 7b92db4cd5c106f5110c871503de11aabd0776eb)

The patch accidently got reverted.

16 years ago[BUILD] build fixes for Solaris
Willy Tarreau [Sun, 8 Mar 2009 21:25:28 +0000 (22:25 +0100)] 
[BUILD] build fixes for Solaris

One build error in stream_sock.c when MSG_NOSIGNAL is not defined,
and a warning in task.c.

16 years ago[MEDIUM] rearrange forwarding condition to enable splice during analysis
Willy Tarreau [Sun, 8 Mar 2009 20:38:23 +0000 (21:38 +0100)] 
[MEDIUM] rearrange forwarding condition to enable splice during analysis

The forwarding condition was not very clear. We would only enable
forwarding when send_max is zero, and we would only splice when no
analyser is installed. In fact we want to enable forward when there
is no analyser and we want to splice at soon as there is data to
forward, regardless of the analysers.

16 years ago[MINOR] buffers: implement buffer_flush()
Willy Tarreau [Sun, 8 Mar 2009 20:12:04 +0000 (21:12 +0100)] 
[MINOR] buffers: implement buffer_flush()

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

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

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

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

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

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

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

The same changes have been applied to uxst_process_session().

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

move the DPRINTF below the local variable declarations.

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

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

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

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

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

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

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

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

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

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

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

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

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

With this patch all build fine:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

"early blocking based on ACLs" is definitely wrong here

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

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

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

Bug reported by Laurent Dolosor.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Cheers,
  Ross.

-=

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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