Hi, 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 solid now. 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/ Willy --- 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 srv_set_stopping/srv_set_admin_flag 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 thread 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 enum BUG/MEDIUM: spoe: Always try to receive or send the frame to detect shutdowns BUG/MEDIUM: spoe: Allow producer to read and to forward shutdown on request side 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 remotely. 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[0] 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 configured ---