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
> 


Reply via email to