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