Hi,
HAProxy 2.1-dev3 was released on 2019/10/25. It added 155 new commits
after version 2.1-dev2.
It's two weeks later than initially expected due to being diverted by bugs
but the main point is that we're converging towards something better :-)
So now we've finally merged the tail of pending features. There are still
some rough edges but these ones will be progressively addressed in the
upcoming weeks.
The last user-visible changes since 2.1-dev2 include :
- SSL: refactoring of how certificates are loaded and indexed in memory
so that they're loaded only once each even if referenced on multiple
bind lines (CPU and memory savings), and ability to update them from
the CLI ("set ssl cert"), as well as OCSP/issuer/SCTL etc. There are
still a few limitations, I think certain corner cases are not supported
(yet) but I can't tell what so I'll rather shut up. At least it's a
great improvement because certs updates were one reason for some users
to reload often, and these ones were experiencing long reload operations
due to a massive amount of certs.
- H1/H2: properly handle authority and scheme. When H2 was implemented
on top of H1, H2 requests were turned to H1 requests in "origin form"
(i.e. GET /path/to/file + Host header). But H2 agents are encouraged
to use absolute form (GET https://authority/path/to/file) which they
do. Our conversion always used the origin form, which resulted in the
loss of the scheme on end-to-end transfers, and a loss of
representation if using H2 to convery H1 requests. Now that HTX is the
only internal representation, it was possible to maintain the request
in its original form (typically absolute for H2 and origin for H1) and
preserve all elements end-to-end. One visible effect though is that
logs will now show "GET https://authority/path" instead of "GET /path"
since the URI really is this. Some will find this better, others may be
annoyed but it's still possible to change the format if desired. What
matters is that we do not denaturate requests anymore.
- the cache can now cache requests for absolute URIs as well, as a
byproduct of having to support these for H2.
- HTX: we now maintain the authority and the host synchronized when using
set-uri or when touching the Host header. In addition, requests with
conflicting Host/authority are now rejected as required by the standards.
- H1/FCGI: implement traces just like in H2, this can be used to provide
detailed captures of issues to developers, or just for you to observe the
traffic.
- H2: add the ability to emit CONTINUATION frames for too large headers
or trailers to fit into a single frame. This was needed in environments
where more than 16kB of headers need to be sent to a client. So now our
support for CONTINUATION is complete, we can both receive and send large
header blocks. Note that this part is easy to backport and might at some
point be backported into 2.0 if there is demand for it.
- HTTP: http-send-name-header would previously not remove any existing
occurrence of the header in HTX mode, this is now done so that it behaves
exactly like in old legacy mode.
- H1: smarter handler of internally generated responses (mostly errorfiles)
which now support keep-alive when the messages are properly formatted.
- stats: the new output modifier "desc" to "show info" and "show stat" will
provide a short description of the meaning of each metric. This is an
attempt at saving a few monthly hours of sleep to a number of admins :-)
- build: threads and CPU affinity are now enabled on OSX.
Performance improvements:
- the scheduler now uses a combination of a locked and a lockfree list to
regain 5-10% performance on workloads involving high connection rates.
Debugging:
- the "debug dev" commands that were only available when building with
-DDEBUG_DEV are now always built-in, but only shown and available when
the CLI is in "expert-mode". These are sometimes needed by developers
to extract some extra information about a sick session, or to perform
fault injection. Do not try to use them in production without being
invited to do so, you'll very likely crash your process before you
understand what you did.
- more prominent version strings: among the difficulties faced when
analyzing a core for a very strange issue, there is the permanent doubt
about whether or not the core file was really issued from the reported
version. The version string used to be built as a constant and as such
did not appear in core files. Now it's copied into a variable so that
it is as simple as running "strings core | fgrep -A2 'HAProxy version'"
to see the exact version string.
And roughly 50 bugs were addressed since -dev2, many of which were already
backported into 2.0.8.
We've noticed that a few issues that are still being worked on :
- problems with how connection errors are reported on the backend side
when several streams are multiplexed: only one of them can be retried
at the moment and some issues look a bit dirty. Some of these will also
affect 2.0 and 1.9 to some extents.
- there's still a known minor issue by which if you trigger an error on
the CLI with the new "set ssl cert" command, the lock remains held and
you won't be able to update again.
>From now on it's important to stick to fixes only if we want to have a chance
to release something in good shape before the end of next month. Trivially
valid improvements can be merged into the -next branch but submissions which
require review take time and distract bug fixing, so please all be nice with
developers and focus on current code's correctness only.
I'd also like to kindly remind all subsystem maintainers (i.e. all those
listed in the MAINTAINERS file) to devote some time to quickly verify that
nothing broke in their areas before the release. Raising an issue early so
that everyone is aware is often more desirable than a late report with a
fix :-)
I'd like to emit one version per week now till the release, though I'm not
sure I'll manage to sustain the rhythm with the HAProxyConf arriving quickly
(November 12th and 13th). We'll see :-)
Please find the usual URLs below :
Site index : http://www.haproxy.org/
Discourse : http://discourse.haproxy.org/
Slack channel : https://slack.haproxy.org/
Issue tracker : https://github.com/haproxy/haproxy/issues
Sources : http://www.haproxy.org/download/2.1/src/
Git repository : http://git.haproxy.org/git/haproxy.git/
Git Web browsing : http://git.haproxy.org/?p=haproxy.git
Changelog : http://www.haproxy.org/download/2.1/src/CHANGELOG
Cyril's HTML doc : http://cbonte.github.io/haproxy-dconv/
Willy
---
Complete changelog :
Baptiste Assmann (1):
BUG/MINOR: dns: allow srv record weight set to 0
Christopher Faulet (33):
BUG/MINOR: mux-h2/trace: Fix traces on h2c initialization
MINOR: h1-htx: Update h1_copy_msg_data() to ease the traces in the mux-h1
MINOR: htx: Adapt htx_dump() to be used from traces
MINOR: mux-h1/trace: register a new trace source with its events
MINOR: proxy: Store http-send-name-header in lower case
MINOR: http: Remove headers matching the name of http-send-name-header
option
BUG/MINOR: mux-h1: Adjust header case when the server name is add to a
request
BUG/MINOR: mux-h1: Adjust header case when chunked encoding is add to a
message
MINOR: mux-h1: Try to wakeup the stream on output buffer allocation
MINOR: fcgi: Add function to get the string representation of a record
type
MINOR: mux-fcgi/trace: Register a new trace source with its events
BUG/MINOR: mux-h1/mux-fcgi/trace: Fix position of the 4th arg in some
traces
MINOR: htx: Add 2 flags on the start-line to have more info about the uri
MINOR: http: Add a function to get the authority into a URI
MINOR: h1-htx: Set the flag HTX_SL_F_HAS_AUTHORITY during the request
parsing
MEDIUM: http-htx: Keep the Host header and the request start-line
synchronized
MINOR: h1-htx: Only use the path of a normalized URI to format a request
line
BUG/MEDIUM: htx: Catch chunk_memcat() failures when HTX data are
formatted to h1
BUG/MINOR: chunk: Fix tests on the chunk size in functions copying data
BUG/MINOR: mux-h1: Mark the output buffer as full when the xfer is
interrupted
MINOR: mux-h1: Xfer as much payload data as possible during output
processing
CLEANUP: h1-htx: Move htx-to-h1 formatting functions from htx.c to
h1_htx.c
BUG/MINOR: mux-h1: Capture ignored parsing errors
MINOR: h1: Reject requests with different occurrences of the header host
MINOR: h1: Reject requests if the authority does not match the header host
REGTESTS: Send valid URIs in peers reg-tests and fix HA config to avoid
warnings
REGTESTS: Adapt proxy_protocol_random_fail.vtc to match normalized URI too
BUG/MINOR: http-htx: Properly set htx flags on error files to support
keep-alive
MINOR: htx: Add a flag on HTX to known when a response was generated by
HAProxy
MINOR: mux-h1: Force close mode for proxy responses with an unfinished
request
BUG/MINOR: tcp: Don't alter counters returned by tcp info fetchers
BUG/MINOR: ssl: Fix fd leak on error path when a TLS ticket keys file is
parsed
BUG/MINOR: stick-table: Never exceed (MAX_SESS_STKCTR-1) when fetching a
stkctr
David Carlier (3):
BUILD/MEDIUM: threads: rename thread_info struct to ha_thread_info
BUILD/SMALL: threads: enable threads on osx
BUILD/MEDIUM: threads: enable cpu_affinity on osx
Emeric Brun (7):
CLEANUP: ssl: make cli_parse_set_cert handle errcode and warnings.
CLEANUP: ssl: make ckch_inst_new_load_(multi_)store handle errcode/warn
CLEANUP: ssl: make ssl_sock_put_ckch_into_ctx handle errcode/warn
CLEANUP: ssl: make ssl_sock_load_dh_params handle errcode/warn
CLEANUP: bind: handle warning label on bind keywords parsing.
BUG/MEDIUM: ssl: 'tune.ssl.default-dh-param' value ignored with openssl >
1.1.1
BUG/MINOR: ssl: fix memcpy overlap without consequences.
Frédéric Lécaille (1):
BUG/MINOR: peers: crash on reload without local peer.
Miroslav Zagorac (1):
BUG/MINOR: WURFL: fix send_log() function arguments
Olivier Houchard (10):
BUG/MEDIUM: tasks: Don't forget to decrement tasks_run_queue.
MEDIUM: task: Split the tasklet list into two lists.
MINOR: h2: Document traps to be avoided on multithread.
MINOR: lists: Try to use local variables instead of macro arguments.
MINOR: lists: Fix alignement of \ when relevant.
BUG/MEDIUM: lists: Handle 1-element-lists in MT_LIST_BEHEAD().
BUG/MEDIUM: mux_pt: Make sure we don't have a conn_stream before freeing.
Revert e8826ded5fea3593d89da2be5c2d81c522070995.
BUG/MEDIUM: mux_pt: Don't destroy the connection if we have a stream
attached.
BUG/MEDIUM: mux_pt: Only call the wake emthod if nobody subscribed to
receive.
Rick Rackow (1):
DOC: fix typo in Prometheus exporter doc
Tim Duesterhus (1):
BUG/MINOR: sample: Make the `field` converter compatible with `-m found`
Vedran Furac (1):
BUG/MINOR: server: check return value of fopen() in apply_server_state()
William Dauchy (1):
MINOR: tcp: avoid confusion in time parsing init
William Lallemand (45):
MINOR: ssl: crt-list do ckchn_lookup
REORG: ssl: rename ckch_node to ckch_store
REORG: ssl: move structures to ssl_sock.h
MINOR: ssl: initialize the sni_keytypes_map as EB_ROOT
MINOR: ssl: initialize explicitly the sni_ctx trees
BUG/MINOR: ssl: abort on sni allocation failure
BUG/MINOR: ssl: free the sni_keytype nodes
BUG/MINOR: ssl: abort on sni_keytypes allocation failure
MEDIUM: ssl: introduce the ckch instance structure
MEDIUM: ssl: split ssl_sock_add_cert_sni()
MINOR: ssl: ssl_sock_load_ckchn() can properly fail
MINOR: ssl: ssl_sock_load_multi_ckchs() can properly fail
MEDIUM: ssl: ssl_sock_load_ckchs() alloc a ckch_inst
MINOR: ssl: ssl_sock_load_crt_file_into_ckch() is filling from a BIO
MEDIUM: ssl/cli: 'set ssl cert' updates a certificate from the CLI
MINOR: ssl: load the sctl in/from the ckch
MINOR: ssl: load the ocsp in/from the ckch
BUG/MEDIUM: ssl: NULL dereference in ssl_sock_load_cert_sni()
BUG/MINOR: ssl: fix build without SSL
BUG/MINOR: ssl: fix build without multi-cert bundles
BUILD: ssl: wrong #ifdef for SSL engines code
BUG/MINOR: ssl: fix OCSP build with BoringSSL
BUG/MINOR: ssl: fix error messages for OCSP loading
BUG/MINOR: ssl: can't load ocsp files
BUG/MINOR: mworker/ssl: close openssl FDs unconditionally
REGTEST: mcli/mcli_show_info: launch a 'show info' on the master CLI
BUG/MINOR: mworker/cli: reload fail with inherited FD
BUG/MINOR: cache: alloc shctx after check config
CLEANUP: ssl: remove old TODO commentary
CLEANUP: ssl: fix SNI/CKCH lock labels
MINOR: ssl: OCSP functions can load from file or buffer
MINOR: ssl: load sctl from buf OR from a file
MINOR: ssl: load issuer from file or from buffer
MINOR: ssl: split ssl_sock_load_crt_file_into_ckch()
BUG/MINOR: ssl/cli: fix looking up for a bundle
MINOR: ssl/cli: update ocsp/issuer/sctl file from the CLI
MINOR: ssl: update ssl_sock_free_cert_key_and_chain_contents
MINOR: ssl: copy a ckch from src to dst
MINOR: ssl: new functions duplicate and free a ckch_store
MINOR: ssl/cli: assignate a new ckch_store
MEDIUM: cli/ssl: handle the creation of SSL_CTX in an IO handler
BUG/MINOR: ssl/cli: fix build of SCTL and OCSP
BUG/MINOR: ssl/cli: out of bounds when built without ocsp/sctl
BUG/MINOR: ssl: fix build with openssl < 1.1.0
BUG/MINOR: ssl: fix build of X509_chain_up_ref() w/ libreSSL
Willy Tarreau (50):
MINOR: mux-h2/trace: missing conn pointer in demux full message
MINOR: mux-h2: add a per-connection list of blocked streams
BUILD: ebtree: make eb_is_empty() and eb_is_dup() take a const
BUG/MEDIUM: mux-h2: do not enforce timeout on long connections
BUG/MEDIUM: cache: make sure not to cache requests with absolute-uri
DOC: clarify some points around http-send-name-header's behavior
MEDIUM: mux-h2: support emitting CONTINUATION frames after HEADERS
MINOR: h2: clarify the rules for how to convert an H2 request to HTX
MEDIUM: h2: make the request parser rebuild a complete URI
MINOR: h2: report in the HTX flags when the request has an authority
MEDIUM: mux-h2: do not map Host to :authority on output
MEDIUM: h2: use the normalized URI encoding for absolute form requests
MINOR: stats: mention in the help message support for "json" and "typed"
MINOR: stats: get rid of the ST_CONVDONE flag
MINOR: stats: replace the ST_* uri_auth flags with STAT_*
MINOR: stats: always merge the uri_auth flags into the appctx flags
MINOR: stats: set the appctx flags when initializing the applet only
MINOR: stats: get rid of the STAT_SHOWADMIN flag
MINOR: stats: make stats_dump_fields_json() directly take flags
MINOR: stats: uniformize the calling convention of the dump functions
MINOR: stats: support the "desc" output format modifier for info and stat
MINOR: stats: prepare to add a description with each stat/info field
MINOR: stats: make "show stat" and "show info"
MINOR: stats: fill all the descriptions for "show info" and "show stat"
BUG/MEDIUM: applet: always check a fast running applet's activity before
killing
BUILD: stats: fix missing '=' sign in array declaration
MINOR: lists: add new macro LIST_SPLICE_END_DETACHED
MINOR: list: add new macro MT_LIST_BEHEAD
MINOR: mux-h2: also support emitting CONTINUATION on trailers
MINOR: version: make the version strings variables, not constants
BUILD: travis-ci: limit build to branches "master" and "next"
MINOR: istbuf: add b_fromist() to make a buffer from an ist
BUG/MINOR: cache: also cache absolute URIs
BUG/MEDIUM: tasklet: properly compute the sleeping threads mask in
tasklet_wakeup()
BUG/MAJOR: idle conns: schedule the cleanup task on the correct threads
BUG/MEDIUM: task: make tasklets either local or shared but not both at
once
CLEANUP: ssl: make ssl_sock_load_cert*() return real error codes
CLEANUP: ssl: make ssl_sock_load_ckchs() return a set of ERR_*
REGTESTS: make seamless-reload depend on 1.9 and above
REGTESTS: server/cli_set_fqdn requires version 1.8 minimum
BUG/MINOR: stick-table: fix an incorrect 32 to 64 bit key conversion
BUG/MEDIUM: pattern: make the pattern LRU cache thread-local and lockless
BUG/MINOR: mux-h2: do not emit logs on backend connections
MINOR: debug: add a new "debug dev stream" command
MINOR: cli/debug: validate addresses using may_access() in "debug dev
stream"
REORG: move CLI access level definitions to cli.h
MINOR: cli: add an expert mode to hide dangerous commands
MINOR: debug: make most debug CLI commands accessible in expert mode
MINOR: stats/debug: maintain a counter of debug commands issued
BUG/MEDIUM: debug: address a possible null pointer dereference in "debug
dev stream"
---