mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-12 14:31:00 +01:00
BUG/MINOR: signals/poller: set the poller timeout to 0 when there are signals
When receiving a signal before entering the poller, and without any
activity in the process, the poller will be entered with a timeout
calculated without checking the signals.
Since commit 4f59d3 ("MINOR: time: increase the minimum wakeup interval
to 60s") the issue is much more visible because it could be stuck for
60s.
When in mworker mode, if a worker quits and the SIGCHLD signal deliver
at the right time to the master, this one could be stuck for the time of
the timeout.
This should fix issue #1841
Must be backported in every stable version.
This commit is contained in:
parent
e86bc35672
commit
43c891dda0
@ -222,8 +222,10 @@ static void _do_poll(struct poller *p, int exp, int wake)
|
||||
thread_idle_now();
|
||||
thread_harmless_now();
|
||||
|
||||
/* now let's wait for polled events */
|
||||
wait_time = wake ? 0 : compute_poll_timeout(exp);
|
||||
/* Now let's wait for polled events.
|
||||
* Check if the signal queue is not empty in case we received a signal
|
||||
* before entering the loop, so we don't wait MAX_DELAY_MS for nothing */
|
||||
wait_time = (wake | signal_queue_len) ? 0 : compute_poll_timeout(exp);
|
||||
clock_entering_poll();
|
||||
do {
|
||||
int timeout = (global.tune.options & GTUNE_BUSY_POLLING) ? 0 : wait_time;
|
||||
|
||||
@ -178,10 +178,10 @@ static void _do_poll(struct poller *p, int exp, int wake)
|
||||
thread_idle_now();
|
||||
thread_harmless_now();
|
||||
|
||||
/*
|
||||
* Determine how long to wait for events to materialise on the port.
|
||||
*/
|
||||
wait_time = wake ? 0 : compute_poll_timeout(exp);
|
||||
/* Now let's wait for polled events.
|
||||
* Check if the signal queue is not empty in case we received a signal
|
||||
* before entering the loop, so we don't wait MAX_DELAY_MS for nothing */
|
||||
wait_time = (wake | signal_queue_len) ? 0 : compute_poll_timeout(exp);
|
||||
clock_entering_poll();
|
||||
|
||||
do {
|
||||
|
||||
@ -166,8 +166,10 @@ static void _do_poll(struct poller *p, int exp, int wake)
|
||||
}
|
||||
fd_nbupdt = 0;
|
||||
|
||||
/* now let's wait for events */
|
||||
wait_time = wake ? 0 : compute_poll_timeout(exp);
|
||||
/* Now let's wait for polled events.
|
||||
* Check if the signal queue is not empty in case we received a signal
|
||||
* before entering the loop, so we don't wait MAX_DELAY_MS for nothing */
|
||||
wait_time = (wake | signal_queue_len) ? 0 : compute_poll_timeout(exp);
|
||||
fd = global.tune.maxpollevents;
|
||||
clock_entering_poll();
|
||||
|
||||
|
||||
@ -22,6 +22,7 @@
|
||||
#include <haproxy/clock.h>
|
||||
#include <haproxy/fd.h>
|
||||
#include <haproxy/global.h>
|
||||
#include <haproxy/signal.h>
|
||||
#include <haproxy/task.h>
|
||||
#include <haproxy/ticks.h>
|
||||
|
||||
@ -203,8 +204,10 @@ static void _do_poll(struct poller *p, int exp, int wake)
|
||||
}
|
||||
}
|
||||
|
||||
/* now let's wait for events */
|
||||
wait_time = wake ? 0 : compute_poll_timeout(exp);
|
||||
/* Now let's wait for polled events.
|
||||
* Check if the signal queue is not empty in case we received a signal
|
||||
* before entering the loop, so we don't wait MAX_DELAY_MS for nothing */
|
||||
wait_time = (wake | signal_queue_len) ? 0 : compute_poll_timeout(exp);
|
||||
clock_entering_poll();
|
||||
status = poll(poll_events, nbfd, wait_time);
|
||||
clock_update_date(wait_time, status);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user