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