haproxy/src
Willy Tarreau d7a6b2f742 BUG/MINOR: soft-stop: always wake up waiting threads on stopping
Currently the soft-stop can lead to old processes remaining alive for as
long as two seconds after receiving a soft-stop signal. What happens is
that when receiving SIGUSR1, one thread (usually the first one) wakes up,
handles the signal, sets "stopping", goes into runn_poll_loop(), and
discovers that stopping is set, so its also sets itself in the
stopping_thread_mask bit mask. After this it sees that other threads are
not yet willing to stop, so it continues to wait.

From there, other threads which were waiting in poll() expire after one
second on poll timeout and enter run_poll_loop() in turn. That's already
one second of wait time. They discover each in turn that they're stopping
and see that other threads are not yet stopping, so they go back waiting.

After the end of the first second, all threads know they're stopping and
have set their bit in stopping_thread_mask. It's only now that those who
started to wait first wake up again on timeout to discover that all other
ones are stopping, and can now quit. One second later all threads will
have done it and the process will quit.

This is effectively strictly larger than one second and up to two seconds.

What the current patch does is simple, when the first thread stops, it sets
its own bit into stopping_thread_mask then wakes up all other threads to do
also set theirs. This kills the first second which corresponds to the time
to discover the stopping state. Second, when a thread exists, it wakes all
other ones again because some might have gone back sleeping waiting for
"jobs" to go down to zero (i.e. closing the last connection). This kills
the last second of wait time.

Thanks to this, as SIGUSR1 now acts instantly again if there's no active
connection, or it stops immediately after the last connection has left if
one was still present.

This should be backported as far as 2.0.
2020-05-13 14:11:18 +02:00
..
51d.c BUG/MINOR: 51d: Fix HTX message prefetch 2020-05-05 11:53:43 +02:00
acl.c CLEANUP: assorted typo fixes in the code and comments 2020-04-02 16:25:45 +02:00
action.c MINOR: tcp-rules: Make tcp-request capture a custom action 2020-01-20 15:18:45 +01:00
activity.c CLEANUP: cli: replace all occurrences of manual handling of return messages 2019-08-09 11:26:10 +02:00
applet.c BUG/MEDIUM: applet: always check a fast running applet's activity before killing 2019-10-11 16:05:57 +02:00
arg.c BUG/MINOR: arg: don't reject missing optional args 2020-02-28 16:41:29 +01:00
auth.c BUILD/MINOR: auth: enabling for osx 2019-09-08 12:20:13 +02:00
backend.c MINOR: checks/sample: Remove unnecessary tests on the sample session 2020-05-06 12:44:46 +02:00
base64.c BUG/MINOR: base64: dec func ignores padding for output size checking 2019-01-14 19:32:15 +01:00
buffer.c BUG/MINOR: buffers: MT_LIST_DEL_SAFE() expects the temporary pointer. 2020-03-10 17:44:40 +01:00
cache.c CLEANUP: assorted typo fixes in the code and comments 2020-04-02 16:25:45 +02:00
calltrace.c REORG: trace: rename trace.c to calltrace.c and mention it's not thread-safe 2019-08-22 20:21:00 +02:00
cfgparse-global.c MINOR: init: add -dW and "zero-warning" to reject configs with warnings 2020-04-15 16:42:39 +02:00
cfgparse-listen.c MAJOR: checks: Implement HTTP check using tcp-check rules 2020-04-27 09:39:38 +02:00
cfgparse.c MINOR: cfgparse: Improve error message for invalid \x sequences 2020-05-07 22:46:26 +02:00
channel.c BUG/MINOR: channel: inject output data at the end of output 2020-01-07 10:51:15 +01:00
checks.c BUG/MEDIUM: checks: Subscribe to I/O events only if a mux was installed 2020-05-12 15:05:47 +02:00
chunk.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
cli.c CLEANUP: assorted typo fixes in the code and comments 2020-04-16 10:04:36 +02:00
compression.c MINOR: time: move the cpu, mono, and idle time to thread_info 2019-05-20 21:14:14 +02:00
connection.c MAJOR: checks: Use the best mux depending on the protocol for health checks 2020-04-27 10:41:07 +02:00
da.c BUG/MINOR: da: Fix HTX message prefetch 2020-05-05 11:50:14 +02:00
debug.c BUG/MINOR: debug: properly use long long instead of long for the thread ID 2020-05-01 12:26:03 +02:00
dict.c BUG/MINOR: dict: race condition fix when inserting dictionary entries. 2019-06-11 09:54:12 +02:00
dns.c BUG/MEDIUM: dns: Consider the fact that dns answers are case-insensitive 2020-04-01 18:35:05 +02:00
ev_epoll.c CLEANUP: remove support for USE_MY_EPOLL 2020-03-10 07:08:10 +01:00
ev_evports.c CLEANUP: assorted typo fixes in the code and comments 2020-03-31 17:09:35 +02:00
ev_kqueue.c BUILD: remove obsolete support for -mregparm / USE_REGPARM 2020-02-25 07:41:47 +01:00
ev_poll.c BUG/MINOR: pollers: remove uneeded free in global init 2020-05-13 11:45:37 +02:00
ev_select.c CLEANUP: select: enhance readability in init 2020-05-13 11:52:30 +02:00
fcgi-app.c CLEANUP: Use isttest() and istfree() 2020-03-05 19:52:07 +01:00
fcgi.c BUILD: general: always pass unsigned chars to is* functions 2020-02-25 08:16:33 +01:00
fd.c CLEANUP: src/fd.c: mask setsockopt with DISGUISE 2020-04-02 15:10:17 +02:00
filters.c BUG/MINOR: filters: Forward everything if no data filters are called 2020-03-06 14:12:59 +01:00
flt_http_comp.c MINOR: compression/filters: Initialize the comp filter when stream is created 2020-03-06 15:36:04 +01:00
flt_spoe.c CLEANUP: assorted typo fixes in the code and comments 2020-04-02 16:25:45 +02:00
flt_trace.c BUG/MEDIUM: random: implement a thread-safe and process-safe PRNG 2020-03-08 10:09:02 +01:00
freq_ctr.c BUG/MAJOR: threads/freq_ctr: use a memory barrier to detect changes 2017-10-31 18:01:18 +01:00
frontend.c MINOR: use DISGUISE() everywhere we deliberately want to ignore a result 2020-03-14 11:04:49 +01:00
h1.c BUG/MEDIUM: h1: Don't compare host and authority if only h1 headers are parsed 2020-05-04 09:27:01 +02:00
h1_htx.c MEDIUM: h1-htx: Add HTX EOM block when the message is in H1_MSG_DONE state 2019-12-11 16:46:16 +01:00
h2.c CLEANUP: assorted typo fixes in the code and comments 2020-04-02 16:25:45 +02:00
haproxy.c BUG/MINOR: soft-stop: always wake up waiting threads on stopping 2020-05-13 14:11:18 +02:00
hash.c BUG/MAJOR: hashes: fix the signedness of the hash inputs 2020-01-16 08:23:42 +01:00
hathreads.c BUILD/MEDIUM: threads: rename thread_info struct to ha_thread_info 2019-10-17 07:15:17 +02:00
hlua.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
hlua_fcn.c BUG/MEDIUM: lua: Fix dumping of stick table entries for STD_T_DICT 2020-05-07 15:51:36 +02:00
hpack-dec.c CLEANUP: Use isttest() and istfree() 2020-03-05 19:52:07 +01:00
hpack-enc.c BUILD: use inttypes.h instead of stdint.h 2019-04-01 07:44:56 +02:00
hpack-huff.c BUILD: use inttypes.h instead of stdint.h 2019-04-01 07:44:56 +02:00
hpack-tbl.c BUG/CRITICAL: hpack: never index a header into the headroom after wrapping 2020-04-02 08:45:54 +02:00
http.c MINOR: ist: Add IST_NULL macro 2020-03-05 19:52:07 +01:00
http_acl.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
http_act.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
http_ana.c BUG/MEDIUM: http_ana: make the detection of NTLM variants safer 2020-05-07 19:41:12 +02:00
http_conv.c BUG/MEDIUM: capture: capture-req/capture-res converters crash without a stream 2020-04-29 11:29:17 +02:00
http_fetch.c MINOR: checks/sample: Remove unnecessary tests on the sample session 2020-05-06 12:44:46 +02:00
http_htx.c MINOR: http-htx: Support different methods to look for header names 2020-05-05 11:07:00 +02:00
http_rules.c MEDIUM: http: Add a ruleset evaluated on all responses just before forwarding 2020-02-06 14:55:34 +01:00
htx.c MINOR: htx: Use htx_find_offset() to truncate an HTX message 2020-03-06 14:12:59 +01:00
lb_chash.c BUG/MEDIUM: lb-chash: Ensure the tree integrity when server weight is increased 2019-08-01 11:35:29 +02:00
lb_fas.c BUG/MEDIUM: lb_fas: Don't test the server's lb_tree from outside the lock 2019-07-05 14:26:15 +02:00
lb_fwlc.c BUG/MINOR: lb/leastconn: ignore the server weights for empty servers 2019-09-06 17:13:44 +02:00
lb_fwrr.c BUG/MAJOR: lb/threads: make sure the avoided server is not full on second pass 2019-05-27 10:29:59 +02:00
lb_map.c CLEANUP: assorted typo fixes in the code and comments 2020-04-02 16:25:45 +02:00
listener.c BUG/MEDIUM: listener: mark the thread as not stuck inside the loop 2020-05-01 11:41:36 +02:00
log.c MINOR: log: Add "Tu" timer 2020-04-28 16:30:13 +02:00
lru.c MINOR: lru: new function to delete <nb> least recently used keys 2016-01-11 07:31:35 +01:00
mailers.c MEDIUM: Add parsing of mailers section 2015-02-03 00:24:16 +01:00
map.c CLEANUP: cli: replace all occurrences of manual handling of return messages 2019-08-09 11:26:10 +02:00
memory.c BUG/MINOR: pools: use %u not %d to report pool stats in "show pools" 2020-05-13 10:10:54 +02:00
mux_fcgi.c BUG/MEDIUM: mux-fcgi: Fix wrong test on FCGI_CF_KEEP_CONN in fcgi_detach() 2020-05-02 09:37:03 +02:00
mux_h1.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
mux_h2.c MINOR: muxes: Note that we can't usee a connection when added to the srv idle. 2020-03-22 23:25:51 +01:00
mux_pt.c MINOR: mux_pt: Don't try to remove the connection from the idle list. 2020-03-17 13:38:18 +01:00
mworker-prog.c MEDIUM: mworker-prog: Add user/group options to program section 2019-07-15 16:43:16 +02:00
mworker.c MINOR: mworker: replace ha_alert by ha_warning when exiting successfuly 2020-05-06 17:27:03 +02:00
namespace.c BUG/MINOR: namespace: avoid closing fd when socket failed in my_socketat 2020-02-14 04:23:08 +01:00
pattern.c BUG/MINOR: pattern: Do not pass len = 0 to calloc() 2020-03-18 05:17:28 +01:00
payload.c MINOR: checks/sample: Remove unnecessary tests on the sample session 2020-05-06 12:44:46 +02:00
peers.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
pipe.c BUG/MEDIUM: pipe/thread: fix atomicity of pipe counters 2020-01-30 09:15:37 +01:00
proto_sockpair.c MINOR: tcp/uxst/sockpair: only ask for I/O when really waiting for a connect() 2020-03-04 19:29:12 +01:00
proto_tcp.c BUG/MINOR: rules: Increment be_counters if backend is assigned for a silent-drop 2020-03-06 15:36:04 +01:00
proto_udp.c BUG/MEDIUM: proto_udp/threads: recv() and send() must not be exclusive. 2019-12-10 19:09:15 +01:00
proto_uxst.c MINOR: tcp/uxst/sockpair: only ask for I/O when really waiting for a connect() 2020-03-04 19:29:12 +01:00
protocol.c BUG/MEDIUM: protocols: add a global lock for the init/deinit stuff 2019-07-24 16:45:02 +02:00
proxy.c MEDIUM: checks: Add a list of vars to set before executing a tpc-check ruleset 2020-04-27 09:39:37 +02:00
queue.c MINOR: sample: make sample_parse_expr() able to return an end pointer 2020-02-14 19:02:06 +01:00
raw_sock.c CLEANUP: assorted typo fixes in the code and comments 2020-03-31 17:09:35 +02:00
regex.c MEDIUM: regex: modify regex_comp() to atomically allocate/free the my_regex struct 2019-05-07 06:58:15 +02:00
ring.c MINOR: ring: make the parse function automatically set the handler/release 2019-11-15 15:48:12 +01:00
sample.c MINOR: sample: Add digest and hmac converters 2020-05-12 10:08:11 +02:00
server.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
session.c MAJOR: checks: Implement HTTP check using tcp-check rules 2020-04-27 09:39:38 +02:00
sha1.c BUILD: use inttypes.h instead of stdint.h 2019-04-01 07:44:56 +02:00
shctx.c BUG/MEDIUM: shctx: make sure to keep all blocks aligned 2020-02-21 13:45:58 +01:00
signal.c BUG/MEDIUM: wdt: Don't ignore WDTSIG and DEBUGSIG in __signal_process_queue(). 2020-03-18 13:10:05 +01:00
sink.c MINOR: ring: make the parse function automatically set the handler/release 2019-11-15 15:48:12 +01:00
ssl_sock.c MINOR: sample: Move aes_gcm_dec implementation into sample.c 2020-05-12 10:08:11 +02:00
standard.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
stats.c BUG/MINOR: http: make url_decode() optionally convert '+' to SP 2020-04-23 20:03:27 +02:00
stick_table.c CLEANUP: assorted typo fixes in the code and comments 2020-04-16 10:04:36 +02:00
stream.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
stream_interface.c CLEANUP: assorted typo fixes in the code and comments 2020-04-02 16:25:45 +02:00
task.c CLEANUP: assorted typo fixes in the code and comments 2020-04-17 09:37:36 +02:00
tcp_rules.c MINOR: sample: make sample_parse_expr() able to return an end pointer 2020-02-14 19:02:06 +01:00
time.c BUILD: remove obsolete support for -mregparm / USE_REGPARM 2020-02-25 07:41:47 +01:00
trace.c BUG/MEDIUM: trace: fix a typo causing an incorrect startup error 2019-11-25 19:47:22 +01:00
uri_auth.c MINOR: stats: replace the ST_* uri_auth flags with STAT_* 2019-10-10 11:30:07 +02:00
vars.c MINOR: checks: Use the check as origin when a session is created 2020-04-27 09:39:38 +02:00
version.c MINOR: version: make the version strings variables, not constants 2019-10-16 09:56:57 +02:00
wdt.c MINOR: wdt: Move the definitions of WDTSIG and DEBUGSIG into types/signal.h. 2020-03-18 13:07:19 +01:00
wurfl.c CLEANUP: assorted typo fixes in the code and comments 2020-05-11 10:11:29 +02:00
xprt_handshake.c BUG/MINOR: connection/debug: do not enforce !event_type on subscribe() anymore 2020-03-05 07:46:33 +01:00
xxhash.c BUILD: use inttypes.h instead of stdint.h 2019-04-01 07:44:56 +02:00