Hi Pieter, I'm CCing Christopher, he did some test on your patch.
R, Emeric On 12/06/2017 07:06 AM, Willy Tarreau wrote: > 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 >> >