HAProxy 1.8.4 was released on 2018/02/08. It added 51 new commits
after version 1.8.3.
There are no very important issue fixed in this version but a number
of small and annoying ones. Overall I'd say that it's quite good and
it can start to make sense to try it for those who hesitated or were
waiting for the initial stability issues to be addressed.
One of the main changes touches the polling system in threaded mode.
While we started with a unified poller when using kqueue and epoll, it
appears that it wasn't the best idea because some threads cannot sleep
due to the activity of others, especially when these other ones are
dealing with long processing (eg: SSL). So we had to change this to
have a per-thread poller and to change the way the polling updates are
propagated down the layers. This possibly seems a bit scary like this
(and it would have scared me as well) but in the end the changes are
not that big and better match the way it works for a single thread.
Thanks to this change we don't face anymore the situation where all
threads suddenly go to 100% because only one is heavily loaded. This
sensitive change also explains the time it took for 1.8.4 to be issued.
The usual lot of master-worker small fixes is present, but the last ones
were very cosmetic (doc updates) so I think we're getting something
I must say that I'm currently very satisfied with the way issues are
reported and addressed.
I know that some issues remain and are currently being investigated :
- problem with the cache reported by Pierre Cheynier whereby using
certain sample fetches like "path_end" in an ACL to decide to
cache or not could cause some cache corruption ; let's try to
narrow it down before giving conclusions.
- http-send-name-header apparently struck again, though I failed to
reproduce the problem. It might be an old one that manifests in a
very special situation or time frame.
- several H2 minor issues (DATA padding incorrectly accounted for in
the connection window, DATA frames for closed streams not properly
accounted, RST sometimes in response to an RST). None of them has
a real visible impact in practice so I preferred to issue 1.8.4
first to address the pending issues.
Overall nothing terrible, and we can issue 1.8.5 once these ones are
figured and addressed (and by then we'll get new ones).
To make a long story short, if you're using threads, master-worker,
SPOE or any version before 1.8.3, you should definitely update to avoid
facing already fixed issues. If you're already on 1.8.3 without any of
these features, well, have a look at the changelog below but in general
I'd say there's no emergency for you to update.
Please find the usual URLs below :
Site index : http://www.haproxy.org/
Discourse : http://discourse.haproxy.org/
Sources : http://www.haproxy.org/download/1.8/src/
Git repository : http://git.haproxy.org/git/haproxy-1.8.git/
Git Web browsing : http://git.haproxy.org/?p=haproxy-1.8.git
Changelog : http://www.haproxy.org/download/1.8/src/CHANGELOG
Cyril's HTML doc : http://cbonte.github.io/haproxy-dconv/
Complete changelog :
Chris Lane (1):
MINOR: init: emit warning when -sf/-sd cannot parse argument
Christopher Faulet (11):
MINOR: threads/fd: Use a bitfield to know if there are FDs for a thread
in the FD cache
BUG/MEDIUM: threads/polling: Use fd_cache_mask instead of fd_cache_num
BUG/MEDIUM: threads/server: Fix deadlock in
BUG/MEDIUM: checks: Don't try to release undefined conn_stream when a
check is freed
BUG/MINOR: kqueue/threads: Don't forget to close kqueue_fd[tid] on each
MINOR: threads: Use __decl_hathreads instead of #ifdef/#endif
BUILD: epoll/threads: Add test on MAX_THREADS to avoid warnings when
complied without threads
BUILD: kqueue/threads: Add test on MAX_THREADS to avoid warnings when
complied without threads
BUG/MINOR: threads: Update labels array because of changes in lock_label
BUG/MEDIUM: spoe: Always try to receive or send the frame to detect
BUG/MEDIUM: spoe: Allow producer to read and to forward shutdown on
David Carlier (1):
BUILD/MINOR: ancient gcc versions atomic fix
Emeric Brun (1):
BUG/MEDIUM: peers: fix expire date wasn't updated if entry is modified
Jérôme Magnin (2):
DOC: clarify the scope of ssl_fc_is_resumed
DOC: Describe routing impact of using interface keyword on bind lines
Olivier Houchard (3):
MINOR: dns: Handle SRV record weight correctly.
MINOR: servers: Don't report duplicate dyncookies for disabled servers.
MINOR: threads: Fix build when we're not compiling with threads.
Pavlos Parissis (1):
DOC: Mention -Ws in the list of available options
Tim Duesterhus (9):
BUG/MINOR: lua: Fix default value for pattern in Socket.receive
DOC: lua: Fix typos in comments of hlua_socket_receive
BUG/MEDIUM: lua: Fix IPv6 with separate port support for Socket.connect
BUG/MINOR: lua: Fix return value of Socket.settimeout
CLEANUP: sample: Fix comment encoding of sample.c
CLEANUP: sample: Fix outdated comment about sample casts functions
BUG/MINOR: sample: Fix output type of c_ipv62ip
CLEANUP: Fix typo in ARGT_MSK6 comment
BUG/MEDIUM: standard: Fix memory leak in str2ip2()
William Lallemand (2):
BUG/MEDIUM: ssl: cache doesn't release shctx blocks
BUG/MEDIUM: mworker: execvp failure depending on argv
Willy Tarreau (20):
BUG/MEDIUM: h2: properly handle the END_STREAM flag on empty DATA frames
BUILD: ssl: silence a warning when building without NPN nor ALPN support
MINOR: hathreads: add support for gcc < 4.7
BUG/MEDIUM: stream: properly handle client aborts during redispatch
CONTRIB: debug: fix a few flags definitions
BUG/MINOR: poll: too large size allocation for FD events
MINOR: global/threads: move cpu_map at the end of the global struct
MINOR: threads: add a MAX_THREADS define instead of LONGBITS
MINOR: global: add some global activity counters to help debugging
BUG/MEDIUM: fd: maintain a per-thread update mask
MINOR: fd: add a bitmask to indicate that an FD is known by the poller
BUG/MEDIUM: epoll/threads: use one epoll_fd per thread
BUG/MEDIUM: kqueue/threads: use one kqueue_fd per thread
BUG/MEDIUM: threads/mworker: fix a race on startup
BUG/MINOR: mworker: only write to pidfile if it exists
BUG/MINOR: threads: always set an owner to the thread_sync pipe
BUG/MINOR: cli: use global.maxsock and not maxfd to list all FDs
BUG/MINOR: epoll/threads: only call epoll_ctl(DEL) on polled FDs
BUG/MINOR: time/threads: ensure the adjusted time is always correct
BUG/MINOR: config: don't emit a warning when global stats is incompletely