haproxy/src
Willy Tarreau 5be2f35231 MAJOR: polling: centralize calls to I/O callbacks
In order for HTTP/2 not to eat too much memory, we'll have to support
on-the-fly buffer allocation, since most streams will have an empty
request buffer at some point. Supporting allocation on the fly means
being able to sleep inside I/O callbacks if a buffer is not available.

Till now, the I/O callbacks were called from two locations :
  - when processing the cached events
  - when processing the polled events from the poller

This change cleans up the design a bit further than what was started in
1.5. It now ensures that we never call any iocb from the poller itself
and that instead, events learned by the poller are put into the cache.
The benefit is important in terms of stability : we don't have to care
anymore about the risk that new events are added into the poller while
processing its events, and we're certain that updates are processed at
a single location.

To achieve this, we now modify all the fd_* functions so that instead of
creating updates, they add/remove the fd to/from the cache depending on
its state, and only create an update when the polling status reaches a
state where it will have to change. Since the pollers make use of these
functions to notify readiness (using fd_may_recv/fd_may_send), the cache
is always up to date with the poller.

Creating updates only when the polling status needs to change saves a
significant amount of work for the pollers : a benchmark showed that on
a typical TCP proxy test, the amount of updates per connection dropped
from 11 to 1 on average. This also means that the update list is smaller
and has more chances of not thrashing too many CPU cache lines. The first
observed benefit is a net 2% performance gain on the connection rate.

A second benefit is that when a connection is accepted, it's only when
we're processing the cache, and the recv event is automatically added
into the cache *after* the current one, resulting in this event to be
processed immediately during the same loop. Previously we used to have
a second run over the updates to detect if new events were added to
catch them before waking up tasks.

The next gain will be offered by the next steps on this subject consisting
in implementing an I/O queue containing all cached events ordered by priority
just like the run queue, and to be able to leave some events pending there
as long as needed. That will allow us *not* to perform some FD processing
if it's not the proper time for this (typically keep waiting for a buffer
to be allocated if none is available for an recv()). And by only processing
a small bunch of them, we'll allow priorities to take place even at the I/O
level.

As a result of this change, functions fd_alloc_or_release_cache_entry()
and fd_process_polled_events() have disappeared, and the code dedicated
to checking for new fd events after the callback during the poll() loop
was removed as well. Despite the patch looking large, it's mostly a
change of what function is falled upon fd_*() and almost nothing was
added.
2014-11-21 20:37:32 +01:00
..
acl.c CLEANUP: acl: cleanup some of the redundancy and spaghetti after last fix 2014-08-29 19:13:32 +02:00
appsession.c BUILD: definitely silence some stupid GCC warnings 2013-12-13 15:21:36 +01:00
arg.c MINOR: arg: improve wording on error reporting 2013-12-13 00:38:47 +01:00
auth.c BUG/MEDIUM: auth: fix segfault with http-auth and a configuration with an unknown encryption algorithm 2014-08-29 21:06:31 +02:00
backend.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
base64.c [MINOR] add encode/decode function for 30-bit integers from/to base64 2010-10-30 19:04:33 +02:00
buffer.c BUG/MAJOR: buffer: check the space left is enough or not when input data in a buffer is wrapped 2014-10-31 07:39:34 +01:00
cfgparse.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
channel.c BUG/MEDIUM: channel: bi_putblk() must not wrap before the end of buffer 2014-04-24 17:19:21 +02:00
checks.c BUG/MEDIUM: checks: fix conflicts between agent checks and ssl healthchecks 2014-11-16 00:53:12 +01:00
chunk.c BUG/MINOR: chunk: Fix function chunk_strcmp and chunk_strcasecmp match a substring. 2014-05-09 19:16:13 +02:00
compression.c BUG/MINOR: compression: correctly report incoming byte count 2014-04-23 19:31:17 +02:00
connection.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
cttproxy.c CLEANUP: cttproxy: remove a warning on undeclared close() 2012-10-05 22:18:07 +02:00
dumpstats.c BUG/MAJOR: cli: explicitly call cli_release_handler() upon error 2014-10-22 19:25:30 +02:00
ev_epoll.c MAJOR: polling: centralize calls to I/O callbacks 2014-11-21 20:37:32 +01:00
ev_kqueue.c MAJOR: polling: centralize calls to I/O callbacks 2014-11-21 20:37:32 +01:00
ev_poll.c MAJOR: polling: centralize calls to I/O callbacks 2014-11-21 20:37:32 +01:00
ev_select.c MAJOR: polling: centralize calls to I/O callbacks 2014-11-21 20:37:32 +01:00
fd.c MAJOR: polling: centralize calls to I/O callbacks 2014-11-21 20:37:32 +01:00
freq_ctr.c BUG/MINOR: time: frequency counters are not totally accurate 2012-12-29 21:50:07 +01:00
frontend.c BUG/MAJOR: frontend: initialize capture pointers earlier 2014-11-18 18:53:43 +01:00
haproxy-systemd-wrapper.c BUG/MEDIUM: remove debugging code from systemd-wrapper 2014-09-24 12:59:25 +02:00
haproxy.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
hash.c BUG/MEDIUM: backend: Update hash to use unsigned int throughout 2014-07-08 22:00:21 +02:00
hdr_idx.c OPTIM/MINOR: move the hdr_idx pools out of the proxy struct 2011-10-24 18:15:04 +02:00
i386-linux-vsys.c MEDIUM: listener: add support for linux's accept4() syscall 2012-10-08 20:11:03 +02:00
lb_chash.c REORG/MEDIUM: server: split server state and flags in two different variables 2014-05-22 11:27:00 +02:00
lb_fas.c REORG/MEDIUM: server: split server state and flags in two different variables 2014-05-22 11:27:00 +02:00
lb_fwlc.c REORG/MEDIUM: server: split server state and flags in two different variables 2014-05-22 11:27:00 +02:00
lb_fwrr.c REORG/MEDIUM: server: split server state and flags in two different variables 2014-05-22 11:27:00 +02:00
lb_map.c MINOR: server: make use of srv_is_usable() instead of checking eweight 2014-05-23 14:29:11 +02:00
listener.c MEDIUM: listener: support rebinding during resume() 2014-07-08 01:13:35 +02:00
log.c MINOR: log: add a new field "%lc" to implement a per-frontend log counter 2014-08-28 15:08:14 +02:00
map.c BUG/MEDIUM: patterns: last fix was still not enough 2014-04-28 14:19:17 +02:00
memory.c MINOR: cli: add the new "show pools" command 2014-01-28 16:50:35 +01:00
namespace.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
pattern.c BUG/MINOR: pattern: remove useless allocation of unused trash in pat_parse_reg() 2014-08-29 15:19:33 +02:00
payload.c BUG/MINOR: acl: req_ssl_sni fails with SSLv3 record version 2014-04-10 23:30:59 +02:00
peers.c BUG/MEDIUM: peers: fix key consistency for integer stick tables 2014-02-16 08:14:16 +01:00
pipe.c BUILD/MINOR: silent a build warning in src/pipe.c (fcntl) 2011-10-24 17:09:22 +02:00
proto_http.c BUG/MINOR: stats: correctly set the request/response analysers 2014-11-21 17:53:08 +01:00
proto_tcp.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
proto_uxst.c BUG/MEDIUM: unix: completely unbind abstract sockets during a pause() 2014-07-08 01:13:35 +02:00
protocol.c REORG: split "protocols" files into protocol and listener 2012-09-15 22:29:32 +02:00
proxy.c BUG/MEDIUM: http: adjust close mode when switching to backend 2014-09-30 18:44:22 +02:00
queue.c MINOR: server: make use of srv_is_usable() instead of checking eweight 2014-05-23 14:29:11 +02:00
raw_sock.c BUG/MINOR: raw_sock: also consider ENOTCONN in addition to EAGAIN for recv() 2014-03-04 07:27:18 +01:00
rbtree.c [MINOR] imported the rbtree function from Linux kernel 2007-01-07 02:12:57 +01:00
regex.c MEDIUM: regex: Use pcre_study always when PCRE is used, regardless of JIT 2014-11-18 13:26:18 +01:00
sample.c MINOR: sample: add "json" converter 2014-10-26 06:41:12 +01:00
server.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
session.c MAJOR: namespace: add Linux network namespace support 2014-11-21 07:51:57 +01:00
sessionhash.c [PATCH] appsessions: cleanup DEBUG_HASH and initialize request_counter 2008-08-13 23:43:26 +02:00
shctx.c MINOR: stats: add counters for SSL cache lookups and misses 2014-05-28 16:53:04 +02:00
signal.c BUG/MEDIUM: signal: signal handler does not properly check for signal bounds 2013-01-24 16:19:19 +01:00
ssl_sock.c BUG/MEDIUM: checks: fix conflicts between agent checks and ssl healthchecks 2014-11-16 00:53:12 +01:00
standard.c MINOR: sample: add "json" converter 2014-10-26 06:41:12 +01:00
stick_table.c BUG/MAJOR: tcp: fix a possible busy spinning loop in content track-sc* 2014-07-30 08:56:35 +02:00
stream_interface.c BUG/CRITICAL: http: don't update msg->sov once data start to leave the buffer 2014-09-02 16:48:54 +02:00
task.c [OPTIM] task: don't scan the run queue if we know it's empty 2011-09-10 20:08:49 +02:00
time.c BUG/MINOR: time: frequency counters are not totally accurate 2012-12-29 21:50:07 +01:00
trace.c MINOR: add a new function call tracer for debugging purposes 2012-05-26 00:12:37 +02:00
uri_auth.c BUG/MEDIUM: uri_auth: missing NULL check and memory leak on memory shortage 2013-01-24 16:19:19 +01:00