Hi all, after 1.5 months of head scratching and hair pulling leading to many bugs being fixed, here comes 1.5-dev22.
This release comes with two important changes : - rework of the whole polling system, which is the lower layer of haproxy ; This was needed to definitely get rid of the frequent regressions that were caused each time we did a small change more or less related to this area. The "speculative I/O" mechanism designed 7 years ago was totally reworked to become a complete event cache which remembers what direction a file descriptor is ready in even after being temporarily disabled. This was necessary because the previous model didn't work well with SSL. Or in fact, it used to work well enough to hide the fact that the SSL API is not compatible at all with polled I/O due to its internal buffers. This part was really difficult to get right, but the code is much less tricky and much safer, and despite the important change, I already trust it much more than I did for the previous one. - switch to HTTP keep-alive mode by default. This is a major step forwards since 1.1 where we used to run in tunnel mode by default. The reason is that tunnel mode was the only way to have something close to keep-alive for many years. Now that we have end-to-end keep-alive, we have no reason for keeping tunnel mode as the default. It causes all the trouble everyone has faced at least once ("my rule randomly matches") which everyone now is used to respond to with "your config is missing http-server-close". So now a config without any close directive is not tunnel anymore but end-to-end keep-alive. I know there are corner cases where people want the tunnel mode. There's now a new option "tunnel" exactly for this. It will be needed to have it in both the frontend and the backend, just as before when it was needed to have none of them there. Eventhough I took extreme care on these changes and did many many tests (I individually tested the 25 combinations of the 5 HTTP modes), it is still possible that I didn't notice something, despite this version currently being run in production on the main site. So reports are welcome (success, doubts or failures). I won't enumerate all of the 32 bugs that were fixed since dev21 (some of them introduced there) thanks to all the feedback we got here on the list and to the detailed information some participants provided. The main interesting features that were included are : - optimization of the SSL buffer sizes during a handshake to reduce the number of round trips, as suggested by Ilya Grigorik. Tests run by Ilya show that the handshake time can be reduced by 3! Work done by Emeric. - addition of more debugging information on the stats socket in "show info" such as SSL connections etc, and memory pools usage using "show pools". - added the ability to set a hard limit on the SSL session rate (maxsslrate) in order to protect the SSL stack against incoming connection rushes which can happen during a restart, a config change (eg: different algos) or an attack. It works exactly like the "rate-limit sessions" except that it applies to SSL only. - new "capture.req.hdr()" and "capture.res.hdr()" sample fetches are used to include contents of selected captured headers in logs or other headers (William). - keep-alive: stick to the same server if possible after receiving a 401 or 407 from the server, so that the user has a chance to complete an authentication handshake (eg: NTLM). This avoids the need for "option prefer-last-server" for such situations. - tcp-check: new "tcp-check connect" directive to establish a connection to a specific port. This allows multi-port checks (Baptiste). Some code is still pending for a next version. Thierry has finished the map+acl merge which will allow to manipulate ACLs on the fly just like maps today, the code is still under review (massive changes), and is so often requested that we'd better merge it before 1.5-final. Another SSL optim is currently under test. All the easy things that were pending have been merged. This leaves us with only the bind-process fixes, buffer management to fix compression on chunks, and the agent-checks modifications. We'll see how all this goes and if some parts are too difficult to fix before the release. In the mean time, please test and report. Testers have been amazingly helpful and determined these last months, and that's what makes the quality in the end. So please continue like this! Last point, I've been backporting all relevant fixes to 1.4 and am planning to issue 1.4.25 once I have finished validating them all. And for those who ask "when will 1.5-final be released ?", let's say "when it's ready, probably soon". Willy --- Usual links below : Site index : http://haproxy.1wt.eu/ Sources : http://haproxy.1wt.eu/download/1.5/src/devel/ Changelog : http://haproxy.1wt.eu/download/1.5/src/CHANGELOG Cyril's HTML doc : http://cbonte.github.com/haproxy-dconv/configuration-1.5.html And the changelog : 2014/02/03 : 1.5-dev22 - MEDIUM: tcp-check new feature: connect - MEDIUM: ssl: Set verify 'required' as global default for servers side. - MINOR: ssl: handshake optim for long certificate chains. - BUG/MINOR: pattern: pattern comparison executed twice - BUG/MEDIUM: map: segmentation fault with the stats's socket command "set map ..." - BUG/MEDIUM: pattern: Segfault in binary parser - MINOR: pattern: move functions for grouping pat_match_* and pat_parse_* and add documentation. - MINOR: standard: The parse_binary() returns the length consumed and his documentation is updated - BUG/MINOR: payload: the patterns of the acl "req.ssl_ver" are no parsed with the good function. - BUG/MEDIUM: pattern: "pat_parse_dotted_ver()" set bad expect_type. - BUG/MINOR: sample: The c_str2int converter does not fail if the entry is not an integer - BUG/MEDIUM: http/auth: Sometimes the authentication credentials can be mix between two requests - MINOR: doc: Bad cli function name. - MINOR: http: smp_fetch_capture_header_* fetch captured headers - BUILD: last release inadvertently prepended a "+" in front of the date - BUG/MEDIUM: stream-int: fix the keep-alive idle connection handler - BUG/MEDIUM: backend: do not re-initialize the connection's context upon reuse - BUG: Revert "OPTIM/MEDIUM: epoll: fuse active events into polled ones during polling changes" - BUG/MINOR: checks: successful check completion must not re-enable MAINT servers - MINOR: http: try to stick to same server after status 401/407 - BUG/MINOR: http: always disable compression on HTTP/1.0 - OPTIM: poll: restore polling after a poll/stop/want sequence - OPTIM: http: don't stop polling for read on the client side after a request - BUG/MEDIUM: checks: unchecked servers could not be enabled anymore - BUG/MEDIUM: stats: the web interface must check the tracked servers before enabling - BUG/MINOR: channel: CHN_INFINITE_FORWARD must be unsigned - BUG/MINOR: stream-int: do not clear the owner upon unregister - MEDIUM: stats: add support for HTTP keep-alive on the stats page - BUG/MEDIUM: stats: fix HTTP/1.0 breakage introduced in previous patch - Revert "MEDIUM: stats: add support for HTTP keep-alive on the stats page" - MAJOR: channel: add a new flag CF_WAKE_WRITE to notify the task of writes - OPTIM: session: set the READ_DONTWAIT flag when connecting - BUG/MINOR: http: don't clear the SI_FL_DONT_WAKE flag between requests - MINOR: session: factor out the connect time measurement - MEDIUM: session: prepare to support earlier transitions to the established state - MEDIUM: stream-int: make si_connect() return an established state when possible - MINOR: checks: use an inline function for health_adjust() - OPTIM: session: put unlikely() around the freewheeling code - MEDIUM: config: report a warning when multiple servers have the same name - BUG: Revert "OPTIM: poll: restore polling after a poll/stop/want sequence" - BUILD/MINOR: listener: remove a glibc warning on accept4() - BUG/MAJOR: connection: fix mismatch between rcv_buf's API and usage - BUILD: listener: fix recent accept4() again - BUG/MAJOR: ssl: fix breakage caused by recent fix abf08d9 - BUG/MEDIUM: polling: ensure we update FD status when there's no more activity - MEDIUM: listener: fix polling management in the accept loop - MINOR: protocol: improve the proto->drain() API - MINOR: connection: add a new conn_drain() function - MEDIUM: tcp: report in tcp_drain() that lingering is already disabled on close - MEDIUM: connection: update callers of ctrl->drain() to use conn_drain() - MINOR: connection: add more error codes to report connection errors - MEDIUM: tcp: report connection error at the connection level - MEDIUM: checks: make use of chk_report_conn_err() for connection errors - BUG/MEDIUM: unique_id: HTTP request counter is not stable - DOC: fix misleading information about SIGQUIT - BUG/MAJOR: fix freezes during compression - BUG/MEDIUM: stream-interface: don't wake the task up before end of transfer - BUILD: fix VERDATE exclusion regex - CLEANUP: polling: rename "spec_e" to "state" - DOC: add a diagram showing polling state transitions - REORG: polling: rename "spec_e" to "state" and "spec_p" to "cache" - REORG: polling: rename "fd_spec" to "fd_cache" - REORG: polling: rename the cache allocation functions - REORG: polling: rename "fd_process_spec_events()" to "fd_process_cached_events()" - MAJOR: polling: rework the whole polling system - MAJOR: connection: remove the CO_FL_WAIT_{RD,WR} flags - MEDIUM: connection: remove conn_{data,sock}_poll_{recv,send} - MEDIUM: connection: add check for readiness in I/O handlers - MEDIUM: stream-interface: the polling flags must always be updated in chk_snd_conn - MINOR: stream-interface: no need to call fd_stop_both() on error - MEDIUM: connection: no need to recheck FD state - CLEANUP: connection: use conn_ctrl_ready() instead of checking the flag - CLEANUP: connection: use conn_xprt_ready() instead of checking the flag - CLEANUP: connection: fix comments in connection.h to reflect new behaviour. - OPTIM: raw-sock: don't speculate after a short read if polling is enabled - MEDIUM: polling: centralize polled events processing - MINOR: polling: create function fd_compute_new_polled_status() - MINOR: cli: add more information to the "show info" output - MEDIUM: listener: add support for limiting the session rate in addition to the connection rate - MEDIUM: listener: apply a limit on the session rate submitted to SSL - REORG: stats: move the stats socket states to dumpstats.c - MINOR: cli: add the new "show pools" command - BUG/MEDIUM: counters: flush content counters after each request - BUG/MEDIUM: counters: fix stick-table entry leak when using track-sc2 in connection - MINOR: tools: add very basic support for composite pointers - MEDIUM: counters: stop relying on session flags at all - BUG/MINOR: cli: fix missing break in command line parser - BUG/MINOR: config: correctly report when log-format headers require HTTP mode - MAJOR: http: update connection mode configuration - MEDIUM: http: make keep-alive + httpclose be passive mode - MAJOR: http: switch to keep-alive mode by default - BUG/MEDIUM: http: fix regression caused by recent switch to keep-alive by default - BUG/MEDIUM: listener: improve detection of non-working accept4() - BUILD: listener: add fcntl.h and unistd.h - BUG/MINOR: raw_sock: correctly set the MSG_MORE flag