mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-29 08:02:08 +00:00
BUG/MINOR: deinit/threads: make hard-stop-after perform a clean exit
As reported in GH issue #99, when hard-stop-after triggers and threads are in use, the chance that any thread releases the resources in use by the other ones is non-null. Thus no thread should be allowed to deinit() nor exit by itself. Here we take a different approach. We simply use a 3rd possible value for the "killed" variable so that all threads know they must break out of the run-poll-loop and immediately stop. This patch was tested by commenting the stream_shutdown() calls in hard_stop() to increase the chances to see a stream use released resources. With this fix applied, it never crashes anymore. This fix should be backported to 1.9 and 1.8.
This commit is contained in:
parent
76824a8c99
commit
7067b3a92e
@ -233,7 +233,7 @@ extern const int zero;
|
||||
extern const int one;
|
||||
extern const struct linger nolinger;
|
||||
extern int stopping; /* non zero means stopping in progress */
|
||||
extern int killed; /* non zero means a hard-stop is triggered */
|
||||
extern int killed; /* >0 means a hard-stop is triggered, >1 means hard-stop immediately */
|
||||
extern char hostname[MAX_HOSTNAME_LEN];
|
||||
extern char localpeer[MAX_HOSTNAME_LEN];
|
||||
extern struct list global_listener_queue; /* list of the temporarily limited listeners */
|
||||
|
@ -2524,6 +2524,10 @@ static void run_poll_loop()
|
||||
if ((jobs - unstoppable_jobs) == 0)
|
||||
break;
|
||||
|
||||
/* also stop if we failed to cleanly stop all tasks */
|
||||
if (killed > 1)
|
||||
break;
|
||||
|
||||
/* expire immediately if events are pending */
|
||||
wake = 1;
|
||||
if (fd_cache_mask & tid_bit)
|
||||
|
@ -1071,9 +1071,9 @@ struct task *hard_stop(struct task *t, void *context, unsigned short state)
|
||||
if (killed) {
|
||||
ha_warning("Some tasks resisted to hard-stop, exiting now.\n");
|
||||
send_log(NULL, LOG_WARNING, "Some tasks resisted to hard-stop, exiting now.\n");
|
||||
/* Do some cleanup and explicitly quit */
|
||||
deinit();
|
||||
exit(0);
|
||||
killed = 2;
|
||||
t->expire = TICK_ETERNITY;
|
||||
return t;
|
||||
}
|
||||
|
||||
ha_warning("soft-stop running for too long, performing a hard-stop.\n");
|
||||
|
Loading…
Reference in New Issue
Block a user