Hi Pieter, CCing Emeric since these parts have changed a bit for threads and there may be some subtle things we oversee.
thanks for this! Willy On Wed, Dec 06, 2017 at 02:11:53AM +0100, PiBa-NL wrote: > Hi List, Simon and Baptiste, > > Sending to both of you guys as its both tcp-check and email related and you > are the maintainers of those parts. > Patch subject+content basically says it all (i hope.). > > It is intended to fixes yesterdays report: > https://www.mail-archive.com/haproxy@formilux.org/msg28158.html > > Please let me know if it is OK, or should be done differently. > > Thanks in advance, > PiBa-NL / Pieter > From bf80b0398c08f94bebec30feaaddda422cb87ba1 Mon Sep 17 00:00:00 2001 > From: PiBa-NL <pba_...@yahoo.com> > Date: Wed, 6 Dec 2017 01:35:43 +0100 > Subject: [PATCH] BUG/MEDIUM: email-alert: don't set server check status from a > email-alert task > > This avoids possible 100% cpu usage deadlock on a EMAIL_ALERTS_LOCK and > avoids sending lots of emails when 'option log-health-checks' is used. > It is avoided to change the server state and possibly queue a new email while > processing the email alert by checking if the check task is being processed > for the process_email_alert struct. > > This needs to be backported to 1.8. > --- > src/checks.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/src/checks.c b/src/checks.c > index eaf84a2..55bfde2 100644 > --- a/src/checks.c > +++ b/src/checks.c > @@ -72,6 +72,7 @@ static int tcpcheck_main(struct check *); > > static struct pool_head *pool_head_email_alert = NULL; > static struct pool_head *pool_head_tcpcheck_rule = NULL; > +static struct task *process_email_alert(struct task *t); > > > static const struct check_status check_statuses[HCHK_STATUS_SIZE] = { > @@ -198,6 +199,9 @@ const char *get_analyze_status(short analyze_status) { > */ > static void set_server_check_status(struct check *check, short status, const > char *desc) > { > + if (check->task->process == process_email_alert) > + return; // email alerts should not change the status of the > server > + > struct server *s = check->server; > short prev_status = check->status; > int report = 0; > -- > 2.10.1.windows.1 >